From 540b9070f5bc0e67a04341f11bde598153957b91 Mon Sep 17 00:00:00 2001 From: Maksim Varentsov Date: Thu, 27 Aug 2026 23:46:26 +0200 Subject: [PATCH] Transport: Bind the UDP outbound socket in the destination family (#6688) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://github.com/XTLS/Xray-core/pull/6688#issuecomment-5445559197 Completes https://github.com/XTLS/Xray-core/pull/6624#issuecomment-5430488664 --------- Co-authored-by: 风扇滑翔翼 --- transport/internet/system_dialer.go | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/transport/internet/system_dialer.go b/transport/internet/system_dialer.go index 05adc778a..b80e9a295 100644 --- a/transport/internet/system_dialer.go +++ b/transport/internet/system_dialer.go @@ -50,18 +50,24 @@ func (d *DefaultSystemDialer) Dial(ctx context.Context, src net.Address, dest ne errors.LogDebug(ctx, "dialing to "+dest.String()) if dest.Network == net.Network_UDP { - srcAddr := resolveSrcAddr(net.Network_UDP, src) - if srcAddr == nil { - srcAddr = &net.UDPAddr{ - IP: []byte{0, 0, 0, 0}, - Port: 0, - } - } - var lc net.ListenConfig destAddr, err := net.ResolveUDPAddr("udp", dest.NetAddr()) if err != nil { return nil, err } + srcAddr := resolveSrcAddr(net.Network_UDP, src) + if srcAddr == nil { + // some OS don't support mapped IPv4 dual stack + // and need to select 0.0.0.0 or [::] manually based on the destination + wildcard := net.AnyIP.IP() + if destAddr.IP.To4() == nil { + wildcard = net.AnyIPv6.IP() + } + srcAddr = &net.UDPAddr{ + IP: wildcard, + Port: 0, + } + } + var lc net.ListenConfig lc.Control = func(network, address string, c syscall.RawConn) error { for _, ctl := range Controllers { if err := ctl(network, address, c); err != nil {