From 1457f83530a3d386f49c29c1bb0e846e6350e11a Mon Sep 17 00:00:00 2001 From: wwqgtxx Date: Tue, 18 Jun 2024 13:12:44 +0800 Subject: [PATCH] fix: dns server using direct outbound lookback resolve problem --- adapter/outbound/direct.go | 4 ++++ component/dialer/dialer.go | 6 +++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/adapter/outbound/direct.go b/adapter/outbound/direct.go index c904d3b6..7114045d 100644 --- a/adapter/outbound/direct.go +++ b/adapter/outbound/direct.go @@ -64,6 +64,10 @@ func (d *Direct) ListenPacketContext(ctx context.Context, metadata *C.Metadata, return d.loopBack.NewPacketConn(newPacketConn(pc, d)), nil } +func (d *Direct) IsL3Protocol(metadata *C.Metadata) bool { + return true // tell DNSDialer don't send domain to DialContext, avoid lookback to DefaultResolver +} + func NewDirectWithOption(option DirectOption) *Direct { return &Direct{ Base: &Base{ diff --git a/component/dialer/dialer.go b/component/dialer/dialer.go index c21e638e..54a1aa6a 100644 --- a/component/dialer/dialer.go +++ b/component/dialer/dialer.go @@ -378,12 +378,12 @@ func (d Dialer) DialContext(ctx context.Context, network, address string) (net.C } func (d Dialer) ListenPacket(ctx context.Context, network, address string, rAddrPort netip.AddrPort) (net.PacketConn, error) { - opt := WithOption(d.Opt) + opt := d.Opt // make a copy if rAddrPort.Addr().Unmap().IsLoopback() { // avoid "The requested address is not valid in its context." - opt = WithInterface("") + WithInterface("")(&opt) } - return ListenPacket(ctx, ParseNetwork(network, rAddrPort.Addr()), address, rAddrPort, opt) + return ListenPacket(ctx, ParseNetwork(network, rAddrPort.Addr()), address, rAddrPort, WithOption(opt)) } func NewDialer(options ...Option) Dialer {