@@ -43,6 +43,8 @@ type Driver struct {
4343 Volumes []string
4444 Networks []string
4545 UsePrivateNetwork bool
46+ DisablePublic4 bool
47+ DisablePublic6 bool
4648 Firewalls []string
4749 ServerLabels map [string ]string
4850 keyLabels map [string ]string
@@ -69,6 +71,9 @@ const (
6971 flagVolumes = "hetzner-volumes"
7072 flagNetworks = "hetzner-networks"
7173 flagUsePrivateNetwork = "hetzner-use-private-network"
74+ flagDisablePublic4 = "hetzner-disable-public-4"
75+ flagDisablePublic6 = "hetzner-disable-public-6"
76+ flagDisablePublic = "hetzner-disable-public"
7277 flagFirewalls = "hetzner-firewalls"
7378 flagAdditionalKeys = "hetzner-additional-key"
7479 flagServerLabel = "hetzner-server-label"
@@ -171,6 +176,21 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag {
171176 Name : flagUsePrivateNetwork ,
172177 Usage : "Use private network" ,
173178 },
179+ mcnflag.BoolFlag {
180+ EnvVar : "HETZNER_DISABLE_PUBLIC_4" ,
181+ Name : flagDisablePublic4 ,
182+ Usage : "Disable public ipv4" ,
183+ },
184+ mcnflag.BoolFlag {
185+ EnvVar : "HETZNER_DISABLE_PUBLIC_6" ,
186+ Name : flagDisablePublic6 ,
187+ Usage : "Disable public ipv6" ,
188+ },
189+ mcnflag.BoolFlag {
190+ EnvVar : "HETZNER_DISABLE_PUBLIC" ,
191+ Name : flagDisablePublic ,
192+ Usage : "Disable public ip (v4 & v6)" ,
193+ },
174194 mcnflag.StringSliceFlag {
175195 EnvVar : "HETZNER_FIREWALLS" ,
176196 Name : flagFirewalls ,
@@ -235,7 +255,10 @@ func (d *Driver) SetConfigFromFlags(opts drivers.DriverOptions) error {
235255 d .userData = opts .String (flagUserData )
236256 d .Volumes = opts .StringSlice (flagVolumes )
237257 d .Networks = opts .StringSlice (flagNetworks )
238- d .UsePrivateNetwork = opts .Bool (flagUsePrivateNetwork )
258+ disablePublic := opts .Bool (flagDisablePublic )
259+ d .UsePrivateNetwork = opts .Bool (flagUsePrivateNetwork ) || disablePublic
260+ d .DisablePublic4 = opts .Bool (flagDisablePublic4 ) || disablePublic
261+ d .DisablePublic6 = opts .Bool (flagDisablePublic6 ) || disablePublic
239262 d .Firewalls = opts .StringSlice (flagFirewalls )
240263 d .AdditionalKeys = opts .StringSlice (flagAdditionalKeys )
241264
@@ -265,6 +288,11 @@ func (d *Driver) SetConfigFromFlags(opts drivers.DriverOptions) error {
265288 return errors .Errorf ("--%v and --%v are mutually exclusive" , flagImage , flagImageID )
266289 }
267290
291+ if d .DisablePublic4 && d .DisablePublic6 && ! d .UsePrivateNetwork {
292+ return errors .Errorf ("--%v must be used if public networking is disabled (hint: implicitly set by --%v)" ,
293+ flagUsePrivateNetwork , flagDisablePublic )
294+ }
295+
268296 return nil
269297}
270298
@@ -415,6 +443,18 @@ func (d *Driver) configureNetworkAccess(srv hcloud.ServerCreateResult) error {
415443 }
416444 time .Sleep (1 * time .Second )
417445 }
446+ } else if d .DisablePublic4 {
447+ log .Infof ("Using public IPv6 network ..." )
448+
449+ pv6 := srv .Server .PublicNet .IPv6
450+ ip := pv6 .IP
451+ if ip .Mask (pv6 .Network .Mask ).Equal (pv6 .Network .IP ) { // no host given
452+ ip [net .IPv6len - 1 ] |= 0x01 // TODO make this configurable
453+ }
454+
455+ ips := ip .String ()
456+ log .Infof (" -> resolved %v ..." , ips )
457+ d .IPAddress = ips
418458 } else {
419459 log .Infof ("Using public network ..." )
420460 d .IPAddress = srv .Server .PublicNet .IPv4 .IP .String ()
@@ -451,6 +491,13 @@ func (d *Driver) makeCreateServerOptions() (*hcloud.ServerCreateOpts, error) {
451491 PlacementGroup : pgrp ,
452492 }
453493
494+ if d .DisablePublic4 || d .DisablePublic6 {
495+ srvopts .PublicNet = & hcloud.ServerCreatePublicNet {
496+ EnableIPv4 : ! d .DisablePublic4 ,
497+ EnableIPv6 : ! d .DisablePublic6 ,
498+ }
499+ }
500+
454501 networks , err := d .createNetworks ()
455502 if err != nil {
456503 return nil , err
0 commit comments