This commit is contained in:
Fangliding
2026-06-17 20:27:26 +08:00
parent df25e33ab3
commit b4cfe4f122
2 changed files with 13 additions and 7 deletions
+3 -4
View File
@@ -196,9 +196,6 @@ func (s *ServerSession) handshake5(nMethod byte, reader io.Reader, writer net.Co
var tempUDPConn *TempUDPConn
//nolint:gocritic // Use if else chain for clarity
if request.Command == protocol.RequestCommandUDP {
if request.Address.Family().IsDomain() {
return nil, nil, errors.New("domain name in UDP associate is illegal")
}
if s.config.Address != nil {
// Use configured IP as remote address in the response to UDP Associate
responseAddress = s.config.Address.AsAddress()
@@ -212,7 +209,9 @@ func (s *ServerSession) handshake5(nMethod byte, reader io.Reader, writer net.Co
}
responsePort = net.Port(udpHub.LocalAddr().(*net.UDPAddr).Port)
expectedRemote := &gonet.UDPAddr{}
if request.Address.IP().IsUnspecified() {
// if request address is a domain(udp associate should not have request domain)
// treat it as unspecified
if request.Address.Family().IsDomain() || request.Address.IP().IsUnspecified() {
expectedRemote.IP = writer.RemoteAddr().(*net.TCPAddr).IP // unix?
} else {
expectedRemote.IP = request.Address.IP()
+10 -3
View File
@@ -4,6 +4,7 @@ import (
"context"
goerrors "errors"
"io"
"sync"
"time"
"github.com/xtls/xray-core/common"
@@ -216,18 +217,24 @@ func (s *Server) handleUDPPayload(ctx context.Context, conn stat.Connection, dis
defer udpServer.RemoveRay()
inbound := session.InboundFromContext(ctx)
if inbound != nil && inbound.Source.IsValid() {
errors.LogInfo(ctx, "client UDP connection from ", inbound.Source)
}
var dest *net.Destination
reader := buf.NewPacketReader(conn)
var changeRemote sync.Once
for {
mpayload, err := reader.ReadMultiBuffer()
if err != nil {
return err
}
changeRemote.Do(func() {
if inbound != nil {
// change source to real remote UDP address
inbound.Source = net.DestinationFromAddr(conn.RemoteAddr())
inbound.Local = net.DestinationFromAddr(conn.LocalAddr())
errors.LogInfo(ctx, "client UDP connection from ", inbound.Source)
}
})
for _, payload := range mpayload {
request, err := DecodeUDPPacket(payload)