From 719676519d33c56d2163cb1f2cb9cb8788bb16a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Fri, 17 Jul 2026 23:46:07 +0800 Subject: [PATCH] Fix bind control for auto redirect --- common/dialer/default.go | 7 ++++++- route/network.go | 8 +------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/common/dialer/default.go b/common/dialer/default.go index b1115644..1c8ad71b 100644 --- a/common/dialer/default.go +++ b/common/dialer/default.go @@ -382,7 +382,12 @@ func (d *DefaultDialer) ListenSerialInterfacePacket(ctx context.Context, destina } func (d *DefaultDialer) UDPListenerControl() (control.Func, bool) { - return d.udpListener.Control, d.autoDetectBindFunc != nil && d.netns == "" + egressEnabled := d.autoDetectBindFunc != nil && d.netns == "" + listenerControl := d.udpListener.Control + if egressEnabled && d.networkManager.AutoRedirectOutputMark() != 0 { + listenerControl = control.Append(listenerControl, control.UnbindFromInterface()) + } + return listenerControl, egressEnabled } func (d *DefaultDialer) trackConn(conn net.Conn, err error) (net.Conn, error) { diff --git a/route/network.go b/route/network.go index 9f65ee92..4fbcf22e 100644 --- a/route/network.go +++ b/route/network.go @@ -353,7 +353,7 @@ func (r *NetworkManager) AutoDetectInterfaceFunc() control.Func { if r.interfaceMonitor == nil { return nil } - bindFunc := control.BindToInterfaceFunc(r.interfaceFinder, func(network string, address string) (interfaceName string, interfaceIndex int, err error) { + return control.BindToInterfaceFunc(r.interfaceFinder, func(network string, address string) (interfaceName string, interfaceIndex int, err error) { remoteAddr := M.ParseSocksaddr(address).Addr if remoteAddr.IsValid() { iif, err := r.interfaceFinder.ByAddr(remoteAddr) @@ -367,12 +367,6 @@ func (r *NetworkManager) AutoDetectInterfaceFunc() control.Func { } return defaultInterface.Name, defaultInterface.Index, nil }) - return func(network, address string, conn syscall.RawConn) error { - if r.autoRedirectOutputMark != 0 { - return nil - } - return bindFunc(network, address, conn) - } } }