Skip to content

Commit d8eda9a

Browse files
authored
Merge pull request #4221 from jandubois/must-be-zero
Change default for GuestIPMustBeZero when GuestIP is 0.0.0.0
2 parents 883c441 + bdd8ed5 commit d8eda9a

File tree

8 files changed

+90
-35
lines changed

8 files changed

+90
-35
lines changed

hack/test-port-forwarding.pl

Lines changed: 55 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -303,16 +303,19 @@ sub JoinHostPort {
303303
ignore: true
304304
305305
- guestIP: 0.0.0.0
306+
guestIPMustBeZero: false
306307
guestPortRange: [3010, 3019]
307308
hostPortRange: [2010, 2019]
308309
ignore: true
309310
310311
- guestIP: 0.0.0.0
312+
guestIPMustBeZero: false
311313
guestPortRange: [3000, 3029]
312314
hostPortRange: [2000, 2029]
313315
314316
# The following rule is completely shadowed by the previous one and has no effect
315317
- guestIP: 0.0.0.0
318+
guestIPMustBeZero: false
316319
guestPortRange: [3020, 3029]
317320
hostPortRange: [2020, 2029]
318321
ignore: true
@@ -323,7 +326,7 @@ sub JoinHostPort {
323326
# Blocking 127.0.0.2 cannot block forwarding from 0.0.0.0
324327
# forward: 0.0.0.0 3002 → 127.0.0.1 2002
325328
326-
# Blocking 0.0.0.0 will block forwarding from any interface
329+
# Blocking 0.0.0.0 will block forwarding from any interface because guestIPMustBeZero is false
327330
# ignore: 0.0.0.0 3010
328331
# ignore: 127.0.0.1 3011
329332
@@ -344,14 +347,41 @@ sub JoinHostPort {
344347
# forward: :: 3032 → ipv4 2032
345348
# forward: ::1 3033 → ipv4 2033
346349
347-
- guestPortRange: [300, 309]
350+
- guestPortRange: [300, 304]
348351
349-
# forward: 127.0.0.1 300 → 127.0.0.1 300
352+
# forward: 127.0.0.1 300 → 127.0.0.1 300
353+
# forward: 0.0.0.0 301 → 127.0.0.1 301
354+
# forward: :: 302 → 127.0.0.1 302
355+
# forward: ::1 303 → 127.0.0.1 303
356+
# ignore: 192.168.5.15 304 → 127.0.0.1 304
350357
351-
- guestPortRange: [310, 319]
358+
- guestPortRange: [305, 309]
359+
guestIPMustBeZero: false
360+
361+
# forward: 127.0.0.1 325 → 127.0.0.1 325
362+
# forward: 0.0.0.0 326 → 127.0.0.1 326
363+
# forward: :: 327 → 127.0.0.1 327
364+
# forward: ::1 328 → 127.0.0.1 328
365+
# ignore: 192.168.5.15 329 → 127.0.0.1 329
366+
367+
- guestPortRange: [310, 314]
368+
hostIP: 0.0.0.0
369+
370+
# forward: 127.0.0.1 310 → 0.0.0.0 310
371+
# forward: 0.0.0.0 311 → 0.0.0.0 311
372+
# forward: :: 312 → 0.0.0.0 312
373+
# forward: ::1 313 → 0.0.0.0 313
374+
# ignore: 192.168.5.15 314 → 0.0.0.0 314
375+
376+
- guestPortRange: [315, 319]
377+
guestIPMustBeZero: false
352378
hostIP: 0.0.0.0
353379
354-
# forward: 127.0.0.1 310 → 0.0.0.0 310
380+
# forward: 127.0.0.1 315 → 0.0.0.0 315
381+
# forward: 0.0.0.0 316 → 0.0.0.0 316
382+
# forward: :: 317 → 0.0.0.0 317
383+
# forward: ::1 318 → 0.0.0.0 318
384+
# ignore: 192.168.5.15 319 → 0.0.0.0 319
355385
356386
# Things we can't test:
357387
# - Accessing a forward from a different interface (e.g. connect to ipv4 to connect to 0.0.0.0)
@@ -382,6 +412,7 @@ sub JoinHostPort {
382412
# forward: ::1 4025 → ipv4 4025
383413
384414
- guestIP: "0.0.0.0"
415+
guestIPMustBeZero: false
385416
guestPortRange: [4030, 4039]
386417
hostIP: "ipv4"
387418
@@ -396,6 +427,7 @@ sub JoinHostPort {
396427
guestPortRange: [4040, 4049]
397428
398429
- guestIP: "0.0.0.0"
430+
guestIPMustBeZero: false
399431
guestPortRange: [4040, 4049]
400432
ignore: true
401433
@@ -414,4 +446,21 @@ sub JoinHostPort {
414446
- guestPort: 5000
415447
hostSocket: port5000.sock
416448
417-
# forward: 127.0.0.1 5000 → sockDir/port5000.sock
449+
# forward: 127.0.0.1 5000 → sockDir/port5000.sock
450+
451+
- guestPort: 5001
452+
hostSocket: port5001.sock
453+
454+
# ignore: 192.168.5.15 5001 → sockDir/port5001.sock
455+
456+
- guestPort: 5002
457+
guestIPMustBeZero: false
458+
hostSocket: port5002.sock
459+
460+
# forward: 127.0.0.1 5002 → sockDir/port5002.sock
461+
462+
- guestPort: 5003
463+
guestIPMustBeZero: false
464+
hostSocket: port5003.sock
465+
466+
# ignore: 192.168.5.15 5003 → sockDir/port5003.sock

pkg/hostagent/port.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ func (pf *portForwarder) forwardingAddresses(guest *api.IPPort) (hostAddr, guest
6969
case guestIP.IsUnspecified():
7070
case guestIP.Equal(rule.GuestIP):
7171
case guestIP.Equal(net.IPv6loopback) && rule.GuestIP.Equal(IPv4loopback1):
72-
case rule.GuestIP.IsUnspecified() && !rule.GuestIPMustBeZero:
72+
case rule.GuestIP.IsUnspecified() && !*rule.GuestIPMustBeZero:
7373
// When GuestIPMustBeZero is true, then 0.0.0.0 must be an exact match, which is already
7474
// handled above by the guest.IP.IsUnspecified() condition.
7575
default:

pkg/limatype/lima_yaml.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ const (
285285
)
286286

287287
type PortForward struct {
288-
GuestIPMustBeZero bool `yaml:"guestIPMustBeZero,omitempty" json:"guestIPMustBeZero,omitempty"`
288+
GuestIPMustBeZero *bool `yaml:"guestIPMustBeZero,omitempty" json:"guestIPMustBeZero,omitempty"`
289289
GuestIP net.IP `yaml:"guestIP,omitempty" json:"guestIP,omitempty"`
290290
GuestPort int `yaml:"guestPort,omitempty" json:"guestPort,omitempty"`
291291
GuestPortRange [2]int `yaml:"guestPortRange,omitempty" json:"guestPortRange,omitempty"`

pkg/limayaml/defaults.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -882,12 +882,15 @@ func FillPortForwardDefaults(rule *limatype.PortForward, instDir string, user li
882882
rule.Proto = limatype.ProtoAny
883883
}
884884
if rule.GuestIP == nil {
885-
if rule.GuestIPMustBeZero {
885+
if rule.GuestIPMustBeZero != nil && *rule.GuestIPMustBeZero {
886886
rule.GuestIP = net.IPv4zero
887887
} else {
888888
rule.GuestIP = IPv4loopback1
889889
}
890890
}
891+
if rule.GuestIPMustBeZero == nil {
892+
rule.GuestIPMustBeZero = ptr.Of(rule.GuestIP.Equal(net.IPv4zero))
893+
}
891894
if rule.HostIP == nil {
892895
rule.HostIP = IPv4loopback1
893896
}

pkg/limayaml/defaults_test.go

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -124,12 +124,13 @@ func TestFillDefault(t *testing.T) {
124124
}
125125

126126
defaultPortForward := limatype.PortForward{
127-
GuestIP: IPv4loopback1,
128-
GuestPortRange: [2]int{1, 65535},
129-
HostIP: IPv4loopback1,
130-
HostPortRange: [2]int{1, 65535},
131-
Proto: limatype.ProtoAny,
132-
Reverse: false,
127+
GuestIP: IPv4loopback1,
128+
GuestIPMustBeZero: ptr.Of(false),
129+
GuestPortRange: [2]int{1, 65535},
130+
HostIP: IPv4loopback1,
131+
HostPortRange: [2]int{1, 65535},
132+
Proto: limatype.ProtoAny,
133+
Reverse: false,
133134
}
134135

135136
// ------------------------------------------------------------------------------------
@@ -386,13 +387,14 @@ func TestFillDefault(t *testing.T) {
386387
net.ParseIP("1.1.1.1"),
387388
},
388389
PortForwards: []limatype.PortForward{{
389-
GuestIP: IPv4loopback1,
390-
GuestPort: 80,
391-
GuestPortRange: [2]int{80, 80},
392-
HostIP: IPv4loopback1,
393-
HostPort: 80,
394-
HostPortRange: [2]int{80, 80},
395-
Proto: limatype.ProtoTCP,
390+
GuestIP: IPv4loopback1,
391+
GuestIPMustBeZero: ptr.Of(false),
392+
GuestPort: 80,
393+
GuestPortRange: [2]int{80, 80},
394+
HostIP: IPv4loopback1,
395+
HostPort: 80,
396+
HostPortRange: [2]int{80, 80},
397+
Proto: limatype.ProtoTCP,
396398
}},
397399
CopyToHost: []limatype.CopyToHost{{}},
398400
Env: map[string]string{
@@ -599,13 +601,14 @@ func TestFillDefault(t *testing.T) {
599601
net.ParseIP("2.2.2.2"),
600602
},
601603
PortForwards: []limatype.PortForward{{
602-
GuestIP: IPv4loopback1,
603-
GuestPort: 88,
604-
GuestPortRange: [2]int{88, 88},
605-
HostIP: IPv4loopback1,
606-
HostPort: 8080,
607-
HostPortRange: [2]int{8080, 8080},
608-
Proto: limatype.ProtoTCP,
604+
GuestIP: IPv4loopback1,
605+
GuestIPMustBeZero: ptr.Of(false),
606+
GuestPort: 88,
607+
GuestPortRange: [2]int{88, 88},
608+
HostIP: IPv4loopback1,
609+
HostPort: 8080,
610+
HostPortRange: [2]int{8080, 8080},
611+
Proto: limatype.ProtoTCP,
609612
}},
610613
CopyToHost: []limatype.CopyToHost{{}},
611614
Env: map[string]string{

pkg/limayaml/validate.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ func Validate(y *limatype.LimaYAML, warn bool) error {
285285
}
286286
for i, rule := range y.PortForwards {
287287
field := fmt.Sprintf("portForwards[%d]", i)
288-
if rule.GuestIPMustBeZero && !rule.GuestIP.Equal(net.IPv4zero) {
288+
if *rule.GuestIPMustBeZero && !rule.GuestIP.Equal(net.IPv4zero) {
289289
errs = errors.Join(errs, fmt.Errorf("field `%s.guestIPMustBeZero` can only be true when field `%s.guestIP` is 0.0.0.0", field, field))
290290
}
291291
if rule.GuestPort != 0 {

pkg/portfwd/forward.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,9 @@ func (fw *Forwarder) forwardingAddresses(guest *api.IPPort) (hostAddr, guestAddr
8383
case guestIP.IsUnspecified():
8484
case guestIP.Equal(rule.GuestIP):
8585
case guestIP.Equal(net.IPv6loopback) && rule.GuestIP.Equal(IPv4loopback1):
86-
case rule.GuestIP.IsUnspecified() && !rule.GuestIPMustBeZero:
86+
case rule.GuestIP.IsUnspecified() && !*rule.GuestIPMustBeZero:
8787
// When GuestIPMustBeZero is true, then 0.0.0.0 must be an exact match, which is already
88-
// handled above by the guest.IP.IsUnspecified() condition.
88+
// handled above by the guestIP.IsUnspecified() condition.
8989
default:
9090
continue
9191
}

templates/default.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -491,9 +491,9 @@ networks:
491491
# ignore: true # don't forward these ports (guestPortRange, in this case 1-65535)
492492
#
493493
# - guestPort: 7443
494-
# guestIP: "0.0.0.0" # Will match *any* interface
495-
# guestIPMustBeZero: true # Restrict matching to 0.0.0.0 binds only
496-
# hostIP: "0.0.0.0" # Forwards to 0.0.0.0, exposing it externally
494+
# guestIP: "0.0.0.0" # Will match *any* interface
495+
# guestIPMustBeZero: false # 0.0.0.0 matches any bound interface, not just 0.0.0.0 itself
496+
# hostIP: "0.0.0.0" # Forwards to 0.0.0.0, exposing it externally
497497
#
498498
# - guestSocket: "/run/user/{{.UID}}/my.sock"
499499
# hostSocket: mysocket

0 commit comments

Comments
 (0)