From 8edf471c9f422b2cf7c58738b51be8c1020e0d3e 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 17:24:53 +0000 Subject: [PATCH] Freedom: Cache UDP resolve result --- proxy/freedom/freedom.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/proxy/freedom/freedom.go b/proxy/freedom/freedom.go index 779992f7..14a16afe 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.Address } func (w *PacketWriter) WriteMultiBuffer(mb buf.MultiBuffer) error { @@ -365,9 +371,14 @@ func (w *PacketWriter) WriteMultiBuffer(mb buf.MultiBuffer) error { b.UDP.Port = w.UDPOverride.Port } if w.Handler.config.hasStrategy() && b.UDP.Address.Family().IsDomain() { + if ip := w.resolvedUDPAddr[b.UDP.Address.Domain()]; ip != nil { + b.UDP.Address = ip + } + } else { ip := w.Handler.resolveIP(w.Context, b.UDP.Address.Domain(), nil) if ip != nil { b.UDP.Address = ip + w.resolvedUDPAddr[b.UDP.Address.Domain()] = ip } } destAddr, _ := net.ResolveUDPAddr("udp", b.UDP.NetAddr())