vless_test.go 14 KB

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