Pārlūkot izejas kodu

VLESS & VMess are not ready to accept FullCone yet

RPRX 4 gadi atpakaļ
vecāks
revīzija
310a938511

+ 3 - 1
app/proxyman/inbound/worker.go

@@ -279,7 +279,9 @@ func (w *udpWorker) callback(b *buf.Buffer, source net.Destination, originalDest
 		src: source,
 	}
 	if originalDest.IsValid() {
-		//id.dest = originalDest
+		if !buf.Cone {
+			id.dest = originalDest
+		}
 		b.UDP = &originalDest
 	}
 	conn, existing := w.getConnection(id)

+ 2 - 0
common/buf/buffer.go

@@ -14,6 +14,8 @@ const (
 
 var pool = bytespool.GetPool(Size)
 
+var Cone = true
+
 // Buffer is a recyclable allocation of a byte array. Buffer.Release() recycles
 // the buffer into an internal buffer pool, in order to recreate a buffer more
 // quickly.

+ 24 - 0
main/run.go

@@ -13,6 +13,10 @@ import (
 	"strings"
 	"syscall"
 
+	"github.com/golang/protobuf/proto"
+
+	"github.com/xtls/xray-core/app/proxyman"
+	"github.com/xtls/xray-core/common/buf"
 	"github.com/xtls/xray-core/common/cmdarg"
 	"github.com/xtls/xray-core/common/platform"
 	"github.com/xtls/xray-core/core"
@@ -176,6 +180,26 @@ func startXray() (core.Server, error) {
 		return nil, newError("failed to load config files: [", configFiles.String(), "]").Base(err)
 	}
 
+	v, t := false, false
+	for _, outbound := range config.Outbound {
+		s := strings.ToLower(outbound.ProxySettings.Type)
+		l := len(s)
+		if l >= 16 && s[11:16] == "vless" || l >= 16 && s[11:16] == "vmess" {
+			v = true
+			continue
+		}
+		if l >= 17 && s[11:17] == "trojan" || l >= 22 && s[11:22] == "shadowsocks" {
+			var m proxyman.SenderConfig
+			proto.Unmarshal(outbound.SenderSettings.Value, &m)
+			if m.MultiplexSettings == nil || !m.MultiplexSettings.Enabled {
+				t = true
+			}
+		}
+	}
+	if v && !t {
+		buf.Cone = false
+	}
+
 	server, err := core.New(config)
 	if err != nil {
 		return nil, newError("failed to create server").Base(err)

+ 4 - 4
proxy/shadowsocks/server.go

@@ -103,7 +103,7 @@ func (s *Server) handlerUDPPayload(ctx context.Context, conn internet.Connection
 	}
 	inbound.User = s.user
 
-	var dest net.Destination
+	var dest *net.Destination
 
 	reader := buf.NewPacketReader(conn)
 	for {
@@ -144,12 +144,12 @@ func (s *Server) handlerUDPPayload(ctx context.Context, conn internet.Connection
 
 			data.UDP = &destination
 
-			if dest.Network == 0 {
-				dest = request.Destination() // JUST FOLLOW THE FIRST PACKET
+			if !buf.Cone || dest == nil {
+				dest = &destination
 			}
 
 			currentPacketCtx = protocol.ContextWithRequestHeader(currentPacketCtx, request)
-			udpServer.Dispatch(currentPacketCtx, dest, data)
+			udpServer.Dispatch(currentPacketCtx, *dest, data)
 		}
 	}
 

+ 4 - 4
proxy/socks/server.go

@@ -222,7 +222,7 @@ func (s *Server) handleUDPPayload(ctx context.Context, conn internet.Connection,
 		newError("client UDP connection from ", inbound.Source).WriteToLog(session.ExportIDToError(ctx))
 	}
 
-	var dest net.Destination
+	var dest *net.Destination
 
 	reader := buf.NewPacketReader(conn)
 	for {
@@ -260,12 +260,12 @@ func (s *Server) handleUDPPayload(ctx context.Context, conn internet.Connection,
 
 			payload.UDP = &destination
 
-			if dest.Network == 0 {
-				dest = destination // JUST FOLLOW THE FIRST PACKET
+			if !buf.Cone || dest == nil {
+				dest = &destination
 			}
 
 			currentPacketCtx = protocol.ContextWithRequestHeader(currentPacketCtx, request)
-			udpServer.Dispatch(currentPacketCtx, dest, payload)
+			udpServer.Dispatch(currentPacketCtx, *dest, payload)
 		}
 	}
 }

+ 4 - 4
proxy/trojan/server.go

@@ -256,7 +256,7 @@ func (s *Server) handleUDPPayload(ctx context.Context, clientReader *PacketReade
 	inbound := session.InboundFromContext(ctx)
 	user := inbound.User
 
-	var dest net.Destination
+	var dest *net.Destination
 
 	for {
 		select {
@@ -280,12 +280,12 @@ func (s *Server) handleUDPPayload(ctx context.Context, clientReader *PacketReade
 			})
 			newError("tunnelling request to ", p.Target).WriteToLog(session.ExportIDToError(ctx))
 
-			if dest.Network == 0 {
-				dest = p.Target // JUST FOLLOW THE FIRST PACKET
+			if !buf.Cone || dest == nil {
+				dest = &p.Target
 			}
 
 			for _, b := range p.Buffer {
-				udpServer.Dispatch(ctx, dest, b)
+				udpServer.Dispatch(ctx, *dest, b)
 			}
 		}
 	}