From d7c70d1a72224d57938982d8e45bd3e00b1661ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Wed, 8 Jul 2026 19:06:49 +0800 Subject: [PATCH] dialer: Fix auto_detect_interface for UDP connections --- common/dialer/default.go | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/common/dialer/default.go b/common/dialer/default.go index 4ffe00c1a..ccdfbafbb 100644 --- a/common/dialer/default.go +++ b/common/dialer/default.go @@ -36,6 +36,7 @@ type DefaultDialer struct { udpAddr4 string udpAddr6 string netns string + autoDetectBindFunc control.Func connectionManager adapter.ConnectionManager networkManager adapter.NetworkManager networkStrategy *C.NetworkStrategy @@ -60,6 +61,7 @@ func NewDefault(ctx context.Context, options option.DialerOptions) (*DefaultDial networkType []C.InterfaceType fallbackNetworkType []C.InterfaceType networkFallbackDelay time.Duration + autoDetectBindFunc control.Func ) if networkManager != nil { interfaceFinder = networkManager.InterfaceFinder() @@ -119,6 +121,7 @@ func NewDefault(ctx context.Context, options option.DialerOptions) (*DefaultDial bindFunc := networkManager.AutoDetectInterfaceFunc() dialer.Control = control.Append(dialer.Control, bindFunc) listener.Control = control.Append(listener.Control, bindFunc) + autoDetectBindFunc = bindFunc } } if options.RoutingMark == 0 && defaultOptions.RoutingMark != 0 { @@ -213,6 +216,7 @@ func NewDefault(ctx context.Context, options option.DialerOptions) (*DefaultDial udpAddr4: udpAddr4, udpAddr6: udpAddr6, netns: options.NetNs, + autoDetectBindFunc: autoDetectBindFunc, connectionManager: connectionManager, networkManager: networkManager, networkStrategy: networkStrategy, @@ -317,12 +321,18 @@ func (d *DefaultDialer) DialParallelInterface(ctx context.Context, network strin func (d *DefaultDialer) ListenPacket(ctx context.Context, destination M.Socksaddr) (net.PacketConn, error) { if d.networkStrategy == nil { return d.trackPacketConn(listener.ListenNetworkNamespace[net.PacketConn](d.netns, func() (net.PacketConn, error) { + listenConfig := d.udpListener + if d.autoDetectBindFunc != nil && destination.Addr.IsValid() { + listenConfig.Control = control.Append(listenConfig.Control, func(network, address string, conn syscall.RawConn) error { + return d.autoDetectBindFunc(network, destination.String(), conn) + }) + } if destination.IsIPv6() { - return d.udpListener.ListenPacket(ctx, N.NetworkUDP, d.udpAddr6) + return listenConfig.ListenPacket(ctx, N.NetworkUDP, d.udpAddr6) } else if destination.IsIPv4() && !destination.Addr.IsUnspecified() { - return d.udpListener.ListenPacket(ctx, N.NetworkUDP+"4", d.udpAddr4) + return listenConfig.ListenPacket(ctx, N.NetworkUDP+"4", d.udpAddr4) } else { - return d.udpListener.ListenPacket(ctx, N.NetworkUDP, d.udpAddr4) + return listenConfig.ListenPacket(ctx, N.NetworkUDP, d.udpAddr4) } })) } else {