Skip to content

Commit 4d04ff3

Browse files
committed
Change default for GuestIPMustBeZero when GuestIP is 0.0.0.0
It now defaults to `true`. The user must explicitly set it to false to match any interface and not just 0.0.0.0. The existing tests have been amended to explicitly set GuestIPMustBeZero to `false` to continue testing the old behaviour. This change is not backwards compatible! Signed-off-by: Jan Dubois <jan.dubois@suse.com>
1 parent 1152d87 commit 4d04ff3

File tree

8 files changed

+41
-30
lines changed

8 files changed

+41
-30
lines changed

hack/test-port-forwarding.pl

Lines changed: 6 additions & 1 deletion
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
@@ -382,6 +385,7 @@ sub JoinHostPort {
382385
# forward: ::1 4025 → ipv4 4025
383386
384387
- guestIP: "0.0.0.0"
388+
guestIPMustBeZero: false
385389
guestPortRange: [4030, 4039]
386390
hostIP: "ipv4"
387391
@@ -396,6 +400,7 @@ sub JoinHostPort {
396400
guestPortRange: [4040, 4049]
397401
398402
- guestIP: "0.0.0.0"
403+
guestIPMustBeZero: false
399404
guestPortRange: [4040, 4049]
400405
ignore: true
401406

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)