From 618be14c7baa8fa851205e89bc28902aabf39ce5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Mon, 17 Feb 2025 21:56:07 +0800 Subject: [PATCH] Fix generate darwin rules --- tun_darwin.go | 64 +++++++++++++++++++++++++------------------------ tun_rules.go | 66 ++++++++++++++++++++++++++++++++------------------- 2 files changed, 74 insertions(+), 56 deletions(-) diff --git a/tun_darwin.go b/tun_darwin.go index e887ce8..a0dd54a 100644 --- a/tun_darwin.go +++ b/tun_darwin.go @@ -268,45 +268,47 @@ func (t *NativeTun) UpdateRouteOptions(tunOptions Options) error { } func (t *NativeTun) setRoutes() error { - if t.options.AutoRoute && t.options.FileDescriptor == 0 { + if t.options.FileDescriptor == 0 { routeRanges, err := t.options.BuildAutoRouteRanges(false) if err != nil { return err } - gateway4, gateway6 := t.options.Inet4GatewayAddr(), t.options.Inet6GatewayAddr() - for _, destination := range routeRanges { - var gateway netip.Addr - if destination.Addr().Is4() { - gateway = gateway4 - } else { - gateway = gateway6 - } - var interfaceIndex int - if t.options.InterfaceScope { - iff, err := t.options.InterfaceFinder.ByName(t.options.Name) - if err != nil { - return err - } - interfaceIndex = iff.Index - } - err = execRoute(unix.RTM_ADD, t.options.InterfaceScope, interfaceIndex, destination, gateway) - if err != nil { - if errors.Is(err, unix.EEXIST) { - err = execRoute(unix.RTM_DELETE, false, 0, destination, gateway) - if err != nil { - return E.Cause(err, "remove existing route: ", destination) - } - err = execRoute(unix.RTM_ADD, t.options.InterfaceScope, interfaceIndex, destination, gateway) - if err != nil { - return E.Cause(err, "re-add route: ", destination) - } + if len(routeRanges) > 0 { + gateway4, gateway6 := t.options.Inet4GatewayAddr(), t.options.Inet6GatewayAddr() + for _, destination := range routeRanges { + var gateway netip.Addr + if destination.Addr().Is4() { + gateway = gateway4 } else { - return E.Cause(err, "add route: ", destination) + gateway = gateway6 + } + var interfaceIndex int + if t.options.InterfaceScope { + iff, err := t.options.InterfaceFinder.ByName(t.options.Name) + if err != nil { + return err + } + interfaceIndex = iff.Index + } + err = execRoute(unix.RTM_ADD, t.options.InterfaceScope, interfaceIndex, destination, gateway) + if err != nil { + if errors.Is(err, unix.EEXIST) { + err = execRoute(unix.RTM_DELETE, false, 0, destination, gateway) + if err != nil { + return E.Cause(err, "remove existing route: ", destination) + } + err = execRoute(unix.RTM_ADD, t.options.InterfaceScope, interfaceIndex, destination, gateway) + if err != nil { + return E.Cause(err, "re-add route: ", destination) + } + } else { + return E.Cause(err, "add route: ", destination) + } } } + flushDNSCache() + t.routeSet = true } - flushDNSCache() - t.routeSet = true } return nil } diff --git a/tun_rules.go b/tun_rules.go index 93b0430..c1b983f 100644 --- a/tun_rules.go +++ b/tun_rules.go @@ -108,7 +108,7 @@ const autoRouteUseSubRanges = runtime.GOOS == "darwin" func (o *Options) BuildAutoRouteRanges(underNetworkExtension bool) ([]netip.Prefix, error) { var routeRanges []netip.Prefix - if o.AutoRoute && len(o.Inet4Address) > 0 { + if len(o.Inet4Address) > 0 { var inet4Ranges []netip.Prefix if len(o.Inet4RouteAddress) > 0 { inet4Ranges = o.Inet4RouteAddress @@ -119,19 +119,27 @@ func (o *Options) BuildAutoRouteRanges(underNetworkExtension bool) ([]netip.Pref } } } - } else if autoRouteUseSubRanges && !underNetworkExtension { - inet4Ranges = []netip.Prefix{ - netip.PrefixFrom(netip.AddrFrom4([4]byte{0: 1}), 8), - netip.PrefixFrom(netip.AddrFrom4([4]byte{0: 2}), 7), - netip.PrefixFrom(netip.AddrFrom4([4]byte{0: 4}), 6), - netip.PrefixFrom(netip.AddrFrom4([4]byte{0: 8}), 5), - netip.PrefixFrom(netip.AddrFrom4([4]byte{0: 16}), 4), - netip.PrefixFrom(netip.AddrFrom4([4]byte{0: 32}), 3), - netip.PrefixFrom(netip.AddrFrom4([4]byte{0: 64}), 2), - netip.PrefixFrom(netip.AddrFrom4([4]byte{0: 128}), 1), + } else if o.AutoRoute { + if autoRouteUseSubRanges && !underNetworkExtension { + inet4Ranges = []netip.Prefix{ + netip.PrefixFrom(netip.AddrFrom4([4]byte{0: 1}), 8), + netip.PrefixFrom(netip.AddrFrom4([4]byte{0: 2}), 7), + netip.PrefixFrom(netip.AddrFrom4([4]byte{0: 4}), 6), + netip.PrefixFrom(netip.AddrFrom4([4]byte{0: 8}), 5), + netip.PrefixFrom(netip.AddrFrom4([4]byte{0: 16}), 4), + netip.PrefixFrom(netip.AddrFrom4([4]byte{0: 32}), 3), + netip.PrefixFrom(netip.AddrFrom4([4]byte{0: 64}), 2), + netip.PrefixFrom(netip.AddrFrom4([4]byte{0: 128}), 1), + } + } else { + inet4Ranges = []netip.Prefix{netip.PrefixFrom(netip.IPv4Unspecified(), 0)} + } + } else if runtime.GOOS == "darwin" { + for _, address := range o.Inet4Address { + if address.Bits() < 32 { + inet4Ranges = append(inet4Ranges, address.Masked()) + } } - } else { - inet4Ranges = []netip.Prefix{netip.PrefixFrom(netip.IPv4Unspecified(), 0)} } if len(o.Inet4RouteExcludeAddress) == 0 { routeRanges = append(routeRanges, inet4Ranges...) @@ -161,19 +169,27 @@ func (o *Options) BuildAutoRouteRanges(underNetworkExtension bool) ([]netip.Pref } } } - } else if autoRouteUseSubRanges && !underNetworkExtension { - inet6Ranges = []netip.Prefix{ - netip.PrefixFrom(netip.AddrFrom16([16]byte{0: 1}), 8), - netip.PrefixFrom(netip.AddrFrom16([16]byte{0: 2}), 7), - netip.PrefixFrom(netip.AddrFrom16([16]byte{0: 4}), 6), - netip.PrefixFrom(netip.AddrFrom16([16]byte{0: 8}), 5), - netip.PrefixFrom(netip.AddrFrom16([16]byte{0: 16}), 4), - netip.PrefixFrom(netip.AddrFrom16([16]byte{0: 32}), 3), - netip.PrefixFrom(netip.AddrFrom16([16]byte{0: 64}), 2), - netip.PrefixFrom(netip.AddrFrom16([16]byte{0: 128}), 1), + } else if o.AutoRoute { + if autoRouteUseSubRanges && !underNetworkExtension { + inet6Ranges = []netip.Prefix{ + netip.PrefixFrom(netip.AddrFrom16([16]byte{0: 1}), 8), + netip.PrefixFrom(netip.AddrFrom16([16]byte{0: 2}), 7), + netip.PrefixFrom(netip.AddrFrom16([16]byte{0: 4}), 6), + netip.PrefixFrom(netip.AddrFrom16([16]byte{0: 8}), 5), + netip.PrefixFrom(netip.AddrFrom16([16]byte{0: 16}), 4), + netip.PrefixFrom(netip.AddrFrom16([16]byte{0: 32}), 3), + netip.PrefixFrom(netip.AddrFrom16([16]byte{0: 64}), 2), + netip.PrefixFrom(netip.AddrFrom16([16]byte{0: 128}), 1), + } + } else { + inet6Ranges = []netip.Prefix{netip.PrefixFrom(netip.IPv6Unspecified(), 0)} + } + } else if runtime.GOOS == "darwin" { + for _, address := range o.Inet6Address { + if address.Bits() < 32 { + inet6Ranges = append(inet6Ranges, address.Masked()) + } } - } else { - inet6Ranges = []netip.Prefix{netip.PrefixFrom(netip.IPv6Unspecified(), 0)} } if len(o.Inet6RouteExcludeAddress) == 0 { routeRanges = append(routeRanges, inet6Ranges...)