diff --git a/pkg/ipmatch/match.go b/pkg/ipmatch/match.go index 8682e10351..234596d898 100644 --- a/pkg/ipmatch/match.go +++ b/pkg/ipmatch/match.go @@ -247,17 +247,22 @@ func LookupExtIface(ifname string, ifregexS string, ifcanreach string, ipStack i return nil, fmt.Errorf("failed to find IPv6 address for interface %s", iface.Name) } ifaceV6Addr = ifaceV6Addrs[0] - } else if ipStack == dualStack && ifaceAddr == nil && ifaceV6Addr == nil { - ifaceAddrs, err = ip.GetInterfaceIP4Addrs(iface) - if err != nil || len(ifaceAddrs) == 0 { - return nil, fmt.Errorf("failed to find IPv4 address for interface %s", iface.Name) + } else if ipStack == dualStack { + if ifaceAddr == nil { + ifaceAddrs, err = ip.GetInterfaceIP4Addrs(iface) + if err != nil || len(ifaceAddrs) == 0 { + return nil, fmt.Errorf("failed to find IPv4 address for interface %s", iface.Name) + } + ifaceAddr = ifaceAddrs[0] } - ifaceAddr = ifaceAddrs[0] - ifaceV6Addrs, err = ip.GetInterfaceIP6Addrs(iface) - if err != nil || len(ifaceV6Addrs) == 0 { - return nil, fmt.Errorf("failed to find IPv6 address for interface %s", iface.Name) + + if ifaceV6Addr == nil { + ifaceV6Addrs, err = ip.GetInterfaceIP6Addrs(iface) + if err != nil || len(ifaceV6Addrs) == 0 { + return nil, fmt.Errorf("failed to find IPv6 address for interface %s", iface.Name) + } + ifaceV6Addr = ifaceV6Addrs[0] } - ifaceV6Addr = ifaceV6Addrs[0] } if ifaceAddr != nil { diff --git a/pkg/ipmatch/match_test.go b/pkg/ipmatch/match_test.go index bfeb648542..54ec0ca94d 100644 --- a/pkg/ipmatch/match_test.go +++ b/pkg/ipmatch/match_test.go @@ -37,6 +37,7 @@ func TestLookupExtIface(t *testing.T) { execOrFail("sudo", "ip", "addr", "add", "172.16.30.18", "dev", "dummy0") execOrFail("sudo", "ip", "addr", "add", "172.16.31.200", "dev", "dummy0") execOrFail("sudo", "ip", "addr", "add", "172.16.32.100", "dev", "dummy0") + execOrFail("sudo", "ip", "addr", "add", "2001:db8::1/64", "dev", "dummy0") execOrFail("sudo", "ip", "link", "set", "dummy0", "up") execOrFail("sudo", "ip", "route", "add", "172.16.32.254", "via", "172.16.32.100", "dev", "dummy0") @@ -105,6 +106,24 @@ func TestLookupExtIface(t *testing.T) { } }) + t.Run("ByIPv4DualStack", func(t *testing.T) { + backendInterface, err := LookupExtIface("172.16.30.18", "", "", dualStack, PublicIPOpts{}) + if err != nil { + t.Fatal(err) + } + t.Logf("backendInterface=%+v iface=%+v", backendInterface, *backendInterface.Iface) + + if backendInterface.Iface.Name != "dummy0" { + t.Fatalf("iface name not equal, expected=%v actual=%v", "dummy0", backendInterface.Iface.Name) + } + if backendInterface.IfaceAddr.String() != "172.16.30.18" { + t.Fatalf("iface addr not equal, expected=%v actual=%v", "172.16.30.18", backendInterface.IfaceAddr.String()) + } + if backendInterface.IfaceV6Addr.String() != "2001:db8::1/64" { + t.Fatalf("iface addr not equal, expected=%v actual=%v", "2001:db8::1/64", backendInterface.IfaceV6Addr.String()) + } + }) + t.Run("ByIfRegexMatchPublicIPv4", func(t *testing.T) { expectedIfaceName := "dummy0" expectedIP := "172.16.30.18"