diff --git a/chain.go b/chain.go index f98b781..59b0c95 100644 --- a/chain.go +++ b/chain.go @@ -212,6 +212,13 @@ func (c *Chain) dialWithOptions(ctx context.Context, network, address string, op IP: ip, } } + } else if inboundIP != nil && strings.ToLower(network) == "udp" { + ip := inboundIP.(net.IP) + if !ip.IsLoopback() && !ip.IsPrivate() { + d.LocalAddr = &net.UDPAddr{ + IP: ip, + } + } } return d.DialContext(ctx, network, ipAddr) } diff --git a/dns.go b/dns.go index 1b02404..6575846 100644 --- a/dns.go +++ b/dns.go @@ -83,7 +83,11 @@ func (h *dnsHandler) Handle(conn net.Conn) { if resolver == nil { resolver = defaultResolver } - reply, err := resolver.Exchange(context.Background(), b[:n]) + ctx := context.Background() + if inboundAddr, ok := conn.LocalAddr().(*net.TCPAddr); ok { + ctx = context.WithValue(ctx, "InboundIP", inboundAddr.IP) + } + reply, err := resolver.Exchange(ctx, b[:n]) if err != nil { log.Logf("[dns] %s - %s exchange: %v", conn.RemoteAddr(), conn.LocalAddr(), err) return