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 {