From d38529b016cba0ca4bf85cd6254eaf685585131f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A3=8E=E6=89=87=E6=BB=91=E7=BF=94=E7=BF=BC?= Date: Sat, 28 Jun 2025 11:57:12 +0000 Subject: [PATCH] Also handle ASIS and apply force strategy --- proxy/freedom/freedom.go | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/proxy/freedom/freedom.go b/proxy/freedom/freedom.go index 8584791c..2893cc2e 100644 --- a/proxy/freedom/freedom.go +++ b/proxy/freedom/freedom.go @@ -18,6 +18,7 @@ import ( "github.com/xtls/xray-core/common/session" "github.com/xtls/xray-core/common/signal" "github.com/xtls/xray-core/common/task" + "github.com/xtls/xray-core/common/utils" "github.com/xtls/xray-core/core" "github.com/xtls/xray-core/features/dns" "github.com/xtls/xray-core/features/policy" @@ -27,7 +28,6 @@ import ( "github.com/xtls/xray-core/transport/internet" "github.com/xtls/xray-core/transport/internet/stat" "github.com/xtls/xray-core/transport/internet/tls" - "github.com/xtls/xray-core/common/utils" ) var useSplice bool @@ -381,11 +381,26 @@ func (w *PacketWriter) WriteMultiBuffer(mb buf.MultiBuffer) error { if w.UDPOverride.Port != 0 { b.UDP.Port = w.UDPOverride.Port } - if w.Handler.config.hasStrategy() && b.UDP.Address.Family().IsDomain() { + if b.UDP.Address.Family().IsDomain() { if ip, ok := w.resolvedUDPAddr.Load(b.UDP.Address.Domain()); ok { b.UDP.Address = ip } else { - ip := w.Handler.resolveIP(w.Context, b.UDP.Address.Domain(), nil) + ShouldUseSystemResolver := true + if w.Handler.config.hasStrategy() { + ip = w.Handler.resolveIP(w.Context, b.UDP.Address.Domain(), nil) + if ip != nil { + ShouldUseSystemResolver = false + } + // drop packet if resolve failed when forceIP + if ip == nil && w.Handler.config.forceIP() { + b.Release() + continue + } + } + if ShouldUseSystemResolver { + udpAddr, _ := net.ResolveUDPAddr("udp", b.UDP.NetAddr()) + ip = net.IPAddress(udpAddr.IP) + } if ip != nil { b.UDP.Address, _ = w.resolvedUDPAddr.LoadOrStore(b.UDP.Address.Domain(), ip) }