vless_test.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519
  1. package scenarios
  2. import (
  3. "encoding/base64"
  4. "encoding/hex"
  5. "testing"
  6. "time"
  7. "github.com/xtls/xray-core/app/log"
  8. "github.com/xtls/xray-core/app/proxyman"
  9. "github.com/xtls/xray-core/common"
  10. clog "github.com/xtls/xray-core/common/log"
  11. "github.com/xtls/xray-core/common/net"
  12. "github.com/xtls/xray-core/common/protocol"
  13. "github.com/xtls/xray-core/common/protocol/tls/cert"
  14. "github.com/xtls/xray-core/common/serial"
  15. "github.com/xtls/xray-core/common/uuid"
  16. core "github.com/xtls/xray-core/core"
  17. "github.com/xtls/xray-core/proxy/dokodemo"
  18. "github.com/xtls/xray-core/proxy/freedom"
  19. "github.com/xtls/xray-core/proxy/vless"
  20. "github.com/xtls/xray-core/proxy/vless/inbound"
  21. "github.com/xtls/xray-core/proxy/vless/outbound"
  22. "github.com/xtls/xray-core/testing/servers/tcp"
  23. "github.com/xtls/xray-core/transport/internet"
  24. "github.com/xtls/xray-core/transport/internet/reality"
  25. transtcp "github.com/xtls/xray-core/transport/internet/tcp"
  26. "github.com/xtls/xray-core/transport/internet/tls"
  27. "golang.org/x/sync/errgroup"
  28. )
  29. func TestVless(t *testing.T) {
  30. tcpServer := tcp.Server{
  31. MsgProcessor: xor,
  32. }
  33. dest, err := tcpServer.Start()
  34. common.Must(err)
  35. defer tcpServer.Close()
  36. userID := protocol.NewID(uuid.New())
  37. serverPort := tcp.PickPort()
  38. serverConfig := &core.Config{
  39. App: []*serial.TypedMessage{
  40. serial.ToTypedMessage(&log.Config{
  41. ErrorLogLevel: clog.Severity_Debug,
  42. ErrorLogType: log.LogType_Console,
  43. }),
  44. },
  45. Inbound: []*core.InboundHandlerConfig{
  46. {
  47. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  48. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  49. Listen: net.NewIPOrDomain(net.LocalHostIP),
  50. }),
  51. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  52. Clients: []*protocol.User{
  53. {
  54. Account: serial.ToTypedMessage(&vless.Account{
  55. Id: userID.String(),
  56. }),
  57. },
  58. },
  59. }),
  60. },
  61. },
  62. Outbound: []*core.OutboundHandlerConfig{
  63. {
  64. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  65. },
  66. },
  67. }
  68. clientPort := tcp.PickPort()
  69. clientConfig := &core.Config{
  70. App: []*serial.TypedMessage{
  71. serial.ToTypedMessage(&log.Config{
  72. ErrorLogLevel: clog.Severity_Debug,
  73. ErrorLogType: log.LogType_Console,
  74. }),
  75. },
  76. Inbound: []*core.InboundHandlerConfig{
  77. {
  78. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  79. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  80. Listen: net.NewIPOrDomain(net.LocalHostIP),
  81. }),
  82. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  83. Address: net.NewIPOrDomain(dest.Address),
  84. Port: uint32(dest.Port),
  85. NetworkList: &net.NetworkList{
  86. Network: []net.Network{net.Network_TCP},
  87. },
  88. }),
  89. },
  90. },
  91. Outbound: []*core.OutboundHandlerConfig{
  92. {
  93. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  94. Vnext: []*protocol.ServerEndpoint{
  95. {
  96. Address: net.NewIPOrDomain(net.LocalHostIP),
  97. Port: uint32(serverPort),
  98. User: []*protocol.User{
  99. {
  100. Account: serial.ToTypedMessage(&vless.Account{
  101. Id: userID.String(),
  102. }),
  103. },
  104. },
  105. },
  106. },
  107. }),
  108. },
  109. },
  110. }
  111. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  112. common.Must(err)
  113. defer CloseAllServers(servers)
  114. var errg errgroup.Group
  115. for i := 0; i < 10; i++ {
  116. errg.Go(testTCPConn(clientPort, 1024*1024, time.Second*30))
  117. }
  118. if err := errg.Wait(); err != nil {
  119. t.Error(err)
  120. }
  121. }
  122. func TestVlessTls(t *testing.T) {
  123. tcpServer := tcp.Server{
  124. MsgProcessor: xor,
  125. }
  126. dest, err := tcpServer.Start()
  127. common.Must(err)
  128. defer tcpServer.Close()
  129. userID := protocol.NewID(uuid.New())
  130. serverPort := tcp.PickPort()
  131. serverConfig := &core.Config{
  132. App: []*serial.TypedMessage{
  133. serial.ToTypedMessage(&log.Config{
  134. ErrorLogLevel: clog.Severity_Debug,
  135. ErrorLogType: log.LogType_Console,
  136. }),
  137. },
  138. Inbound: []*core.InboundHandlerConfig{
  139. {
  140. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  141. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  142. Listen: net.NewIPOrDomain(net.LocalHostIP),
  143. StreamSettings: &internet.StreamConfig{
  144. Protocol: internet.TransportProtocol_TCP,
  145. SecurityType: serial.GetMessageType(&tls.Config{}),
  146. SecuritySettings: []*serial.TypedMessage{
  147. serial.ToTypedMessage(&tls.Config{
  148. Certificate: []*tls.Certificate{tls.ParseCertificate(cert.MustGenerate(nil))},
  149. }),
  150. },
  151. },
  152. }),
  153. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  154. Clients: []*protocol.User{
  155. {
  156. Account: serial.ToTypedMessage(&vless.Account{
  157. Id: userID.String(),
  158. }),
  159. },
  160. },
  161. }),
  162. },
  163. },
  164. Outbound: []*core.OutboundHandlerConfig{
  165. {
  166. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  167. },
  168. },
  169. }
  170. clientPort := tcp.PickPort()
  171. clientConfig := &core.Config{
  172. App: []*serial.TypedMessage{
  173. serial.ToTypedMessage(&log.Config{
  174. ErrorLogLevel: clog.Severity_Debug,
  175. ErrorLogType: log.LogType_Console,
  176. }),
  177. },
  178. Inbound: []*core.InboundHandlerConfig{
  179. {
  180. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  181. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  182. Listen: net.NewIPOrDomain(net.LocalHostIP),
  183. }),
  184. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  185. Address: net.NewIPOrDomain(dest.Address),
  186. Port: uint32(dest.Port),
  187. NetworkList: &net.NetworkList{
  188. Network: []net.Network{net.Network_TCP},
  189. },
  190. }),
  191. },
  192. },
  193. Outbound: []*core.OutboundHandlerConfig{
  194. {
  195. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  196. Vnext: []*protocol.ServerEndpoint{
  197. {
  198. Address: net.NewIPOrDomain(net.LocalHostIP),
  199. Port: uint32(serverPort),
  200. User: []*protocol.User{
  201. {
  202. Account: serial.ToTypedMessage(&vless.Account{
  203. Id: userID.String(),
  204. }),
  205. },
  206. },
  207. },
  208. },
  209. }),
  210. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  211. StreamSettings: &internet.StreamConfig{
  212. Protocol: internet.TransportProtocol_TCP,
  213. TransportSettings: []*internet.TransportConfig{
  214. {
  215. Protocol: internet.TransportProtocol_TCP,
  216. Settings: serial.ToTypedMessage(&transtcp.Config{}),
  217. },
  218. },
  219. SecurityType: serial.GetMessageType(&tls.Config{}),
  220. SecuritySettings: []*serial.TypedMessage{
  221. serial.ToTypedMessage(&tls.Config{
  222. AllowInsecure: true,
  223. }),
  224. },
  225. },
  226. }),
  227. },
  228. },
  229. }
  230. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  231. common.Must(err)
  232. defer CloseAllServers(servers)
  233. var errg errgroup.Group
  234. for i := 0; i < 10; i++ {
  235. errg.Go(testTCPConn(clientPort, 1024*1024, time.Second*30))
  236. }
  237. if err := errg.Wait(); err != nil {
  238. t.Error(err)
  239. }
  240. }
  241. func TestVlessXtlsVision(t *testing.T) {
  242. tcpServer := tcp.Server{
  243. MsgProcessor: xor,
  244. }
  245. dest, err := tcpServer.Start()
  246. common.Must(err)
  247. defer tcpServer.Close()
  248. userID := protocol.NewID(uuid.New())
  249. serverPort := tcp.PickPort()
  250. serverConfig := &core.Config{
  251. App: []*serial.TypedMessage{
  252. serial.ToTypedMessage(&log.Config{
  253. ErrorLogLevel: clog.Severity_Debug,
  254. ErrorLogType: log.LogType_Console,
  255. }),
  256. },
  257. Inbound: []*core.InboundHandlerConfig{
  258. {
  259. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  260. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  261. Listen: net.NewIPOrDomain(net.LocalHostIP),
  262. StreamSettings: &internet.StreamConfig{
  263. Protocol: internet.TransportProtocol_TCP,
  264. SecurityType: serial.GetMessageType(&tls.Config{}),
  265. SecuritySettings: []*serial.TypedMessage{
  266. serial.ToTypedMessage(&tls.Config{
  267. Certificate: []*tls.Certificate{tls.ParseCertificate(cert.MustGenerate(nil))},
  268. }),
  269. },
  270. },
  271. }),
  272. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  273. Clients: []*protocol.User{
  274. {
  275. Account: serial.ToTypedMessage(&vless.Account{
  276. Id: userID.String(),
  277. Flow: vless.XRV,
  278. }),
  279. },
  280. },
  281. }),
  282. },
  283. },
  284. Outbound: []*core.OutboundHandlerConfig{
  285. {
  286. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  287. },
  288. },
  289. }
  290. clientPort := tcp.PickPort()
  291. clientConfig := &core.Config{
  292. App: []*serial.TypedMessage{
  293. serial.ToTypedMessage(&log.Config{
  294. ErrorLogLevel: clog.Severity_Debug,
  295. ErrorLogType: log.LogType_Console,
  296. }),
  297. },
  298. Inbound: []*core.InboundHandlerConfig{
  299. {
  300. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  301. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  302. Listen: net.NewIPOrDomain(net.LocalHostIP),
  303. }),
  304. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  305. Address: net.NewIPOrDomain(dest.Address),
  306. Port: uint32(dest.Port),
  307. NetworkList: &net.NetworkList{
  308. Network: []net.Network{net.Network_TCP},
  309. },
  310. }),
  311. },
  312. },
  313. Outbound: []*core.OutboundHandlerConfig{
  314. {
  315. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  316. Vnext: []*protocol.ServerEndpoint{
  317. {
  318. Address: net.NewIPOrDomain(net.LocalHostIP),
  319. Port: uint32(serverPort),
  320. User: []*protocol.User{
  321. {
  322. Account: serial.ToTypedMessage(&vless.Account{
  323. Id: userID.String(),
  324. Flow: vless.XRV,
  325. }),
  326. },
  327. },
  328. },
  329. },
  330. }),
  331. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  332. StreamSettings: &internet.StreamConfig{
  333. Protocol: internet.TransportProtocol_TCP,
  334. TransportSettings: []*internet.TransportConfig{
  335. {
  336. Protocol: internet.TransportProtocol_TCP,
  337. Settings: serial.ToTypedMessage(&transtcp.Config{}),
  338. },
  339. },
  340. SecurityType: serial.GetMessageType(&tls.Config{}),
  341. SecuritySettings: []*serial.TypedMessage{
  342. serial.ToTypedMessage(&tls.Config{
  343. AllowInsecure: true,
  344. }),
  345. },
  346. },
  347. }),
  348. },
  349. },
  350. }
  351. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  352. common.Must(err)
  353. defer CloseAllServers(servers)
  354. var errg errgroup.Group
  355. for i := 0; i < 10; i++ {
  356. errg.Go(testTCPConn(clientPort, 1024*1024, time.Second*30))
  357. }
  358. if err := errg.Wait(); err != nil {
  359. t.Error(err)
  360. }
  361. }
  362. func TestVlessXtlsVisionReality(t *testing.T) {
  363. tcpServer := tcp.Server{
  364. MsgProcessor: xor,
  365. }
  366. dest, err := tcpServer.Start()
  367. common.Must(err)
  368. defer tcpServer.Close()
  369. userID := protocol.NewID(uuid.New())
  370. serverPort := tcp.PickPort()
  371. privateKey, _ := base64.RawURLEncoding.DecodeString("aGSYystUbf59_9_6LKRxD27rmSW_-2_nyd9YG_Gwbks")
  372. publicKey, _ := base64.RawURLEncoding.DecodeString("E59WjnvZcQMu7tR7_BgyhycuEdBS-CtKxfImRCdAvFM")
  373. shortIds := make([][]byte, 1)
  374. shortIds[0] = make([]byte, 8)
  375. hex.Decode(shortIds[0], []byte("0123456789abcdef"))
  376. serverConfig := &core.Config{
  377. App: []*serial.TypedMessage{
  378. serial.ToTypedMessage(&log.Config{
  379. ErrorLogLevel: clog.Severity_Debug,
  380. ErrorLogType: log.LogType_Console,
  381. }),
  382. },
  383. Inbound: []*core.InboundHandlerConfig{
  384. {
  385. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  386. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  387. Listen: net.NewIPOrDomain(net.LocalHostIP),
  388. StreamSettings: &internet.StreamConfig{
  389. Protocol: internet.TransportProtocol_TCP,
  390. SecurityType: serial.GetMessageType(&reality.Config{}),
  391. SecuritySettings: []*serial.TypedMessage{
  392. serial.ToTypedMessage(&reality.Config{
  393. Show: true,
  394. Dest: "www.google.com:443", // use google for now, may fail in some region
  395. ServerNames: []string{"www.google.com"},
  396. PrivateKey: privateKey,
  397. ShortIds: shortIds,
  398. Type: "tcp",
  399. }),
  400. },
  401. },
  402. }),
  403. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  404. Clients: []*protocol.User{
  405. {
  406. Account: serial.ToTypedMessage(&vless.Account{
  407. Id: userID.String(),
  408. Flow: vless.XRV,
  409. }),
  410. },
  411. },
  412. }),
  413. },
  414. },
  415. Outbound: []*core.OutboundHandlerConfig{
  416. {
  417. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  418. },
  419. },
  420. }
  421. clientPort := tcp.PickPort()
  422. clientConfig := &core.Config{
  423. App: []*serial.TypedMessage{
  424. serial.ToTypedMessage(&log.Config{
  425. ErrorLogLevel: clog.Severity_Debug,
  426. ErrorLogType: log.LogType_Console,
  427. }),
  428. },
  429. Inbound: []*core.InboundHandlerConfig{
  430. {
  431. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  432. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  433. Listen: net.NewIPOrDomain(net.LocalHostIP),
  434. }),
  435. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  436. Address: net.NewIPOrDomain(dest.Address),
  437. Port: uint32(dest.Port),
  438. NetworkList: &net.NetworkList{
  439. Network: []net.Network{net.Network_TCP},
  440. },
  441. }),
  442. },
  443. },
  444. Outbound: []*core.OutboundHandlerConfig{
  445. {
  446. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  447. Vnext: []*protocol.ServerEndpoint{
  448. {
  449. Address: net.NewIPOrDomain(net.LocalHostIP),
  450. Port: uint32(serverPort),
  451. User: []*protocol.User{
  452. {
  453. Account: serial.ToTypedMessage(&vless.Account{
  454. Id: userID.String(),
  455. Flow: vless.XRV,
  456. }),
  457. },
  458. },
  459. },
  460. },
  461. }),
  462. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  463. StreamSettings: &internet.StreamConfig{
  464. Protocol: internet.TransportProtocol_TCP,
  465. TransportSettings: []*internet.TransportConfig{
  466. {
  467. Protocol: internet.TransportProtocol_TCP,
  468. Settings: serial.ToTypedMessage(&transtcp.Config{}),
  469. },
  470. },
  471. SecurityType: serial.GetMessageType(&reality.Config{}),
  472. SecuritySettings: []*serial.TypedMessage{
  473. serial.ToTypedMessage(&reality.Config{
  474. Show: true,
  475. Fingerprint: "chrome",
  476. ServerName: "www.google.com",
  477. PublicKey: publicKey,
  478. ShortId: shortIds[0],
  479. SpiderX: "/",
  480. }),
  481. },
  482. },
  483. }),
  484. },
  485. },
  486. }
  487. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  488. common.Must(err)
  489. defer CloseAllServers(servers)
  490. var errg errgroup.Group
  491. for i := 0; i < 1; i++ {
  492. errg.Go(testTCPConn(clientPort, 1024*1024, time.Second*30))
  493. }
  494. if err := errg.Wait(); err != nil {
  495. t.Error(err)
  496. }
  497. }