vless_test.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701
  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. Address: net.NewIPOrDomain(net.LocalHostIP),
  94. Port: uint32(serverPort),
  95. User: &protocol.User{
  96. Account: serial.ToTypedMessage(&vless.Account{
  97. Id: userID.String(),
  98. }),
  99. },
  100. },
  101. }),
  102. },
  103. },
  104. }
  105. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  106. common.Must(err)
  107. defer CloseAllServers(servers)
  108. var errg errgroup.Group
  109. for range 3 {
  110. errg.Go(testTCPConn(clientPort, 1024*1024, time.Second*30))
  111. }
  112. if err := errg.Wait(); err != nil {
  113. t.Error(err)
  114. }
  115. }
  116. func TestVlessMuxTcp(t *testing.T) {
  117. tcpServer := tcp.Server{
  118. MsgProcessor: xor,
  119. }
  120. dest, err := tcpServer.Start()
  121. common.Must(err)
  122. defer tcpServer.Close()
  123. userID := protocol.NewID(uuid.New())
  124. serverPort := tcp.PickPort()
  125. serverConfig := &core.Config{
  126. App: []*serial.TypedMessage{
  127. serial.ToTypedMessage(&log.Config{
  128. ErrorLogLevel: clog.Severity_Debug,
  129. ErrorLogType: log.LogType_Console,
  130. }),
  131. },
  132. Inbound: []*core.InboundHandlerConfig{
  133. {
  134. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  135. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  136. Listen: net.NewIPOrDomain(net.LocalHostIP),
  137. }),
  138. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  139. Clients: []*protocol.User{
  140. {
  141. Account: serial.ToTypedMessage(&vless.Account{
  142. Id: userID.String(),
  143. }),
  144. },
  145. },
  146. }),
  147. },
  148. },
  149. Outbound: []*core.OutboundHandlerConfig{
  150. {
  151. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  152. },
  153. },
  154. }
  155. clientPort := tcp.PickPort()
  156. clientConfig := &core.Config{
  157. App: []*serial.TypedMessage{
  158. serial.ToTypedMessage(&log.Config{
  159. ErrorLogLevel: clog.Severity_Debug,
  160. ErrorLogType: log.LogType_Console,
  161. }),
  162. },
  163. Inbound: []*core.InboundHandlerConfig{
  164. {
  165. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  166. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  167. Listen: net.NewIPOrDomain(net.LocalHostIP),
  168. }),
  169. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  170. Address: net.NewIPOrDomain(dest.Address),
  171. Port: uint32(dest.Port),
  172. Networks: []net.Network{net.Network_TCP},
  173. }),
  174. },
  175. },
  176. Outbound: []*core.OutboundHandlerConfig{
  177. {
  178. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  179. MultiplexSettings: &proxyman.MultiplexingConfig{
  180. Enabled: true,
  181. Concurrency: 4,
  182. },
  183. }),
  184. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  185. Vnext: &protocol.ServerEndpoint{
  186. Address: net.NewIPOrDomain(net.LocalHostIP),
  187. Port: uint32(serverPort),
  188. User: &protocol.User{
  189. Account: serial.ToTypedMessage(&vless.Account{
  190. Id: userID.String(),
  191. }),
  192. },
  193. },
  194. }),
  195. },
  196. },
  197. }
  198. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  199. common.Must(err)
  200. defer CloseAllServers(servers)
  201. for range "abcd" {
  202. var errg errgroup.Group
  203. for range 3 {
  204. errg.Go(testTCPConn(clientPort, 10240, time.Second*20))
  205. }
  206. if err := errg.Wait(); err != nil {
  207. t.Fatal(err)
  208. }
  209. time.Sleep(time.Second)
  210. }
  211. }
  212. func TestVlessEncMuxTcp(t *testing.T) {
  213. tcpServer := tcp.Server{
  214. MsgProcessor: xor,
  215. }
  216. dest, err := tcpServer.Start()
  217. common.Must(err)
  218. defer tcpServer.Close()
  219. userID := protocol.NewID(uuid.New())
  220. serverPort := tcp.PickPort()
  221. serverConfig := &core.Config{
  222. App: []*serial.TypedMessage{
  223. serial.ToTypedMessage(&log.Config{
  224. ErrorLogLevel: clog.Severity_Debug,
  225. ErrorLogType: log.LogType_Console,
  226. }),
  227. },
  228. Inbound: []*core.InboundHandlerConfig{
  229. {
  230. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  231. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  232. Listen: net.NewIPOrDomain(net.LocalHostIP),
  233. }),
  234. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  235. Clients: []*protocol.User{
  236. {
  237. Account: serial.ToTypedMessage(&vless.Account{
  238. Id: userID.String(),
  239. }),
  240. },
  241. },
  242. SecondsFrom: 600, //mlkem768x25519plus.native.600s.
  243. Decryption: "Gzh5Aa3Ibo3343XFC7V2a8ucOpFeGjOL6jMlBZAfjqyty2rdRms8xccBAm68imYw2q96gg2dcueeL2r7n_2YzQ",
  244. }),
  245. },
  246. },
  247. Outbound: []*core.OutboundHandlerConfig{
  248. {
  249. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  250. },
  251. },
  252. }
  253. clientPort := tcp.PickPort()
  254. clientConfig := &core.Config{
  255. App: []*serial.TypedMessage{
  256. serial.ToTypedMessage(&log.Config{
  257. ErrorLogLevel: clog.Severity_Debug,
  258. ErrorLogType: log.LogType_Console,
  259. }),
  260. },
  261. Inbound: []*core.InboundHandlerConfig{
  262. {
  263. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  264. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  265. Listen: net.NewIPOrDomain(net.LocalHostIP),
  266. }),
  267. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  268. Address: net.NewIPOrDomain(dest.Address),
  269. Port: uint32(dest.Port),
  270. Networks: []net.Network{net.Network_TCP},
  271. }),
  272. },
  273. },
  274. Outbound: []*core.OutboundHandlerConfig{
  275. {
  276. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  277. MultiplexSettings: &proxyman.MultiplexingConfig{
  278. Enabled: true,
  279. Concurrency: 4,
  280. },
  281. }),
  282. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  283. Vnext: &protocol.ServerEndpoint{
  284. Address: net.NewIPOrDomain(net.LocalHostIP),
  285. Port: uint32(serverPort),
  286. User: &protocol.User{
  287. Account: serial.ToTypedMessage(&vless.Account{
  288. Id: userID.String(),
  289. Seconds: 1, //mlkem768x25519plus.native.0rtt.
  290. Encryption: "ExaMB4tIHpFikMeZwAJ8_8hxpZNi3gY13Ft455yC04xiCWgWUwMvKUwDQVm8zLcE8EKnjVlhRDmkTzMzvTMZyYlswCuqx0YK9kVNNFcrQJWD8JpAmTN8fffApIoWitDEAUTEp9S_Ehxo-9a2evRyKqJcQ6WmPiiyGbZrnNAfLKhdRsA15rZt6eKMVQExtDpucfaFc2E4-GtKzKd7P0I6bXccC1q4gqyZcXiEfOmmWBTPMTkNPEUdnQVsPiSWgJxslQZ5pYlPE7GQE7qoxYBItDMhkHZ4l0YwsvgZ1EQ2yTEn9DOxbyMihLk4kSAtg1IrW7tCTNkhyVsUY3SeyReB2sfN2AU-TXmVGUJMTKJ1jfywu8JIb9lG14HB1Rku6nVNcIMTzyshvsi_8AQFCSOcDdQ7ZpBxKxW7N1tKXBI0shq7vWdufjpYCjAVh-k_QgonVOwadYt-wPMxDntbWzEf_yC9eFQ6cBGd5smWNeSQZwAvqXw_WVPD56EVlaQ5HpsOkqBdy1Enr1NnH7WdgNsfk6RSQhRgW1dF9XBUKylpqsvOXkq3I0fLuuJFfuEZu4MeNvdgI2mbM_UxK8AzlRwkm7Eb1WQfm-S05HJefdZzu8kHYamggwtNQum_NtODzRgw3uWbjYbEBIY0j9IMhyGynOYQHHmrR2kT-dh08GwVD7BfsJRvFYgy2ZI8a3xGgHyi6MKKE8g7krEd-ne_4ddSaysgctaiiLwI4NVRbYJIT8XEbmKTIwoZx4R7m7AffYJo2NlfEPREg8stBcY5dAGXeSwD0pxs-jCJOeifQYq7Elq216SrwCmayLg3XJcpxutOmkhai6hRO6eBP6uy9XlLXyMt3TW6isx_rRt1hXCezkl_8hPEcqI9tPE0ZYVQ-eMh2_e35gQyPUw02aequ4ojaHV03QaSMquqF8RXG7k1gDed9vqex3aFaSN6UUNkebLKrqAiPmq0fccQ3qdbAxLGZ0ZFF5mIwEiFoTM6V4yPgntkRYtxcCKK-5YkPfsIunrM3EsWDCovp_Ahdfs-aqQLqzk1wVKTLQaQI5ApBlmGB3EauNdHFJBoeGZOF9e7QbGujhGRGMpS1fFtI2SqlcXINZU7YvR2JMfBrvBYZ9whXawM_Rg31IJR1raMGAEm6hNpa7SBD0cprIZxG6HKUQFMGHVlVohjwpWE5AGIc5Rc8Va2x8e3zFTMTUIwCdMz1XlNaqBMldJx01JQLwgSsnfGGlEJ_jYujvYNo0EBk4yev1Ap6nO-zSU-WtimlhEP0-cb22Q6e4wCEnWfO-lABJsrhwhrbloM51k5QVIefNyIvDWBszpRsreidUZVU4TOH2EoltYslWdPkcckfCplFLyvGKBItoAPRTOKRCjOsqlmj9OvpbDCzedZUmjLNfoLSwsPC7Nk2FpIkVUG6WxCE2YiU9LFrZIgWRKwUluM_at9w7wowRkujXEAQiJKtuUWQCxGyVbJtufLmQI6_yafmwgLoSlyE0cL-_Rf4nBCBjJnmyBDRvAoA-W08vw53uMt3RnFVwKFqo3PonmYAETv5rrMjh3L3K16QS-2EgL_R7WAFd0",
  291. }),
  292. },
  293. },
  294. }),
  295. },
  296. },
  297. }
  298. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  299. common.Must(err)
  300. defer CloseAllServers(servers)
  301. for range "abcd" {
  302. var errg errgroup.Group
  303. for range 3 {
  304. errg.Go(testTCPConn(clientPort, 10240, time.Second*20))
  305. }
  306. if err := errg.Wait(); err != nil {
  307. t.Fatal(err)
  308. }
  309. time.Sleep(time.Second)
  310. }
  311. }
  312. func TestVlessTls(t *testing.T) {
  313. tcpServer := tcp.Server{
  314. MsgProcessor: xor,
  315. }
  316. dest, err := tcpServer.Start()
  317. common.Must(err)
  318. defer tcpServer.Close()
  319. userID := protocol.NewID(uuid.New())
  320. serverPort := tcp.PickPort()
  321. serverConfig := &core.Config{
  322. App: []*serial.TypedMessage{
  323. serial.ToTypedMessage(&log.Config{
  324. ErrorLogLevel: clog.Severity_Debug,
  325. ErrorLogType: log.LogType_Console,
  326. }),
  327. },
  328. Inbound: []*core.InboundHandlerConfig{
  329. {
  330. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  331. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  332. Listen: net.NewIPOrDomain(net.LocalHostIP),
  333. StreamSettings: &internet.StreamConfig{
  334. ProtocolName: "tcp",
  335. SecurityType: serial.GetMessageType(&tls.Config{}),
  336. SecuritySettings: []*serial.TypedMessage{
  337. serial.ToTypedMessage(&tls.Config{
  338. Certificate: []*tls.Certificate{tls.ParseCertificate(cert.MustGenerate(nil))},
  339. }),
  340. },
  341. },
  342. }),
  343. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  344. Clients: []*protocol.User{
  345. {
  346. Account: serial.ToTypedMessage(&vless.Account{
  347. Id: userID.String(),
  348. }),
  349. },
  350. },
  351. }),
  352. },
  353. },
  354. Outbound: []*core.OutboundHandlerConfig{
  355. {
  356. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  357. },
  358. },
  359. }
  360. clientPort := tcp.PickPort()
  361. clientConfig := &core.Config{
  362. App: []*serial.TypedMessage{
  363. serial.ToTypedMessage(&log.Config{
  364. ErrorLogLevel: clog.Severity_Debug,
  365. ErrorLogType: log.LogType_Console,
  366. }),
  367. },
  368. Inbound: []*core.InboundHandlerConfig{
  369. {
  370. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  371. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  372. Listen: net.NewIPOrDomain(net.LocalHostIP),
  373. }),
  374. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  375. Address: net.NewIPOrDomain(dest.Address),
  376. Port: uint32(dest.Port),
  377. Networks: []net.Network{net.Network_TCP},
  378. }),
  379. },
  380. },
  381. Outbound: []*core.OutboundHandlerConfig{
  382. {
  383. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  384. Vnext: &protocol.ServerEndpoint{
  385. Address: net.NewIPOrDomain(net.LocalHostIP),
  386. Port: uint32(serverPort),
  387. User: &protocol.User{
  388. Account: serial.ToTypedMessage(&vless.Account{
  389. Id: userID.String(),
  390. }),
  391. },
  392. },
  393. }),
  394. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  395. StreamSettings: &internet.StreamConfig{
  396. ProtocolName: "tcp",
  397. TransportSettings: []*internet.TransportConfig{
  398. {
  399. ProtocolName: "tcp",
  400. Settings: serial.ToTypedMessage(&transtcp.Config{}),
  401. },
  402. },
  403. SecurityType: serial.GetMessageType(&tls.Config{}),
  404. SecuritySettings: []*serial.TypedMessage{
  405. serial.ToTypedMessage(&tls.Config{
  406. AllowInsecure: true,
  407. }),
  408. },
  409. },
  410. }),
  411. },
  412. },
  413. }
  414. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  415. common.Must(err)
  416. defer CloseAllServers(servers)
  417. var errg errgroup.Group
  418. for range 3 {
  419. errg.Go(testTCPConn(clientPort, 1024*1024, time.Second*30))
  420. }
  421. if err := errg.Wait(); err != nil {
  422. t.Error(err)
  423. }
  424. }
  425. func TestVlessXtlsVision(t *testing.T) {
  426. tcpServer := tcp.Server{
  427. MsgProcessor: xor,
  428. }
  429. dest, err := tcpServer.Start()
  430. common.Must(err)
  431. defer tcpServer.Close()
  432. userID := protocol.NewID(uuid.New())
  433. serverPort := tcp.PickPort()
  434. serverConfig := &core.Config{
  435. App: []*serial.TypedMessage{
  436. serial.ToTypedMessage(&log.Config{
  437. ErrorLogLevel: clog.Severity_Debug,
  438. ErrorLogType: log.LogType_Console,
  439. }),
  440. },
  441. Inbound: []*core.InboundHandlerConfig{
  442. {
  443. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  444. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  445. Listen: net.NewIPOrDomain(net.LocalHostIP),
  446. StreamSettings: &internet.StreamConfig{
  447. ProtocolName: "tcp",
  448. SecurityType: serial.GetMessageType(&tls.Config{}),
  449. SecuritySettings: []*serial.TypedMessage{
  450. serial.ToTypedMessage(&tls.Config{
  451. Certificate: []*tls.Certificate{tls.ParseCertificate(cert.MustGenerate(nil))},
  452. }),
  453. },
  454. },
  455. }),
  456. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  457. Clients: []*protocol.User{
  458. {
  459. Account: serial.ToTypedMessage(&vless.Account{
  460. Id: userID.String(),
  461. Flow: vless.XRV,
  462. }),
  463. },
  464. },
  465. }),
  466. },
  467. },
  468. Outbound: []*core.OutboundHandlerConfig{
  469. {
  470. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  471. },
  472. },
  473. }
  474. clientPort := tcp.PickPort()
  475. clientConfig := &core.Config{
  476. App: []*serial.TypedMessage{
  477. serial.ToTypedMessage(&log.Config{
  478. ErrorLogLevel: clog.Severity_Debug,
  479. ErrorLogType: log.LogType_Console,
  480. }),
  481. },
  482. Inbound: []*core.InboundHandlerConfig{
  483. {
  484. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  485. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  486. Listen: net.NewIPOrDomain(net.LocalHostIP),
  487. }),
  488. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  489. Address: net.NewIPOrDomain(dest.Address),
  490. Port: uint32(dest.Port),
  491. Networks: []net.Network{net.Network_TCP},
  492. }),
  493. },
  494. },
  495. Outbound: []*core.OutboundHandlerConfig{
  496. {
  497. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  498. Vnext: &protocol.ServerEndpoint{
  499. Address: net.NewIPOrDomain(net.LocalHostIP),
  500. Port: uint32(serverPort),
  501. User: &protocol.User{
  502. Account: serial.ToTypedMessage(&vless.Account{
  503. Id: userID.String(),
  504. Flow: vless.XRV,
  505. }),
  506. },
  507. },
  508. }),
  509. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  510. StreamSettings: &internet.StreamConfig{
  511. ProtocolName: "tcp",
  512. TransportSettings: []*internet.TransportConfig{
  513. {
  514. ProtocolName: "tcp",
  515. Settings: serial.ToTypedMessage(&transtcp.Config{}),
  516. },
  517. },
  518. SecurityType: serial.GetMessageType(&tls.Config{}),
  519. SecuritySettings: []*serial.TypedMessage{
  520. serial.ToTypedMessage(&tls.Config{
  521. AllowInsecure: true,
  522. }),
  523. },
  524. },
  525. }),
  526. },
  527. },
  528. }
  529. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  530. common.Must(err)
  531. defer CloseAllServers(servers)
  532. var errg errgroup.Group
  533. for range 3 {
  534. errg.Go(testTCPConn(clientPort, 1024*1024, time.Second*30))
  535. }
  536. if err := errg.Wait(); err != nil {
  537. t.Error(err)
  538. }
  539. }
  540. func TestVlessXtlsVisionReality(t *testing.T) {
  541. tcpServer := tcp.Server{
  542. MsgProcessor: xor,
  543. }
  544. dest, err := tcpServer.Start()
  545. common.Must(err)
  546. defer tcpServer.Close()
  547. userID := protocol.NewID(uuid.New())
  548. serverPort := tcp.PickPort()
  549. privateKey, _ := base64.RawURLEncoding.DecodeString("aGSYystUbf59_9_6LKRxD27rmSW_-2_nyd9YG_Gwbks")
  550. publicKey, _ := base64.RawURLEncoding.DecodeString("E59WjnvZcQMu7tR7_BgyhycuEdBS-CtKxfImRCdAvFM")
  551. shortIds := make([][]byte, 1)
  552. shortIds[0] = make([]byte, 8)
  553. hex.Decode(shortIds[0], []byte("0123456789abcdef"))
  554. serverConfig := &core.Config{
  555. App: []*serial.TypedMessage{
  556. serial.ToTypedMessage(&log.Config{
  557. ErrorLogLevel: clog.Severity_Debug,
  558. ErrorLogType: log.LogType_Console,
  559. }),
  560. },
  561. Inbound: []*core.InboundHandlerConfig{
  562. {
  563. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  564. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  565. Listen: net.NewIPOrDomain(net.LocalHostIP),
  566. StreamSettings: &internet.StreamConfig{
  567. ProtocolName: "tcp",
  568. SecurityType: serial.GetMessageType(&reality.Config{}),
  569. SecuritySettings: []*serial.TypedMessage{
  570. serial.ToTypedMessage(&reality.Config{
  571. Show: true,
  572. Dest: "www.google.com:443", // use google for now, may fail in some region
  573. ServerNames: []string{"www.google.com"},
  574. PrivateKey: privateKey,
  575. ShortIds: shortIds,
  576. Type: "tcp",
  577. }),
  578. },
  579. },
  580. }),
  581. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  582. Clients: []*protocol.User{
  583. {
  584. Account: serial.ToTypedMessage(&vless.Account{
  585. Id: userID.String(),
  586. Flow: vless.XRV,
  587. }),
  588. },
  589. },
  590. }),
  591. },
  592. },
  593. Outbound: []*core.OutboundHandlerConfig{
  594. {
  595. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  596. },
  597. },
  598. }
  599. clientPort := tcp.PickPort()
  600. clientConfig := &core.Config{
  601. App: []*serial.TypedMessage{
  602. serial.ToTypedMessage(&log.Config{
  603. ErrorLogLevel: clog.Severity_Debug,
  604. ErrorLogType: log.LogType_Console,
  605. }),
  606. },
  607. Inbound: []*core.InboundHandlerConfig{
  608. {
  609. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  610. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  611. Listen: net.NewIPOrDomain(net.LocalHostIP),
  612. }),
  613. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  614. Address: net.NewIPOrDomain(dest.Address),
  615. Port: uint32(dest.Port),
  616. Networks: []net.Network{net.Network_TCP},
  617. }),
  618. },
  619. },
  620. Outbound: []*core.OutboundHandlerConfig{
  621. {
  622. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  623. Vnext: &protocol.ServerEndpoint{
  624. Address: net.NewIPOrDomain(net.LocalHostIP),
  625. Port: uint32(serverPort),
  626. User: &protocol.User{
  627. Account: serial.ToTypedMessage(&vless.Account{
  628. Id: userID.String(),
  629. Flow: vless.XRV,
  630. }),
  631. },
  632. },
  633. }),
  634. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  635. StreamSettings: &internet.StreamConfig{
  636. ProtocolName: "tcp",
  637. TransportSettings: []*internet.TransportConfig{
  638. {
  639. ProtocolName: "tcp",
  640. Settings: serial.ToTypedMessage(&transtcp.Config{}),
  641. },
  642. },
  643. SecurityType: serial.GetMessageType(&reality.Config{}),
  644. SecuritySettings: []*serial.TypedMessage{
  645. serial.ToTypedMessage(&reality.Config{
  646. Show: true,
  647. Fingerprint: "chrome",
  648. ServerName: "www.google.com",
  649. PublicKey: publicKey,
  650. ShortId: shortIds[0],
  651. SpiderX: "/",
  652. }),
  653. },
  654. },
  655. }),
  656. },
  657. },
  658. }
  659. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  660. common.Must(err)
  661. defer CloseAllServers(servers)
  662. var errg errgroup.Group
  663. for range 3 {
  664. errg.Go(testTCPConn(clientPort, 1024*1024, time.Second*30))
  665. }
  666. if err := errg.Wait(); err != nil {
  667. t.Error(err)
  668. }
  669. }