diff --git a/client/internal/networkmonitor/monitor_windows.go b/client/internal/networkmonitor/monitor_windows.go index 19697bcc07..405ef41455 100644 --- a/client/internal/networkmonitor/monitor_windows.go +++ b/client/internal/networkmonitor/monitor_windows.go @@ -101,11 +101,14 @@ func routeChanged(nexthop systemops.Nexthop, intf *net.Interface, routes map[net if r, ok := routes[unspec]; ok { if r.Nexthop != nexthop.IP || compareIntf(r.Interface, intf) != 0 { - intf := "" + oldIntf, newIntf := "", "" + if intf != nil { + oldIntf = intf.Name + } if r.Interface != nil { - intf = r.Interface.Name + newIntf = r.Interface.Name } - log.Infof("network monitor: default route changed: %s via %s (%s)", r.Destination, r.Nexthop, intf) + log.Infof("network monitor: default route changed: %s from %s (%s) to %s (%s)", r.Destination, nexthop.IP, oldIntf, nexthop.IP, newIntf) return true } } else { diff --git a/client/internal/routemanager/systemops/systemops_bsd.go b/client/internal/routemanager/systemops/systemops_bsd.go index eb7b7a03dc..b7fb554db2 100644 --- a/client/internal/routemanager/systemops/systemops_bsd.go +++ b/client/internal/routemanager/systemops/systemops_bsd.go @@ -92,7 +92,7 @@ func toNetIP(a route.Addr) netip.Addr { case *route.Inet6Addr: ip := netip.AddrFrom16(t.IP) if t.ZoneID != 0 { - ip.WithZone(strconv.Itoa(t.ZoneID)) + ip = ip.WithZone(strconv.Itoa(t.ZoneID)) } return ip default: diff --git a/client/internal/routemanager/systemops/systemops_generic.go b/client/internal/routemanager/systemops/systemops_generic.go index c2db523697..0d1c16ca1f 100644 --- a/client/internal/routemanager/systemops/systemops_generic.go +++ b/client/internal/routemanager/systemops/systemops_generic.go @@ -356,7 +356,7 @@ func GetNextHop(ip netip.Addr) (Nexthop, error) { return Nexthop{}, fmt.Errorf("convert preferred source to address: %w", err) } return Nexthop{ - IP: addr.Unmap(), + IP: addr, Intf: intf, }, nil } @@ -380,12 +380,12 @@ func ipToAddr(ip net.IP, intf *net.Interface) (netip.Addr, error) { } if intf != nil && (addr.IsLinkLocalMulticast() || addr.IsLinkLocalUnicast()) { - log.Tracef("Adding zone %s to address %s", intf.Name, addr) + zone := intf.Name if runtime.GOOS == "windows" { - addr = addr.WithZone(strconv.Itoa(intf.Index)) - } else { - addr = addr.WithZone(intf.Name) + zone = strconv.Itoa(intf.Index) } + log.Tracef("Adding zone %s to address %s", zone, addr) + addr = addr.WithZone(zone) } return addr.Unmap(), nil diff --git a/client/internal/routemanager/systemops/systemops_windows.go b/client/internal/routemanager/systemops/systemops_windows.go index a0b5fb1e51..88bdce7c96 100644 --- a/client/internal/routemanager/systemops/systemops_windows.go +++ b/client/internal/routemanager/systemops/systemops_windows.go @@ -71,7 +71,6 @@ func (r *SysOps) addToRouteTable(prefix netip.Prefix, nexthop Nexthop) error { return fmt.Errorf("invalid zone: %w", err) } nexthop.Intf = &net.Interface{Index: zone} - nexthop.IP.WithZone("") } return addRouteCmd(prefix, nexthop) @@ -80,8 +79,8 @@ func (r *SysOps) addToRouteTable(prefix netip.Prefix, nexthop Nexthop) error { func (r *SysOps) removeFromRouteTable(prefix netip.Prefix, nexthop Nexthop) error { args := []string{"delete", prefix.String()} if nexthop.IP.IsValid() { - nexthop.IP.WithZone("") - args = append(args, nexthop.IP.Unmap().String()) + ip := nexthop.IP.WithZone("") + args = append(args, ip.Unmap().String()) } routeCmd := uspfilter.GetSystem32Command("route") @@ -146,6 +145,10 @@ func GetRoutes() ([]Route, error) { Index: int(entry.InterfaceIndex), Name: entry.InterfaceAlias, } + + if nexthop.Is6() && (nexthop.IsLinkLocalUnicast() || nexthop.IsLinkLocalMulticast()) { + nexthop = nexthop.WithZone(strconv.Itoa(int(entry.InterfaceIndex))) + } } routes = append(routes, Route{ @@ -189,7 +192,8 @@ func addRouteCmd(prefix netip.Prefix, nexthop Nexthop) error { args := []string{"add", prefix.String()} if nexthop.IP.IsValid() { - args = append(args, nexthop.IP.Unmap().String()) + ip := nexthop.IP.WithZone("") + args = append(args, ip.Unmap().String()) } else { addr := "0.0.0.0" if prefix.Addr().Is6() {