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