mirror of https://github.com/XTLS/Xray-core
				
				
				
			Improve configuration detector (cone or symmetric)
							parent
							
								
									43eb5d1b25
								
							
						
					
					
						commit
						ee15cc253f
					
				|  | @ -136,6 +136,7 @@ func NewAlwaysOnInboundHandler(ctx context.Context, tag string, receiverConfig * | |||
| 					uplinkCounter:   uplinkCounter, | ||||
| 					downlinkCounter: downlinkCounter, | ||||
| 					stream:          mss, | ||||
| 					ctx:             ctx, | ||||
| 				} | ||||
| 				h.workers = append(h.workers, worker) | ||||
| 			} | ||||
|  |  | |||
|  | @ -156,6 +156,7 @@ func (h *DynamicInboundHandler) refresh() error { | |||
| 				uplinkCounter:   uplinkCounter, | ||||
| 				downlinkCounter: downlinkCounter, | ||||
| 				stream:          h.streamSettings, | ||||
| 				ctx:             h.ctx, | ||||
| 			} | ||||
| 			if err := worker.Start(); err != nil { | ||||
| 				newError("failed to create UDP worker").Base(err).AtWarning().WriteToLog() | ||||
|  |  | |||
|  | @ -239,6 +239,9 @@ type udpWorker struct { | |||
| 
 | ||||
| 	checker    *task.Periodic | ||||
| 	activeConn map[connID]*udpConn | ||||
| 
 | ||||
| 	ctx  context.Context | ||||
| 	cone bool | ||||
| } | ||||
| 
 | ||||
| func (w *udpWorker) getConnection(id connID) (*udpConn, bool) { | ||||
|  | @ -279,7 +282,7 @@ func (w *udpWorker) callback(b *buf.Buffer, source net.Destination, originalDest | |||
| 		src: source, | ||||
| 	} | ||||
| 	if originalDest.IsValid() { | ||||
| 		if !buf.Cone { | ||||
| 		if !w.cone { | ||||
| 			id.dest = originalDest | ||||
| 		} | ||||
| 		b.UDP = &originalDest | ||||
|  | @ -360,6 +363,8 @@ func (w *udpWorker) Start() error { | |||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	w.cone = w.ctx.Value("cone").(bool) | ||||
| 
 | ||||
| 	w.checker = &task.Periodic{ | ||||
| 		Interval: time.Minute, | ||||
| 		Execute:  w.clean, | ||||
|  |  | |||
|  | @ -14,8 +14,6 @@ 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.
 | ||||
|  |  | |||
							
								
								
									
										30
									
								
								core/xray.go
								
								
								
								
							
							
						
						
									
										30
									
								
								core/xray.go
								
								
								
								
							|  | @ -3,8 +3,13 @@ package core | |||
| import ( | ||||
| 	"context" | ||||
| 	"reflect" | ||||
| 	"runtime/debug" | ||||
| 	"strings" | ||||
| 	"sync" | ||||
| 
 | ||||
| 	"github.com/golang/protobuf/proto" | ||||
| 
 | ||||
| 	"github.com/xtls/xray-core/app/proxyman" | ||||
| 	"github.com/xtls/xray-core/common" | ||||
| 	"github.com/xtls/xray-core/common/serial" | ||||
| 	"github.com/xtls/xray-core/features" | ||||
|  | @ -179,6 +184,31 @@ func NewWithContext(ctx context.Context, config *Config) (*Instance, error) { | |||
| } | ||||
| 
 | ||||
| func initInstanceWithConfig(config *Config, server *Instance) (bool, error) { | ||||
| 	cone := true | ||||
| 	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" { | ||||
| 			t = true | ||||
| 			var m proxyman.SenderConfig | ||||
| 			proto.Unmarshal(outbound.SenderSettings.Value, &m) | ||||
| 			if m.MultiplexSettings != nil && m.MultiplexSettings.Enabled { | ||||
| 				cone = false | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	if v && !t { | ||||
| 		cone = false | ||||
| 	} | ||||
| 	server.ctx = context.WithValue(server.ctx, "cone", cone) | ||||
| 	defer debug.FreeOSMemory() | ||||
| 
 | ||||
| 	if config.Transport != nil { | ||||
| 		features.PrintDeprecatedFeatureWarning("global transport settings") | ||||
| 	} | ||||
|  |  | |||
							
								
								
									
										24
									
								
								main/run.go
								
								
								
								
							
							
						
						
									
										24
									
								
								main/run.go
								
								
								
								
							|  | @ -14,10 +14,6 @@ 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" | ||||
|  | @ -185,26 +181,6 @@ 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) | ||||
|  |  | |||
|  | @ -24,6 +24,7 @@ type Server struct { | |||
| 	config        *ServerConfig | ||||
| 	user          *protocol.MemoryUser | ||||
| 	policyManager policy.Manager | ||||
| 	cone          bool | ||||
| } | ||||
| 
 | ||||
| // NewServer create a new Shadowsocks server.
 | ||||
|  | @ -42,6 +43,7 @@ func NewServer(ctx context.Context, config *ServerConfig) (*Server, error) { | |||
| 		config:        config, | ||||
| 		user:          mUser, | ||||
| 		policyManager: v.GetFeature(policy.ManagerType()).(policy.Manager), | ||||
| 		cone:          ctx.Value("cone").(bool), | ||||
| 	} | ||||
| 
 | ||||
| 	return s, nil | ||||
|  | @ -144,7 +146,7 @@ func (s *Server) handlerUDPPayload(ctx context.Context, conn internet.Connection | |||
| 
 | ||||
| 			data.UDP = &destination | ||||
| 
 | ||||
| 			if !buf.Cone || dest == nil { | ||||
| 			if !s.cone || dest == nil { | ||||
| 				dest = &destination | ||||
| 			} | ||||
| 
 | ||||
|  |  | |||
|  | @ -26,6 +26,7 @@ import ( | |||
| type Server struct { | ||||
| 	config        *ServerConfig | ||||
| 	policyManager policy.Manager | ||||
| 	cone          bool | ||||
| } | ||||
| 
 | ||||
| // NewServer creates a new Server object.
 | ||||
|  | @ -34,6 +35,7 @@ func NewServer(ctx context.Context, config *ServerConfig) (*Server, error) { | |||
| 	s := &Server{ | ||||
| 		config:        config, | ||||
| 		policyManager: v.GetFeature(policy.ManagerType()).(policy.Manager), | ||||
| 		cone:          ctx.Value("cone").(bool), | ||||
| 	} | ||||
| 	return s, nil | ||||
| } | ||||
|  | @ -261,7 +263,7 @@ func (s *Server) handleUDPPayload(ctx context.Context, conn internet.Connection, | |||
| 
 | ||||
| 			payload.UDP = &destination | ||||
| 
 | ||||
| 			if !buf.Cone || dest == nil { | ||||
| 			if !s.cone || dest == nil { | ||||
| 				dest = &destination | ||||
| 			} | ||||
| 
 | ||||
|  |  | |||
|  | @ -47,6 +47,7 @@ type Server struct { | |||
| 	policyManager policy.Manager | ||||
| 	validator     *Validator | ||||
| 	fallbacks     map[string]map[string]*Fallback // or nil
 | ||||
| 	cone          bool | ||||
| } | ||||
| 
 | ||||
| // NewServer creates a new trojan inbound handler.
 | ||||
|  | @ -67,6 +68,7 @@ func NewServer(ctx context.Context, config *ServerConfig) (*Server, error) { | |||
| 	server := &Server{ | ||||
| 		policyManager: v.GetFeature(policy.ManagerType()).(policy.Manager), | ||||
| 		validator:     validator, | ||||
| 		cone:          ctx.Value("cone").(bool), | ||||
| 	} | ||||
| 
 | ||||
| 	if config.Fallbacks != nil { | ||||
|  | @ -293,7 +295,7 @@ func (s *Server) handleUDPPayload(ctx context.Context, clientReader *PacketReade | |||
| 			} | ||||
| 			newError("tunnelling request to ", destination).WriteToLog(session.ExportIDToError(ctx)) | ||||
| 
 | ||||
| 			if !buf.Cone || dest == nil { | ||||
| 			if !s.cone || dest == nil { | ||||
| 				dest = &destination | ||||
| 			} | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 RPRX
						RPRX