From 92bfb95bcf5b7f4d9dfad85f198e493eb5b84a6b Mon Sep 17 00:00:00 2001 From: karl Date: Thu, 2 Jan 2025 19:41:31 +0800 Subject: [PATCH] =?UTF-8?q?DNS=E8=A7=A3=E6=9E=90=E6=97=B6=EF=BC=8CTCP=20?= =?UTF-8?q?=E4=BB=8E=E5=93=AA=E4=B8=AA=20IP=20=E8=BF=9B=E6=9D=A5=EF=BC=8C?= =?UTF-8?q?=E5=B0=B1=E4=BB=8E=E5=93=AA=E4=B8=AA=20IP=20=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- chain.go | 7 +++++++ dns.go | 6 +++++- 2 files changed, 12 insertions(+), 1 deletion(-) 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