mirror of https://github.com/XTLS/Xray-core
				
				
				
			Add SNI shunt support for VLESS (#141)
							parent
							
								
									11a851f957
								
							
						
					
					
						commit
						d85162ea44
					
				|  | @ -18,6 +18,7 @@ import ( | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type VLessInboundFallback struct { | type VLessInboundFallback struct { | ||||||
|  | 	Name string          `json:"name"` | ||||||
| 	Alpn string          `json:"alpn"` | 	Alpn string          `json:"alpn"` | ||||||
| 	Path string          `json:"path"` | 	Path string          `json:"path"` | ||||||
| 	Type string          `json:"type"` | 	Type string          `json:"type"` | ||||||
|  | @ -85,6 +86,7 @@ func (c *VLessInboundConfig) Build() (proto.Message, error) { | ||||||
| 			_ = json.Unmarshal(fb.Dest, &s) | 			_ = json.Unmarshal(fb.Dest, &s) | ||||||
| 		} | 		} | ||||||
| 		config.Fallbacks = append(config.Fallbacks, &inbound.Fallback{ | 		config.Fallbacks = append(config.Fallbacks, &inbound.Fallback{ | ||||||
|  | 			Name: fb.Name, | ||||||
| 			Alpn: fb.Alpn, | 			Alpn: fb.Alpn, | ||||||
| 			Path: fb.Path, | 			Path: fb.Path, | ||||||
| 			Type: fb.Type, | 			Type: fb.Type, | ||||||
|  |  | ||||||
|  | @ -31,11 +31,12 @@ type Fallback struct { | ||||||
| 	sizeCache     protoimpl.SizeCache | 	sizeCache     protoimpl.SizeCache | ||||||
| 	unknownFields protoimpl.UnknownFields | 	unknownFields protoimpl.UnknownFields | ||||||
| 
 | 
 | ||||||
| 	Alpn string `protobuf:"bytes,1,opt,name=alpn,proto3" json:"alpn,omitempty"` | 	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` | ||||||
| 	Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` | 	Alpn string `protobuf:"bytes,2,opt,name=alpn,proto3" json:"alpn,omitempty"` | ||||||
| 	Type string `protobuf:"bytes,3,opt,name=type,proto3" json:"type,omitempty"` | 	Path string `protobuf:"bytes,3,opt,name=path,proto3" json:"path,omitempty"` | ||||||
| 	Dest string `protobuf:"bytes,4,opt,name=dest,proto3" json:"dest,omitempty"` | 	Type string `protobuf:"bytes,4,opt,name=type,proto3" json:"type,omitempty"` | ||||||
| 	Xver uint64 `protobuf:"varint,5,opt,name=xver,proto3" json:"xver,omitempty"` | 	Dest string `protobuf:"bytes,5,opt,name=dest,proto3" json:"dest,omitempty"` | ||||||
|  | 	Xver uint64 `protobuf:"varint,6,opt,name=xver,proto3" json:"xver,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (x *Fallback) Reset() { | func (x *Fallback) Reset() { | ||||||
|  | @ -70,6 +71,13 @@ func (*Fallback) Descriptor() ([]byte, []int) { | ||||||
| 	return file_proxy_vless_inbound_config_proto_rawDescGZIP(), []int{0} | 	return file_proxy_vless_inbound_config_proto_rawDescGZIP(), []int{0} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (x *Fallback) GetName() string { | ||||||
|  | 	if x != nil { | ||||||
|  | 		return x.Name | ||||||
|  | 	} | ||||||
|  | 	return "" | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (x *Fallback) GetAlpn() string { | func (x *Fallback) GetAlpn() string { | ||||||
| 	if x != nil { | 	if x != nil { | ||||||
| 		return x.Alpn | 		return x.Alpn | ||||||
|  | @ -178,31 +186,33 @@ var file_proxy_vless_inbound_config_proto_rawDesc = []byte{ | ||||||
| 	0x74, 0x6f, 0x12, 0x18, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, | 	0x74, 0x6f, 0x12, 0x18, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, | ||||||
| 	0x6c, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x1a, 0x1a, 0x63, 0x6f, | 	0x6c, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x1a, 0x1a, 0x63, 0x6f, | ||||||
| 	0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x75, 0x73, | 	0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x75, 0x73, | ||||||
| 	0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x6e, 0x0a, 0x08, 0x46, 0x61, 0x6c, 0x6c, | 	0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x82, 0x01, 0x0a, 0x08, 0x46, 0x61, 0x6c, | ||||||
| 	0x62, 0x61, 0x63, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x6c, 0x70, 0x6e, 0x18, 0x01, 0x20, 0x01, | 	0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, | ||||||
| 	0x28, 0x09, 0x52, 0x04, 0x61, 0x6c, 0x70, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, | 	0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x6c, 0x70, | ||||||
| 	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, | 	0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x6c, 0x70, 0x6e, 0x12, 0x12, 0x0a, | ||||||
| 	0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, | 	0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, | ||||||
| 	0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, | 	0x68, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, | ||||||
| 	0x64, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x78, 0x76, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, | 	0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x74, 0x18, 0x05, 0x20, | ||||||
| 	0x28, 0x04, 0x52, 0x04, 0x78, 0x76, 0x65, 0x72, 0x22, 0xa0, 0x01, 0x0a, 0x06, 0x43, 0x6f, 0x6e, | 	0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x78, 0x76, 0x65, | ||||||
| 	0x66, 0x69, 0x67, 0x12, 0x34, 0x0a, 0x07, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, | 	0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x78, 0x76, 0x65, 0x72, 0x22, 0xa0, 0x01, | ||||||
| 	0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, | 	0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x34, 0x0a, 0x07, 0x63, 0x6c, 0x69, 0x65, | ||||||
| 	0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, | 	0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x78, 0x72, 0x61, 0x79, | ||||||
| 	0x52, 0x07, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x63, | 	0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, | ||||||
| 	0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, | 	0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1e, | ||||||
| 	0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x09, 0x66, 0x61, 0x6c, | 	0x0a, 0x0a, 0x64, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, | ||||||
| 	0x6c, 0x62, 0x61, 0x63, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x78, | 	0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, | ||||||
| 	0x72, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x6c, 0x65, 0x73, 0x73, 0x2e, | 	0x0a, 0x09, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, | ||||||
| 	0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, | 	0x0b, 0x32, 0x22, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, | ||||||
| 	0x52, 0x09, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x73, 0x42, 0x6a, 0x0a, 0x1c, 0x63, | 	0x6c, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x46, 0x61, 0x6c, | ||||||
| 	0x6f, 0x6d, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x6c, | 	0x6c, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x09, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x73, | ||||||
| 	0x65, 0x73, 0x73, 0x2e, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x50, 0x01, 0x5a, 0x2d, 0x67, | 	0x42, 0x6a, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, | ||||||
| 	0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x74, 0x6c, 0x73, 0x2f, 0x78, | 	0x78, 0x79, 0x2e, 0x76, 0x6c, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, | ||||||
| 	0x72, 0x61, 0x79, 0x2d, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x76, | 	0x50, 0x01, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, | ||||||
| 	0x6c, 0x65, 0x73, 0x73, 0x2f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0xaa, 0x02, 0x18, 0x58, | 	0x74, 0x6c, 0x73, 0x2f, 0x78, 0x72, 0x61, 0x79, 0x2d, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, | ||||||
| 	0x72, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x56, 0x6c, 0x65, 0x73, 0x73, 0x2e, | 	0x6f, 0x78, 0x79, 0x2f, 0x76, 0x6c, 0x65, 0x73, 0x73, 0x2f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, | ||||||
| 	0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, | 	0x64, 0xaa, 0x02, 0x18, 0x58, 0x72, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x56, | ||||||
|  | 	0x6c, 0x65, 0x73, 0x73, 0x2e, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x62, 0x06, 0x70, 0x72, | ||||||
|  | 	0x6f, 0x74, 0x6f, 0x33, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
|  |  | ||||||
|  | @ -9,11 +9,12 @@ option java_multiple_files = true; | ||||||
| import "common/protocol/user.proto"; | import "common/protocol/user.proto"; | ||||||
| 
 | 
 | ||||||
| message Fallback { | message Fallback { | ||||||
|   string alpn = 1; |   string name = 1; | ||||||
|   string path = 2; |   string alpn = 2; | ||||||
|   string type = 3; |   string path = 3; | ||||||
|   string dest = 4; |   string type = 4; | ||||||
|   uint64 xver = 5; |   string dest = 5; | ||||||
|  |   uint64 xver = 6; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| message Config { | message Config { | ||||||
|  |  | ||||||
|  | @ -6,6 +6,7 @@ import ( | ||||||
| 	"context" | 	"context" | ||||||
| 	"io" | 	"io" | ||||||
| 	"strconv" | 	"strconv" | ||||||
|  | 	"strings" | ||||||
| 	"syscall" | 	"syscall" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
|  | @ -63,7 +64,7 @@ type Handler struct { | ||||||
| 	policyManager         policy.Manager | 	policyManager         policy.Manager | ||||||
| 	validator             *vless.Validator | 	validator             *vless.Validator | ||||||
| 	dns                   dns.Client | 	dns                   dns.Client | ||||||
| 	fallbacks             map[string]map[string]*Fallback // or nil
 | 	fallbacks             map[string]map[string]map[string]*Fallback // or nil
 | ||||||
| 	// regexps               map[string]*regexp.Regexp       // or nil
 | 	// regexps               map[string]*regexp.Regexp       // or nil
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -88,13 +89,16 @@ func New(ctx context.Context, config *Config, dc dns.Client) (*Handler, error) { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if config.Fallbacks != nil { | 	if config.Fallbacks != nil { | ||||||
| 		handler.fallbacks = make(map[string]map[string]*Fallback) | 		handler.fallbacks = make(map[string]map[string]map[string]*Fallback) | ||||||
| 		// handler.regexps = make(map[string]*regexp.Regexp)
 | 		// handler.regexps = make(map[string]*regexp.Regexp)
 | ||||||
| 		for _, fb := range config.Fallbacks { | 		for _, fb := range config.Fallbacks { | ||||||
| 			if handler.fallbacks[fb.Alpn] == nil { | 			if handler.fallbacks[fb.Name] == nil { | ||||||
| 				handler.fallbacks[fb.Alpn] = make(map[string]*Fallback) | 				handler.fallbacks[fb.Name] = make(map[string]map[string]*Fallback) | ||||||
| 			} | 			} | ||||||
| 			handler.fallbacks[fb.Alpn][fb.Path] = fb | 			if handler.fallbacks[fb.Name][fb.Alpn] == nil { | ||||||
|  | 				handler.fallbacks[fb.Name][fb.Alpn] = make(map[string]*Fallback) | ||||||
|  | 			} | ||||||
|  | 			handler.fallbacks[fb.Name][fb.Alpn][fb.Path] = fb | ||||||
| 			/* | 			/* | ||||||
| 				if fb.Path != "" { | 				if fb.Path != "" { | ||||||
| 					if r, err := regexp.Compile(fb.Path); err != nil { | 					if r, err := regexp.Compile(fb.Path); err != nil { | ||||||
|  | @ -187,20 +191,38 @@ func (h *Handler) Process(ctx context.Context, network net.Network, connection i | ||||||
| 			} | 			} | ||||||
| 			newError("fallback starts").Base(err).AtInfo().WriteToLog(sid) | 			newError("fallback starts").Base(err).AtInfo().WriteToLog(sid) | ||||||
| 
 | 
 | ||||||
|  | 			name := "" | ||||||
| 			alpn := "" | 			alpn := "" | ||||||
| 			if len(apfb) > 1 || apfb[""] == nil { | 			if len(apfb) > 1 || apfb[""] == nil { | ||||||
| 				if tlsConn, ok := iConn.(*tls.Conn); ok { | 				if tlsConn, ok := iConn.(*tls.Conn); ok { | ||||||
|  | 					name = tlsConn.ConnectionState().ServerName | ||||||
| 					alpn = tlsConn.ConnectionState().NegotiatedProtocol | 					alpn = tlsConn.ConnectionState().NegotiatedProtocol | ||||||
|  | 					newError("realServerName = " + name).AtInfo().WriteToLog(sid) | ||||||
| 					newError("realAlpn = " + alpn).AtInfo().WriteToLog(sid) | 					newError("realAlpn = " + alpn).AtInfo().WriteToLog(sid) | ||||||
| 				} else if xtlsConn, ok := iConn.(*xtls.Conn); ok { | 				} else if xtlsConn, ok := iConn.(*xtls.Conn); ok { | ||||||
|  | 					name = xtlsConn.ConnectionState().ServerName | ||||||
| 					alpn = xtlsConn.ConnectionState().NegotiatedProtocol | 					alpn = xtlsConn.ConnectionState().NegotiatedProtocol | ||||||
|  | 					newError("realServerName = " + name).AtInfo().WriteToLog(sid) | ||||||
| 					newError("realAlpn = " + alpn).AtInfo().WriteToLog(sid) | 					newError("realAlpn = " + alpn).AtInfo().WriteToLog(sid) | ||||||
| 				} | 				} | ||||||
| 				if apfb[alpn] == nil { | 				labels := strings.Split(name, ".") | ||||||
|  | 				for i := range labels { | ||||||
|  | 					labels[i] = "*" | ||||||
|  | 					candidate := strings.Join(labels, ".") | ||||||
|  | 					if apfb[candidate] != nil { | ||||||
|  | 						name = candidate | ||||||
|  | 						break | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 				if apfb[name] == nil { | ||||||
|  | 					name = "" | ||||||
|  | 				} | ||||||
|  | 				if apfb[name][alpn] == nil { | ||||||
| 					alpn = "" | 					alpn = "" | ||||||
| 				} | 				} | ||||||
|  | 
 | ||||||
| 			} | 			} | ||||||
| 			pfb := apfb[alpn] | 			pfb := apfb[name][alpn] | ||||||
| 			if pfb == nil { | 			if pfb == nil { | ||||||
| 				return newError(`failed to find the default "alpn" config`).AtWarning() | 				return newError(`failed to find the default "alpn" config`).AtWarning() | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 eMeab
						eMeab