diff --git a/redirect_nftables.go b/redirect_nftables.go index f7253cc..3154101 100644 --- a/redirect_nftables.go +++ b/redirect_nftables.go @@ -4,6 +4,7 @@ package tun import ( "net/netip" + "strings" "github.com/sagernet/nftables" "github.com/sagernet/nftables/binaryutil" @@ -298,6 +299,10 @@ func (r *autoRedirect) setupNFTables() error { // TODO: test if this works func (r *autoRedirect) nftablesUpdateLocalAddressSet() error { + err := r.interfaceFinder.Update() + if err != nil { + return err + } newLocalAddresses := common.FlatMap(r.interfaceFinder.Interfaces(), func(it control.Interface) []netip.Prefix { return common.Filter(it.Addresses, func(prefix netip.Prefix) bool { return it.Name == "lo" || prefix.Addr().IsGlobalUnicast() @@ -306,6 +311,11 @@ func (r *autoRedirect) nftablesUpdateLocalAddressSet() error { if slices.Equal(newLocalAddresses, r.localAddresses) { return nil } + if r.logger != nil { + r.logger.Debug("updating local address set to [", strings.Join(common.Map(newLocalAddresses, func(it netip.Prefix) string { + return it.String() + }), ", ")+"]") + } nft, err := nftables.New() if err != nil { return err diff --git a/redirect_nftables_rules.go b/redirect_nftables_rules.go index 08f6baa..fe432f5 100644 --- a/redirect_nftables_rules.go +++ b/redirect_nftables_rules.go @@ -74,12 +74,11 @@ func (r *autoRedirect) nftablesCreateLocalAddressSets( localAddresses4 := common.Filter(localAddresses, func(it netip.Prefix) bool { return it.Addr().Is4() }) - updateAddresses4 := common.Filter(localAddresses, func(it netip.Prefix) bool { - return it.Addr().Is4() - }) var update bool if len(lastAddresses) != 0 { - if !slices.Equal(localAddresses4, updateAddresses4) { + if !slices.Equal(localAddresses4, common.Filter(lastAddresses, func(it netip.Prefix) bool { + return it.Addr().Is4() + })) { update = true } } @@ -94,12 +93,11 @@ func (r *autoRedirect) nftablesCreateLocalAddressSets( localAddresses6 := common.Filter(localAddresses, func(it netip.Prefix) bool { return it.Addr().Is6() }) - updateAddresses6 := common.Filter(localAddresses, func(it netip.Prefix) bool { - return it.Addr().Is6() - }) var update bool if len(lastAddresses) != 0 { - if !slices.Equal(localAddresses6, updateAddresses6) { + if !slices.Equal(localAddresses6, common.Filter(lastAddresses, func(it netip.Prefix) bool { + return it.Addr().Is6() + })) { update = true } }