mirror of https://github.com/v2ray/v2ray-core
				
				
				
			option to allow passive connection
							parent
							
								
									a43ee2f1c2
								
							
						
					
					
						commit
						bcd27ba36f
					
				|  | @ -3,6 +3,7 @@ package dispatcher | |||
| import ( | ||||
| 	"github.com/v2ray/v2ray-core/app" | ||||
| 	v2net "github.com/v2ray/v2ray-core/common/net" | ||||
| 	"github.com/v2ray/v2ray-core/proxy" | ||||
| 	"github.com/v2ray/v2ray-core/transport/ray" | ||||
| ) | ||||
| 
 | ||||
|  | @ -12,5 +13,5 @@ const ( | |||
| 
 | ||||
| // PacketDispatcher dispatch a packet and possibly further network payload to its destination.
 | ||||
| type PacketDispatcher interface { | ||||
| 	DispatchToOutbound(destination v2net.Destination) ray.InboundRay | ||||
| 	DispatchToOutbound(meta *proxy.InboundHandlerMeta, destination v2net.Destination) ray.InboundRay | ||||
| } | ||||
|  |  | |||
|  | @ -4,6 +4,7 @@ import ( | |||
| 	"github.com/v2ray/v2ray-core/app" | ||||
| 	"github.com/v2ray/v2ray-core/app/proxyman" | ||||
| 	"github.com/v2ray/v2ray-core/app/router" | ||||
| 	"github.com/v2ray/v2ray-core/common/alloc" | ||||
| 	"github.com/v2ray/v2ray-core/common/log" | ||||
| 	v2net "github.com/v2ray/v2ray-core/common/net" | ||||
| 	"github.com/v2ray/v2ray-core/proxy" | ||||
|  | @ -42,7 +43,7 @@ func (this *DefaultDispatcher) Release() { | |||
| 
 | ||||
| } | ||||
| 
 | ||||
| func (this *DefaultDispatcher) DispatchToOutbound(destination v2net.Destination) ray.InboundRay { | ||||
| func (this *DefaultDispatcher) DispatchToOutbound(meta *proxy.InboundHandlerMeta, destination v2net.Destination) ray.InboundRay { | ||||
| 	direct := ray.NewRay() | ||||
| 	dispatcher := this.ohm.GetDefaultHandler() | ||||
| 
 | ||||
|  | @ -59,7 +60,11 @@ func (this *DefaultDispatcher) DispatchToOutbound(destination v2net.Destination) | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	go this.FilterPacketAndDispatch(destination, direct, dispatcher) | ||||
| 	if meta.AllowPassiveConnection { | ||||
| 		go dispatcher.Dispatch(destination, alloc.NewLocalBuffer(32).Clear(), direct) | ||||
| 	} else { | ||||
| 		go this.FilterPacketAndDispatch(destination, direct, dispatcher) | ||||
| 	} | ||||
| 
 | ||||
| 	return direct | ||||
| } | ||||
|  |  | |||
|  | @ -2,6 +2,7 @@ package testing | |||
| 
 | ||||
| import ( | ||||
| 	v2net "github.com/v2ray/v2ray-core/common/net" | ||||
| 	"github.com/v2ray/v2ray-core/proxy" | ||||
| 	"github.com/v2ray/v2ray-core/transport/ray" | ||||
| ) | ||||
| 
 | ||||
|  | @ -29,7 +30,7 @@ func NewTestPacketDispatcher(handler func(destination v2net.Destination, traffic | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (this *TestPacketDispatcher) DispatchToOutbound(destination v2net.Destination) ray.InboundRay { | ||||
| func (this *TestPacketDispatcher) DispatchToOutbound(meta *proxy.InboundHandlerMeta, destination v2net.Destination) ray.InboundRay { | ||||
| 	traffic := ray.NewRay() | ||||
| 	this.Destination <- destination | ||||
| 	go this.Handler(destination, traffic) | ||||
|  |  | |||
|  | @ -10,6 +10,7 @@ import ( | |||
| 	"github.com/v2ray/v2ray-core/common/dice" | ||||
| 	"github.com/v2ray/v2ray-core/common/log" | ||||
| 	v2net "github.com/v2ray/v2ray-core/common/net" | ||||
| 	"github.com/v2ray/v2ray-core/proxy" | ||||
| 	"github.com/v2ray/v2ray-core/transport/internet/udp" | ||||
| 
 | ||||
| 	"github.com/miekg/dns" | ||||
|  | @ -49,9 +50,11 @@ type UDPNameServer struct { | |||
| 
 | ||||
| func NewUDPNameServer(address v2net.Destination, dispatcher dispatcher.PacketDispatcher) *UDPNameServer { | ||||
| 	s := &UDPNameServer{ | ||||
| 		address:   address, | ||||
| 		requests:  make(map[uint16]*PendingRequest), | ||||
| 		udpServer: udp.NewUDPServer(dispatcher), | ||||
| 		address:  address, | ||||
| 		requests: make(map[uint16]*PendingRequest), | ||||
| 		udpServer: udp.NewUDPServer(&proxy.InboundHandlerMeta{ | ||||
| 			AllowPassiveConnection: false, | ||||
| 		}, dispatcher), | ||||
| 	} | ||||
| 	return s | ||||
| } | ||||
|  |  | |||
|  | @ -89,7 +89,7 @@ func (this *DokodemoDoor) Start() error { | |||
| } | ||||
| 
 | ||||
| func (this *DokodemoDoor) ListenUDP() error { | ||||
| 	this.udpServer = udp.NewUDPServer(this.packetDispatcher) | ||||
| 	this.udpServer = udp.NewUDPServer(this.meta, this.packetDispatcher) | ||||
| 	udpHub, err := udp.ListenUDP(this.meta.Address, this.meta.Port, this.handleUDPPackets) | ||||
| 	if err != nil { | ||||
| 		log.Error("Dokodemo failed to listen on ", this.meta.Address, ":", this.meta.Port, ": ", err) | ||||
|  | @ -148,7 +148,7 @@ func (this *DokodemoDoor) HandleTCPConnection(conn internet.Connection) { | |||
| 	} | ||||
| 	log.Info("Dokodemo: Handling request to ", dest) | ||||
| 
 | ||||
| 	ray := this.packetDispatcher.DispatchToOutbound(dest) | ||||
| 	ray := this.packetDispatcher.DispatchToOutbound(this.meta, dest) | ||||
| 	defer ray.InboundOutput().Release() | ||||
| 
 | ||||
| 	var inputFinish, outputFinish sync.Mutex | ||||
|  |  | |||
|  | @ -140,7 +140,7 @@ func (this *Server) handleConnect(request *http.Request, destination v2net.Desti | |||
| 	} | ||||
| 	response.Write(writer) | ||||
| 
 | ||||
| 	ray := this.packetDispatcher.DispatchToOutbound(destination) | ||||
| 	ray := this.packetDispatcher.DispatchToOutbound(this.meta, destination) | ||||
| 	this.transport(reader, writer, ray) | ||||
| } | ||||
| 
 | ||||
|  | @ -220,7 +220,7 @@ func (this *Server) handlePlainHTTP(request *http.Request, dest v2net.Destinatio | |||
| 	request.Host = request.URL.Host | ||||
| 	StripHopByHopHeaders(request) | ||||
| 
 | ||||
| 	ray := this.packetDispatcher.DispatchToOutbound(dest) | ||||
| 	ray := this.packetDispatcher.DispatchToOutbound(this.meta, dest) | ||||
| 	defer ray.InboundInput().Close() | ||||
| 	defer ray.InboundOutput().Release() | ||||
| 
 | ||||
|  |  | |||
|  | @ -16,10 +16,11 @@ const ( | |||
| ) | ||||
| 
 | ||||
| type InboundHandlerMeta struct { | ||||
| 	Tag            string | ||||
| 	Address        v2net.Address | ||||
| 	Port           v2net.Port | ||||
| 	StreamSettings *internet.StreamSettings | ||||
| 	Tag                    string | ||||
| 	Address                v2net.Address | ||||
| 	Port                   v2net.Port | ||||
| 	AllowPassiveConnection bool | ||||
| 	StreamSettings         *internet.StreamSettings | ||||
| } | ||||
| 
 | ||||
| type OutboundHandlerMeta struct { | ||||
|  |  | |||
|  | @ -70,7 +70,7 @@ func (this *Server) Start() error { | |||
| 	this.tcpHub = tcpHub | ||||
| 
 | ||||
| 	if this.config.UDP { | ||||
| 		this.udpServer = udp.NewUDPServer(this.packetDispatcher) | ||||
| 		this.udpServer = udp.NewUDPServer(this.meta, this.packetDispatcher) | ||||
| 		udpHub, err := udp.ListenUDP(this.meta.Address, this.meta.Port, this.handlerUDPPayload) | ||||
| 		if err != nil { | ||||
| 			log.Error("Shadowsocks: Failed to listen UDP on ", this.meta.Address, ":", this.meta.Port, ": ", err) | ||||
|  | @ -204,7 +204,7 @@ func (this *Server) handleConnection(conn internet.Connection) { | |||
| 	log.Access(conn.RemoteAddr(), dest, log.AccessAccepted, "") | ||||
| 	log.Info("Shadowsocks: Tunnelling request to ", dest) | ||||
| 
 | ||||
| 	ray := this.packetDispatcher.DispatchToOutbound(dest) | ||||
| 	ray := this.packetDispatcher.DispatchToOutbound(this.meta, dest) | ||||
| 	defer ray.InboundOutput().Release() | ||||
| 
 | ||||
| 	var writeFinish sync.Mutex | ||||
|  |  | |||
|  | @ -283,7 +283,7 @@ func (this *Server) handleSocks4(clientAddr string, reader *v2io.BufferedReader, | |||
| } | ||||
| 
 | ||||
| func (this *Server) transport(reader io.Reader, writer io.Writer, destination v2net.Destination) { | ||||
| 	ray := this.packetDispatcher.DispatchToOutbound(destination) | ||||
| 	ray := this.packetDispatcher.DispatchToOutbound(this.meta, destination) | ||||
| 	input := ray.InboundInput() | ||||
| 	output := ray.InboundOutput() | ||||
| 
 | ||||
|  |  | |||
|  | @ -9,7 +9,7 @@ import ( | |||
| ) | ||||
| 
 | ||||
| func (this *Server) listenUDP() error { | ||||
| 	this.udpServer = udp.NewUDPServer(this.packetDispatcher) | ||||
| 	this.udpServer = udp.NewUDPServer(this.meta, this.packetDispatcher) | ||||
| 	udpHub, err := udp.ListenUDP(this.meta.Address, this.meta.Port, this.handleUDPPayload) | ||||
| 	if err != nil { | ||||
| 		log.Error("Socks: Failed to listen on udp ", this.meta.Address, ":", this.meta.Port) | ||||
|  |  | |||
|  | @ -7,6 +7,7 @@ import ( | |||
| 	"github.com/v2ray/v2ray-core/app/dispatcher" | ||||
| 	v2io "github.com/v2ray/v2ray-core/common/io" | ||||
| 	v2net "github.com/v2ray/v2ray-core/common/net" | ||||
| 	"github.com/v2ray/v2ray-core/proxy" | ||||
| ) | ||||
| 
 | ||||
| type InboundConnectionHandler struct { | ||||
|  | @ -30,7 +31,9 @@ func (this *InboundConnectionHandler) Close() { | |||
| } | ||||
| 
 | ||||
| func (this *InboundConnectionHandler) Communicate(destination v2net.Destination) error { | ||||
| 	ray := this.PacketDispatcher.DispatchToOutbound(destination) | ||||
| 	ray := this.PacketDispatcher.DispatchToOutbound(&proxy.InboundHandlerMeta{ | ||||
| 		AllowPassiveConnection: false, | ||||
| 	}, destination) | ||||
| 
 | ||||
| 	input := ray.InboundInput() | ||||
| 	output := ray.InboundOutput() | ||||
|  |  | |||
|  | @ -163,7 +163,7 @@ func (this *VMessInboundHandler) HandleConnection(connection internet.Connection | |||
| 
 | ||||
| 	connection.SetReusable(request.Option.Has(protocol.RequestOptionConnectionReuse)) | ||||
| 
 | ||||
| 	ray := this.packetDispatcher.DispatchToOutbound(request.Destination()) | ||||
| 	ray := this.packetDispatcher.DispatchToOutbound(this.meta, request.Destination()) | ||||
| 	input := ray.InboundInput() | ||||
| 	output := ray.InboundOutput() | ||||
| 	defer input.Close() | ||||
|  |  | |||
|  | @ -10,11 +10,12 @@ import ( | |||
| ) | ||||
| 
 | ||||
| type InboundConnectionConfig struct { | ||||
| 	Port           v2net.Port | ||||
| 	ListenOn       v2net.Address | ||||
| 	StreamSettings *internet.StreamSettings | ||||
| 	Protocol       string | ||||
| 	Settings       []byte | ||||
| 	Port                   v2net.Port | ||||
| 	ListenOn               v2net.Address | ||||
| 	StreamSettings         *internet.StreamSettings | ||||
| 	Protocol               string | ||||
| 	Settings               []byte | ||||
| 	AllowPassiveConnection bool | ||||
| } | ||||
| 
 | ||||
| type OutboundConnectionConfig struct { | ||||
|  | @ -43,13 +44,14 @@ type InboundDetourAllocationConfig struct { | |||
| } | ||||
| 
 | ||||
| type InboundDetourConfig struct { | ||||
| 	Protocol       string | ||||
| 	PortRange      v2net.PortRange | ||||
| 	ListenOn       v2net.Address | ||||
| 	Tag            string | ||||
| 	Allocation     *InboundDetourAllocationConfig | ||||
| 	StreamSettings *internet.StreamSettings | ||||
| 	Settings       []byte | ||||
| 	Protocol               string | ||||
| 	PortRange              v2net.PortRange | ||||
| 	ListenOn               v2net.Address | ||||
| 	Tag                    string | ||||
| 	Allocation             *InboundDetourAllocationConfig | ||||
| 	StreamSettings         *internet.StreamSettings | ||||
| 	Settings               []byte | ||||
| 	AllowPassiveConnection bool | ||||
| } | ||||
| 
 | ||||
| type OutboundDetourConfig struct { | ||||
|  |  | |||
|  | @ -71,6 +71,7 @@ func (this *InboundConnectionConfig) UnmarshalJSON(data []byte) error { | |||
| 		Protocol      string                   `json:"protocol"` | ||||
| 		StreamSetting *internet.StreamSettings `json:"streamSettings"` | ||||
| 		Settings      json.RawMessage          `json:"settings"` | ||||
| 		AllowPassive  bool                     `json:"allowPassive"` | ||||
| 	} | ||||
| 
 | ||||
| 	jsonConfig := new(JsonConfig) | ||||
|  | @ -91,6 +92,7 @@ func (this *InboundConnectionConfig) UnmarshalJSON(data []byte) error { | |||
| 
 | ||||
| 	this.Protocol = jsonConfig.Protocol | ||||
| 	this.Settings = jsonConfig.Settings | ||||
| 	this.AllowPassiveConnection = jsonConfig.AllowPassive | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
|  | @ -186,6 +188,7 @@ func (this *InboundDetourConfig) UnmarshalJSON(data []byte) error { | |||
| 		Tag           string                         `json:"tag"` | ||||
| 		Allocation    *InboundDetourAllocationConfig `json:"allocate"` | ||||
| 		StreamSetting *internet.StreamSettings       `json:"streamSettings"` | ||||
| 		AllowPassive  bool                           `json:"allowPassive"` | ||||
| 	} | ||||
| 	jsonConfig := new(JsonInboundDetourConfig) | ||||
| 	if err := json.Unmarshal(data, jsonConfig); err != nil { | ||||
|  | @ -216,6 +219,7 @@ func (this *InboundDetourConfig) UnmarshalJSON(data []byte) error { | |||
| 	if jsonConfig.StreamSetting != nil { | ||||
| 		this.StreamSettings = jsonConfig.StreamSetting | ||||
| 	} | ||||
| 	this.AllowPassiveConnection = jsonConfig.AllowPassive | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -26,10 +26,12 @@ func NewInboundDetourHandlerAlways(space app.Space, config *InboundDetourConfig) | |||
| 	for i := ports.From; i <= ports.To; i++ { | ||||
| 		ichConfig := config.Settings | ||||
| 		ich, err := proxyrepo.CreateInboundHandler(config.Protocol, space, ichConfig, &proxy.InboundHandlerMeta{ | ||||
| 			Address:        config.ListenOn, | ||||
| 			Port:           i, | ||||
| 			Tag:            config.Tag, | ||||
| 			StreamSettings: config.StreamSettings}) | ||||
| 			Address:                config.ListenOn, | ||||
| 			Port:                   i, | ||||
| 			Tag:                    config.Tag, | ||||
| 			StreamSettings:         config.StreamSettings, | ||||
| 			AllowPassiveConnection: config.AllowPassiveConnection, | ||||
| 		}) | ||||
| 		if err != nil { | ||||
| 			log.Error("Failed to create inbound connection handler: ", err) | ||||
| 			return nil, err | ||||
|  |  | |||
|  | @ -33,10 +33,12 @@ func NewInboundDetourHandlerDynamic(space app.Space, config *InboundDetourConfig | |||
| 
 | ||||
| 	// To test configuration
 | ||||
| 	ich, err := proxyrepo.CreateInboundHandler(config.Protocol, space, config.Settings, &proxy.InboundHandlerMeta{ | ||||
| 		Address:        config.ListenOn, | ||||
| 		Port:           0, | ||||
| 		Tag:            config.Tag, | ||||
| 		StreamSettings: config.StreamSettings}) | ||||
| 		Address:                config.ListenOn, | ||||
| 		Port:                   0, | ||||
| 		Tag:                    config.Tag, | ||||
| 		StreamSettings:         config.StreamSettings, | ||||
| 		AllowPassiveConnection: config.AllowPassiveConnection, | ||||
| 	}) | ||||
| 	if err != nil { | ||||
| 		log.Error("Point: Failed to create inbound connection handler: ", err) | ||||
| 		return nil, err | ||||
|  |  | |||
|  | @ -93,10 +93,12 @@ func NewPoint(pConfig *Config) (*Point, error) { | |||
| 	ichConfig := pConfig.InboundConfig.Settings | ||||
| 	ich, err := proxyrepo.CreateInboundHandler( | ||||
| 		pConfig.InboundConfig.Protocol, vpoint.space, ichConfig, &proxy.InboundHandlerMeta{ | ||||
| 			Tag:            "system.inbound", | ||||
| 			Address:        pConfig.InboundConfig.ListenOn, | ||||
| 			Port:           vpoint.port, | ||||
| 			StreamSettings: pConfig.InboundConfig.StreamSettings}) | ||||
| 			Tag:                    "system.inbound", | ||||
| 			Address:                pConfig.InboundConfig.ListenOn, | ||||
| 			Port:                   vpoint.port, | ||||
| 			StreamSettings:         pConfig.InboundConfig.StreamSettings, | ||||
| 			AllowPassiveConnection: pConfig.InboundConfig.AllowPassiveConnection, | ||||
| 		}) | ||||
| 	if err != nil { | ||||
| 		log.Error("Failed to create inbound connection handler: ", err) | ||||
| 		return nil, err | ||||
|  |  | |||
|  | @ -8,6 +8,7 @@ import ( | |||
| 	"github.com/v2ray/v2ray-core/common/alloc" | ||||
| 	"github.com/v2ray/v2ray-core/common/log" | ||||
| 	v2net "github.com/v2ray/v2ray-core/common/net" | ||||
| 	"github.com/v2ray/v2ray-core/proxy" | ||||
| 	"github.com/v2ray/v2ray-core/transport/ray" | ||||
| ) | ||||
| 
 | ||||
|  | @ -95,12 +96,14 @@ type UDPServer struct { | |||
| 	sync.RWMutex | ||||
| 	conns            map[string]*TimedInboundRay | ||||
| 	packetDispatcher dispatcher.PacketDispatcher | ||||
| 	meta             *proxy.InboundHandlerMeta | ||||
| } | ||||
| 
 | ||||
| func NewUDPServer(packetDispatcher dispatcher.PacketDispatcher) *UDPServer { | ||||
| func NewUDPServer(meta *proxy.InboundHandlerMeta, packetDispatcher dispatcher.PacketDispatcher) *UDPServer { | ||||
| 	return &UDPServer{ | ||||
| 		conns:            make(map[string]*TimedInboundRay), | ||||
| 		packetDispatcher: packetDispatcher, | ||||
| 		meta:             meta, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  | @ -137,7 +140,7 @@ func (this *UDPServer) Dispatch(source v2net.Destination, destination v2net.Dest | |||
| 	} | ||||
| 
 | ||||
| 	log.Info("UDP Server: establishing new connection for ", destString) | ||||
| 	inboundRay := this.packetDispatcher.DispatchToOutbound(destination) | ||||
| 	inboundRay := this.packetDispatcher.DispatchToOutbound(this.meta, destination) | ||||
| 	timedInboundRay := NewTimedInboundRay(destString, inboundRay, this) | ||||
| 	outputStream := timedInboundRay.InboundInput() | ||||
| 	if outputStream != nil { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 v2ray
						v2ray