From 3e2cec87275354c5ccf682c178a6c532690a8f23 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: Tue, 10 Jun 2025 15:41:29 +0000 Subject: [PATCH] Freedom: Cache UDP resolve result --- proxy/freedom/freedom.go | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/proxy/freedom/freedom.go b/proxy/freedom/freedom.go index 779992f7..3455c3c9 100644 --- a/proxy/freedom/freedom.go +++ b/proxy/freedom/freedom.go @@ -346,6 +346,12 @@ type PacketWriter struct { *Handler context.Context UDPOverride net.Destination + + // Dest of udp packets might be a domain, we will resolve them to IP + // But resolver will return a random one if the domain has many IPs + // Resulting in these packets being sent to many different IPs randomly + // So, cache and keep the resolve result + resolvedUDPAddr map[string]*net.UDPAddr } func (w *PacketWriter) WriteMultiBuffer(mb buf.MultiBuffer) error { @@ -364,13 +370,19 @@ 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() { - ip := w.Handler.resolveIP(w.Context, b.UDP.Address.Domain(), nil) - if ip != nil { - b.UDP.Address = ip + var destAddr *net.UDPAddr + if w.resolvedUDPAddr == nil { + if w.Handler.config.hasStrategy() && b.UDP.Address.Family().IsDomain() { + ip := w.Handler.resolveIP(w.Context, b.UDP.Address.Domain(), nil) + if ip != nil { + b.UDP.Address = ip + } } + destAddr, _ = net.ResolveUDPAddr("udp", b.UDP.NetAddr()) + w.resolvedUDPAddr[b.UDP.NetAddr()] = destAddr + } else { + destAddr = w.resolvedUDPAddr[b.UDP.NetAddr()] } - destAddr, _ := net.ResolveUDPAddr("udp", b.UDP.NetAddr()) if destAddr == nil { b.Release() continue