diff --git a/app/internal/socks5/server.go b/app/internal/socks5/server.go
index e451637..9c6ce24 100644
--- a/app/internal/socks5/server.go
+++ b/app/internal/socks5/server.go
@@ -254,7 +254,12 @@ func (s *Server) udpServer(udpConn *net.UDPConn, hyUDP client.HyUDPConn) error {
 					if err != nil {
 						continue
 					}
-					addr = addr[1:] // Remove the leading length byte
+					if atyp == socks5.ATYPDomain {
+						// socks5.ParseAddress adds a leading byte for domains,
+						// but socks5.NewDatagram will add it again as it expects a raw domain.
+						// So we must remove it here.
+						addr = addr[1:]
+					}
 					d := socks5.NewDatagram(atyp, addr, port, bs)
 					_, _ = udpConn.WriteToUDP(d.Bytes(), clientAddr)
 				}
diff --git a/app/internal/socks5/server_test.py b/app/internal/socks5/server_test.py
index 4515561..5dae4d2 100644
--- a/app/internal/socks5/server_test.py
+++ b/app/internal/socks5/server_test.py
@@ -6,33 +6,51 @@ ADDR = "127.0.0.1"
 PORT = 11080
 
 
-def test_tcp(size, count, it):
+def test_tcp(size, count, it, domain=False):
     for i in range(it):
         s = socks.socksocket(socket.AF_INET, socket.SOCK_STREAM)
         s.set_proxy(socks.SOCKS5, ADDR, PORT)
 
-        s.connect(("test_tcp", 12345))
+        if domain:
+            s.connect(("test.tcp.com", 12345))
+        else:
+            s.connect(("1.2.3.4", 12345))
+
         for j in range(count):
             payload = os.urandom(size)
             s.send(payload)
             rsp = s.recv(size)
             assert rsp == payload
+
         s.close()
 
 
-def test_udp(size, count, it):
+def test_udp(size, count, it, domain=False):
     for i in range(it):
         s = socks.socksocket(socket.AF_INET, socket.SOCK_DGRAM)
         s.set_proxy(socks.SOCKS5, ADDR, PORT)
 
         for j in range(count):
             payload = os.urandom(size)
-            s.sendto(payload, ("test_udp", 12345))
+
+            if domain:
+                s.sendto(payload, ("test.udp.com", 12345))
+            else:
+                s.sendto(payload, ("1.2.3.4", 12345))
+
             rsp, addr = s.recvfrom(size)
-            assert rsp == payload and addr == (b"test_udp", 12345)
+            assert rsp == payload
+
+            if domain:
+                assert addr == (b"test.udp.com", 12345)
+            else:
+                assert addr == ("1.2.3.4", 12345)
+
         s.close()
 
 
 if __name__ == "__main__":
-    test_tcp(1024, 1024, 10)
-    test_udp(1024, 1024, 10)
+    test_tcp(1024, 1024, 10, domain=False)
+    test_tcp(1024, 1024, 10, domain=True)
+    test_udp(1024, 1024, 10, domain=False)
+    test_udp(1024, 1024, 10, domain=True)