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())