vmess_test.go 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413
  1. package scenarios
  2. import (
  3. "crypto/rand"
  4. "sync"
  5. "testing"
  6. "time"
  7. "v2ray.com/core"
  8. "v2ray.com/core/app/log"
  9. "v2ray.com/core/app/proxyman"
  10. clog "v2ray.com/core/common/log"
  11. "v2ray.com/core/common/net"
  12. "v2ray.com/core/common/protocol"
  13. "v2ray.com/core/common/serial"
  14. "v2ray.com/core/common/uuid"
  15. "v2ray.com/core/proxy/dokodemo"
  16. "v2ray.com/core/proxy/freedom"
  17. "v2ray.com/core/proxy/vmess"
  18. "v2ray.com/core/proxy/vmess/inbound"
  19. "v2ray.com/core/proxy/vmess/outbound"
  20. "v2ray.com/core/testing/servers/tcp"
  21. "v2ray.com/core/testing/servers/udp"
  22. "v2ray.com/core/transport/internet"
  23. "v2ray.com/core/transport/internet/kcp"
  24. . "v2ray.com/ext/assert"
  25. )
  26. func TestVMessDynamicPort(t *testing.T) {
  27. assert := With(t)
  28. tcpServer := tcp.Server{
  29. MsgProcessor: xor,
  30. }
  31. dest, err := tcpServer.Start()
  32. assert(err, IsNil)
  33. defer tcpServer.Close()
  34. userID := protocol.NewID(uuid.New())
  35. serverPort := tcp.PickPort()
  36. serverConfig := &core.Config{
  37. App: []*serial.TypedMessage{
  38. serial.ToTypedMessage(&log.Config{
  39. ErrorLogLevel: clog.Severity_Debug,
  40. ErrorLogType: log.LogType_Console,
  41. }),
  42. },
  43. Inbound: []*core.InboundHandlerConfig{
  44. {
  45. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  46. PortRange: net.SinglePortRange(serverPort),
  47. Listen: net.NewIPOrDomain(net.LocalHostIP),
  48. }),
  49. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  50. User: []*protocol.User{
  51. {
  52. Account: serial.ToTypedMessage(&vmess.Account{
  53. Id: userID.String(),
  54. }),
  55. },
  56. },
  57. Detour: &inbound.DetourConfig{
  58. To: "detour",
  59. },
  60. }),
  61. },
  62. {
  63. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  64. PortRange: &net.PortRange{
  65. From: uint32(serverPort + 1),
  66. To: uint32(serverPort + 100),
  67. },
  68. Listen: net.NewIPOrDomain(net.LocalHostIP),
  69. AllocationStrategy: &proxyman.AllocationStrategy{
  70. Type: proxyman.AllocationStrategy_Random,
  71. Concurrency: &proxyman.AllocationStrategy_AllocationStrategyConcurrency{
  72. Value: 2,
  73. },
  74. Refresh: &proxyman.AllocationStrategy_AllocationStrategyRefresh{
  75. Value: 5,
  76. },
  77. },
  78. }),
  79. ProxySettings: serial.ToTypedMessage(&inbound.Config{}),
  80. Tag: "detour",
  81. },
  82. },
  83. Outbound: []*core.OutboundHandlerConfig{
  84. {
  85. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  86. },
  87. },
  88. }
  89. clientPort := tcp.PickPort()
  90. clientConfig := &core.Config{
  91. App: []*serial.TypedMessage{
  92. serial.ToTypedMessage(&log.Config{
  93. ErrorLogLevel: clog.Severity_Debug,
  94. ErrorLogType: log.LogType_Console,
  95. }),
  96. },
  97. Inbound: []*core.InboundHandlerConfig{
  98. {
  99. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  100. PortRange: net.SinglePortRange(clientPort),
  101. Listen: net.NewIPOrDomain(net.LocalHostIP),
  102. }),
  103. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  104. Address: net.NewIPOrDomain(dest.Address),
  105. Port: uint32(dest.Port),
  106. NetworkList: &net.NetworkList{
  107. Network: []net.Network{net.Network_TCP},
  108. },
  109. }),
  110. },
  111. },
  112. Outbound: []*core.OutboundHandlerConfig{
  113. {
  114. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  115. Receiver: []*protocol.ServerEndpoint{
  116. {
  117. Address: net.NewIPOrDomain(net.LocalHostIP),
  118. Port: uint32(serverPort),
  119. User: []*protocol.User{
  120. {
  121. Account: serial.ToTypedMessage(&vmess.Account{
  122. Id: userID.String(),
  123. }),
  124. },
  125. },
  126. },
  127. },
  128. }),
  129. },
  130. },
  131. }
  132. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  133. assert(err, IsNil)
  134. for i := 0; i < 10; i++ {
  135. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  136. IP: []byte{127, 0, 0, 1},
  137. Port: int(clientPort),
  138. })
  139. assert(err, IsNil)
  140. payload := "dokodemo request."
  141. nBytes, err := conn.Write([]byte(payload))
  142. assert(err, IsNil)
  143. assert(nBytes, Equals, len(payload))
  144. response := make([]byte, 1024)
  145. nBytes, err = conn.Read(response)
  146. assert(err, IsNil)
  147. assert(response[:nBytes], Equals, xor([]byte(payload)))
  148. assert(conn.Close(), IsNil)
  149. }
  150. CloseAllServers(servers)
  151. }
  152. func TestVMessGCM(t *testing.T) {
  153. assert := With(t)
  154. tcpServer := tcp.Server{
  155. MsgProcessor: xor,
  156. }
  157. dest, err := tcpServer.Start()
  158. assert(err, IsNil)
  159. defer tcpServer.Close()
  160. userID := protocol.NewID(uuid.New())
  161. serverPort := tcp.PickPort()
  162. serverConfig := &core.Config{
  163. App: []*serial.TypedMessage{
  164. serial.ToTypedMessage(&log.Config{
  165. ErrorLogLevel: clog.Severity_Debug,
  166. ErrorLogType: log.LogType_Console,
  167. }),
  168. },
  169. Inbound: []*core.InboundHandlerConfig{
  170. {
  171. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  172. PortRange: net.SinglePortRange(serverPort),
  173. Listen: net.NewIPOrDomain(net.LocalHostIP),
  174. }),
  175. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  176. User: []*protocol.User{
  177. {
  178. Account: serial.ToTypedMessage(&vmess.Account{
  179. Id: userID.String(),
  180. AlterId: 64,
  181. }),
  182. },
  183. },
  184. }),
  185. },
  186. },
  187. Outbound: []*core.OutboundHandlerConfig{
  188. {
  189. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  190. },
  191. },
  192. }
  193. clientPort := tcp.PickPort()
  194. clientConfig := &core.Config{
  195. App: []*serial.TypedMessage{
  196. serial.ToTypedMessage(&log.Config{
  197. ErrorLogLevel: clog.Severity_Debug,
  198. ErrorLogType: log.LogType_Console,
  199. }),
  200. },
  201. Inbound: []*core.InboundHandlerConfig{
  202. {
  203. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  204. PortRange: net.SinglePortRange(clientPort),
  205. Listen: net.NewIPOrDomain(net.LocalHostIP),
  206. }),
  207. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  208. Address: net.NewIPOrDomain(dest.Address),
  209. Port: uint32(dest.Port),
  210. NetworkList: &net.NetworkList{
  211. Network: []net.Network{net.Network_TCP},
  212. },
  213. }),
  214. },
  215. },
  216. Outbound: []*core.OutboundHandlerConfig{
  217. {
  218. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  219. Receiver: []*protocol.ServerEndpoint{
  220. {
  221. Address: net.NewIPOrDomain(net.LocalHostIP),
  222. Port: uint32(serverPort),
  223. User: []*protocol.User{
  224. {
  225. Account: serial.ToTypedMessage(&vmess.Account{
  226. Id: userID.String(),
  227. AlterId: 64,
  228. SecuritySettings: &protocol.SecurityConfig{
  229. Type: protocol.SecurityType_AES128_GCM,
  230. },
  231. }),
  232. },
  233. },
  234. },
  235. },
  236. }),
  237. },
  238. },
  239. }
  240. /*
  241. const envName = "V2RAY_VMESS_PADDING"
  242. common.Must(os.Setenv(envName, "1"))
  243. defer os.Unsetenv(envName)
  244. */
  245. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  246. assert(err, IsNil)
  247. defer CloseAllServers(servers)
  248. var wg sync.WaitGroup
  249. wg.Add(10)
  250. for i := 0; i < 10; i++ {
  251. go func() {
  252. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  253. IP: []byte{127, 0, 0, 1},
  254. Port: int(clientPort),
  255. })
  256. assert(err, IsNil)
  257. payload := make([]byte, 10240*1024)
  258. rand.Read(payload)
  259. nBytes, err := conn.Write([]byte(payload))
  260. assert(err, IsNil)
  261. assert(nBytes, Equals, len(payload))
  262. response := readFrom(conn, time.Second*20, 10240*1024)
  263. assert(response, Equals, xor([]byte(payload)))
  264. assert(conn.Close(), IsNil)
  265. wg.Done()
  266. }()
  267. }
  268. wg.Wait()
  269. }
  270. func TestVMessGCMUDP(t *testing.T) {
  271. assert := With(t)
  272. udpServer := udp.Server{
  273. MsgProcessor: xor,
  274. }
  275. dest, err := udpServer.Start()
  276. assert(err, IsNil)
  277. defer udpServer.Close()
  278. userID := protocol.NewID(uuid.New())
  279. serverPort := tcp.PickPort()
  280. serverConfig := &core.Config{
  281. App: []*serial.TypedMessage{
  282. serial.ToTypedMessage(&log.Config{
  283. ErrorLogLevel: clog.Severity_Debug,
  284. ErrorLogType: log.LogType_Console,
  285. }),
  286. },
  287. Inbound: []*core.InboundHandlerConfig{
  288. {
  289. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  290. PortRange: net.SinglePortRange(serverPort),
  291. Listen: net.NewIPOrDomain(net.LocalHostIP),
  292. }),
  293. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  294. User: []*protocol.User{
  295. {
  296. Account: serial.ToTypedMessage(&vmess.Account{
  297. Id: userID.String(),
  298. AlterId: 64,
  299. }),
  300. },
  301. },
  302. }),
  303. },
  304. },
  305. Outbound: []*core.OutboundHandlerConfig{
  306. {
  307. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  308. },
  309. },
  310. }
  311. clientPort := tcp.PickPort()
  312. clientConfig := &core.Config{
  313. App: []*serial.TypedMessage{
  314. serial.ToTypedMessage(&log.Config{
  315. ErrorLogLevel: clog.Severity_Debug,
  316. ErrorLogType: log.LogType_Console,
  317. }),
  318. },
  319. Inbound: []*core.InboundHandlerConfig{
  320. {
  321. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  322. PortRange: net.SinglePortRange(clientPort),
  323. Listen: net.NewIPOrDomain(net.LocalHostIP),
  324. }),
  325. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  326. Address: net.NewIPOrDomain(dest.Address),
  327. Port: uint32(dest.Port),
  328. NetworkList: &net.NetworkList{
  329. Network: []net.Network{net.Network_UDP},
  330. },
  331. }),
  332. },
  333. },
  334. Outbound: []*core.OutboundHandlerConfig{
  335. {
  336. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  337. Receiver: []*protocol.ServerEndpoint{
  338. {
  339. Address: net.NewIPOrDomain(net.LocalHostIP),
  340. Port: uint32(serverPort),
  341. User: []*protocol.User{
  342. {
  343. Account: serial.ToTypedMessage(&vmess.Account{
  344. Id: userID.String(),
  345. AlterId: 64,
  346. SecuritySettings: &protocol.SecurityConfig{
  347. Type: protocol.SecurityType_AES128_GCM,
  348. },
  349. }),
  350. },
  351. },
  352. },
  353. },
  354. }),
  355. },
  356. },
  357. }
  358. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  359. assert(err, IsNil)
  360. var wg sync.WaitGroup
  361. wg.Add(10)
  362. for i := 0; i < 10; i++ {
  363. go func() {
  364. conn, err := net.DialUDP("udp", nil, &net.UDPAddr{
  365. IP: []byte{127, 0, 0, 1},
  366. Port: int(clientPort),
  367. })
  368. assert(err, IsNil)
  369. payload := make([]byte, 1024)
  370. rand.Read(payload)
  371. nBytes, err := conn.Write([]byte(payload))
  372. assert(err, IsNil)
  373. assert(nBytes, Equals, len(payload))
  374. payload1 := make([]byte, 1024)
  375. rand.Read(payload1)
  376. nBytes, err = conn.Write([]byte(payload1))
  377. assert(err, IsNil)
  378. assert(nBytes, Equals, len(payload1))
  379. response := readFrom(conn, time.Second*5, 1024)
  380. assert(response, Equals, xor([]byte(payload)))
  381. response = readFrom(conn, time.Second*5, 1024)
  382. assert(response, Equals, xor([]byte(payload1)))
  383. assert(conn.Close(), IsNil)
  384. wg.Done()
  385. }()
  386. }
  387. wg.Wait()
  388. CloseAllServers(servers)
  389. }
  390. func TestVMessChacha20(t *testing.T) {
  391. assert := With(t)
  392. tcpServer := tcp.Server{
  393. MsgProcessor: xor,
  394. }
  395. dest, err := tcpServer.Start()
  396. assert(err, IsNil)
  397. defer tcpServer.Close()
  398. userID := protocol.NewID(uuid.New())
  399. serverPort := tcp.PickPort()
  400. serverConfig := &core.Config{
  401. App: []*serial.TypedMessage{
  402. serial.ToTypedMessage(&log.Config{
  403. ErrorLogLevel: clog.Severity_Debug,
  404. ErrorLogType: log.LogType_Console,
  405. }),
  406. },
  407. Inbound: []*core.InboundHandlerConfig{
  408. {
  409. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  410. PortRange: net.SinglePortRange(serverPort),
  411. Listen: net.NewIPOrDomain(net.LocalHostIP),
  412. }),
  413. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  414. User: []*protocol.User{
  415. {
  416. Account: serial.ToTypedMessage(&vmess.Account{
  417. Id: userID.String(),
  418. AlterId: 64,
  419. }),
  420. },
  421. },
  422. }),
  423. },
  424. },
  425. Outbound: []*core.OutboundHandlerConfig{
  426. {
  427. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  428. },
  429. },
  430. }
  431. clientPort := tcp.PickPort()
  432. clientConfig := &core.Config{
  433. App: []*serial.TypedMessage{
  434. serial.ToTypedMessage(&log.Config{
  435. ErrorLogLevel: clog.Severity_Debug,
  436. ErrorLogType: log.LogType_Console,
  437. }),
  438. },
  439. Inbound: []*core.InboundHandlerConfig{
  440. {
  441. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  442. PortRange: net.SinglePortRange(clientPort),
  443. Listen: net.NewIPOrDomain(net.LocalHostIP),
  444. }),
  445. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  446. Address: net.NewIPOrDomain(dest.Address),
  447. Port: uint32(dest.Port),
  448. NetworkList: &net.NetworkList{
  449. Network: []net.Network{net.Network_TCP},
  450. },
  451. }),
  452. },
  453. },
  454. Outbound: []*core.OutboundHandlerConfig{
  455. {
  456. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  457. Receiver: []*protocol.ServerEndpoint{
  458. {
  459. Address: net.NewIPOrDomain(net.LocalHostIP),
  460. Port: uint32(serverPort),
  461. User: []*protocol.User{
  462. {
  463. Account: serial.ToTypedMessage(&vmess.Account{
  464. Id: userID.String(),
  465. AlterId: 64,
  466. SecuritySettings: &protocol.SecurityConfig{
  467. Type: protocol.SecurityType_CHACHA20_POLY1305,
  468. },
  469. }),
  470. },
  471. },
  472. },
  473. },
  474. }),
  475. },
  476. },
  477. }
  478. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  479. assert(err, IsNil)
  480. var wg sync.WaitGroup
  481. wg.Add(10)
  482. for i := 0; i < 10; i++ {
  483. go func() {
  484. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  485. IP: []byte{127, 0, 0, 1},
  486. Port: int(clientPort),
  487. })
  488. assert(err, IsNil)
  489. payload := make([]byte, 10240*1024)
  490. rand.Read(payload)
  491. nBytes, err := conn.Write([]byte(payload))
  492. assert(err, IsNil)
  493. assert(nBytes, Equals, len(payload))
  494. response := readFrom(conn, time.Second*20, 10240*1024)
  495. assert(response, Equals, xor([]byte(payload)))
  496. assert(conn.Close(), IsNil)
  497. wg.Done()
  498. }()
  499. }
  500. wg.Wait()
  501. CloseAllServers(servers)
  502. }
  503. func TestVMessNone(t *testing.T) {
  504. assert := With(t)
  505. tcpServer := tcp.Server{
  506. MsgProcessor: xor,
  507. }
  508. dest, err := tcpServer.Start()
  509. assert(err, IsNil)
  510. defer tcpServer.Close()
  511. userID := protocol.NewID(uuid.New())
  512. serverPort := tcp.PickPort()
  513. serverConfig := &core.Config{
  514. App: []*serial.TypedMessage{
  515. serial.ToTypedMessage(&log.Config{
  516. ErrorLogLevel: clog.Severity_Debug,
  517. ErrorLogType: log.LogType_Console,
  518. }),
  519. },
  520. Inbound: []*core.InboundHandlerConfig{
  521. {
  522. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  523. PortRange: net.SinglePortRange(serverPort),
  524. Listen: net.NewIPOrDomain(net.LocalHostIP),
  525. }),
  526. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  527. User: []*protocol.User{
  528. {
  529. Account: serial.ToTypedMessage(&vmess.Account{
  530. Id: userID.String(),
  531. AlterId: 64,
  532. }),
  533. },
  534. },
  535. }),
  536. },
  537. },
  538. Outbound: []*core.OutboundHandlerConfig{
  539. {
  540. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  541. },
  542. },
  543. }
  544. clientPort := tcp.PickPort()
  545. clientConfig := &core.Config{
  546. App: []*serial.TypedMessage{
  547. serial.ToTypedMessage(&log.Config{
  548. ErrorLogLevel: clog.Severity_Debug,
  549. ErrorLogType: log.LogType_Console,
  550. }),
  551. },
  552. Inbound: []*core.InboundHandlerConfig{
  553. {
  554. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  555. PortRange: net.SinglePortRange(clientPort),
  556. Listen: net.NewIPOrDomain(net.LocalHostIP),
  557. }),
  558. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  559. Address: net.NewIPOrDomain(dest.Address),
  560. Port: uint32(dest.Port),
  561. NetworkList: &net.NetworkList{
  562. Network: []net.Network{net.Network_TCP},
  563. },
  564. }),
  565. },
  566. },
  567. Outbound: []*core.OutboundHandlerConfig{
  568. {
  569. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  570. Receiver: []*protocol.ServerEndpoint{
  571. {
  572. Address: net.NewIPOrDomain(net.LocalHostIP),
  573. Port: uint32(serverPort),
  574. User: []*protocol.User{
  575. {
  576. Account: serial.ToTypedMessage(&vmess.Account{
  577. Id: userID.String(),
  578. AlterId: 64,
  579. SecuritySettings: &protocol.SecurityConfig{
  580. Type: protocol.SecurityType_NONE,
  581. },
  582. }),
  583. },
  584. },
  585. },
  586. },
  587. }),
  588. },
  589. },
  590. }
  591. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  592. assert(err, IsNil)
  593. var wg sync.WaitGroup
  594. wg.Add(10)
  595. for i := 0; i < 10; i++ {
  596. go func() {
  597. defer wg.Done()
  598. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  599. IP: []byte{127, 0, 0, 1},
  600. Port: int(clientPort),
  601. })
  602. assert(err, IsNil)
  603. payload := make([]byte, 1024*1024)
  604. rand.Read(payload)
  605. nBytes, err := conn.Write(payload)
  606. assert(err, IsNil)
  607. assert(nBytes, Equals, len(payload))
  608. response := readFrom(conn, time.Second*30, 1024*1024)
  609. assert(response, Equals, xor(payload))
  610. assert(conn.Close(), IsNil)
  611. }()
  612. }
  613. wg.Wait()
  614. CloseAllServers(servers)
  615. }
  616. func TestVMessKCP(t *testing.T) {
  617. assert := With(t)
  618. tcpServer := tcp.Server{
  619. MsgProcessor: xor,
  620. }
  621. dest, err := tcpServer.Start()
  622. assert(err, IsNil)
  623. defer tcpServer.Close()
  624. userID := protocol.NewID(uuid.New())
  625. serverPort := udp.PickPort()
  626. serverConfig := &core.Config{
  627. App: []*serial.TypedMessage{
  628. serial.ToTypedMessage(&log.Config{
  629. ErrorLogLevel: clog.Severity_Debug,
  630. ErrorLogType: log.LogType_Console,
  631. }),
  632. },
  633. Inbound: []*core.InboundHandlerConfig{
  634. {
  635. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  636. PortRange: net.SinglePortRange(serverPort),
  637. Listen: net.NewIPOrDomain(net.LocalHostIP),
  638. StreamSettings: &internet.StreamConfig{
  639. Protocol: internet.TransportProtocol_MKCP,
  640. },
  641. }),
  642. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  643. User: []*protocol.User{
  644. {
  645. Account: serial.ToTypedMessage(&vmess.Account{
  646. Id: userID.String(),
  647. AlterId: 64,
  648. }),
  649. },
  650. },
  651. }),
  652. },
  653. },
  654. Outbound: []*core.OutboundHandlerConfig{
  655. {
  656. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  657. },
  658. },
  659. }
  660. clientPort := tcp.PickPort()
  661. clientConfig := &core.Config{
  662. App: []*serial.TypedMessage{
  663. serial.ToTypedMessage(&log.Config{
  664. ErrorLogLevel: clog.Severity_Debug,
  665. ErrorLogType: log.LogType_Console,
  666. }),
  667. },
  668. Inbound: []*core.InboundHandlerConfig{
  669. {
  670. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  671. PortRange: net.SinglePortRange(clientPort),
  672. Listen: net.NewIPOrDomain(net.LocalHostIP),
  673. }),
  674. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  675. Address: net.NewIPOrDomain(dest.Address),
  676. Port: uint32(dest.Port),
  677. NetworkList: &net.NetworkList{
  678. Network: []net.Network{net.Network_TCP},
  679. },
  680. }),
  681. },
  682. },
  683. Outbound: []*core.OutboundHandlerConfig{
  684. {
  685. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  686. Receiver: []*protocol.ServerEndpoint{
  687. {
  688. Address: net.NewIPOrDomain(net.LocalHostIP),
  689. Port: uint32(serverPort),
  690. User: []*protocol.User{
  691. {
  692. Account: serial.ToTypedMessage(&vmess.Account{
  693. Id: userID.String(),
  694. AlterId: 64,
  695. SecuritySettings: &protocol.SecurityConfig{
  696. Type: protocol.SecurityType_AES128_GCM,
  697. },
  698. }),
  699. },
  700. },
  701. },
  702. },
  703. }),
  704. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  705. StreamSettings: &internet.StreamConfig{
  706. Protocol: internet.TransportProtocol_MKCP,
  707. },
  708. }),
  709. },
  710. },
  711. }
  712. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  713. assert(err, IsNil)
  714. var wg sync.WaitGroup
  715. for i := 0; i < 10; i++ {
  716. wg.Add(1)
  717. go func() {
  718. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  719. IP: []byte{127, 0, 0, 1},
  720. Port: int(clientPort),
  721. })
  722. assert(err, IsNil)
  723. payload := make([]byte, 10240*1024)
  724. rand.Read(payload)
  725. nBytes, err := conn.Write(payload)
  726. assert(err, IsNil)
  727. assert(nBytes, Equals, len(payload))
  728. response := readFrom(conn, time.Minute*2, 10240*1024)
  729. assert(response, Equals, xor(payload))
  730. assert(conn.Close(), IsNil)
  731. wg.Done()
  732. }()
  733. }
  734. wg.Wait()
  735. CloseAllServers(servers)
  736. }
  737. func TestVMessKCPLarge(t *testing.T) {
  738. assert := With(t)
  739. tcpServer := tcp.Server{
  740. MsgProcessor: xor,
  741. }
  742. dest, err := tcpServer.Start()
  743. assert(err, IsNil)
  744. defer tcpServer.Close()
  745. userID := protocol.NewID(uuid.New())
  746. serverPort := udp.PickPort()
  747. serverConfig := &core.Config{
  748. App: []*serial.TypedMessage{
  749. serial.ToTypedMessage(&log.Config{
  750. ErrorLogLevel: clog.Severity_Debug,
  751. ErrorLogType: log.LogType_Console,
  752. }),
  753. },
  754. Inbound: []*core.InboundHandlerConfig{
  755. {
  756. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  757. PortRange: net.SinglePortRange(serverPort),
  758. Listen: net.NewIPOrDomain(net.LocalHostIP),
  759. StreamSettings: &internet.StreamConfig{
  760. Protocol: internet.TransportProtocol_MKCP,
  761. TransportSettings: []*internet.TransportConfig{
  762. {
  763. Protocol: internet.TransportProtocol_MKCP,
  764. Settings: serial.ToTypedMessage(&kcp.Config{
  765. ReadBuffer: &kcp.ReadBuffer{
  766. Size: 4096,
  767. },
  768. WriteBuffer: &kcp.WriteBuffer{
  769. Size: 4096,
  770. },
  771. UplinkCapacity: &kcp.UplinkCapacity{
  772. Value: 20,
  773. },
  774. DownlinkCapacity: &kcp.DownlinkCapacity{
  775. Value: 20,
  776. },
  777. }),
  778. },
  779. },
  780. },
  781. }),
  782. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  783. User: []*protocol.User{
  784. {
  785. Account: serial.ToTypedMessage(&vmess.Account{
  786. Id: userID.String(),
  787. AlterId: 64,
  788. }),
  789. },
  790. },
  791. }),
  792. },
  793. },
  794. Outbound: []*core.OutboundHandlerConfig{
  795. {
  796. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  797. },
  798. },
  799. }
  800. clientPort := tcp.PickPort()
  801. clientConfig := &core.Config{
  802. App: []*serial.TypedMessage{
  803. serial.ToTypedMessage(&log.Config{
  804. ErrorLogLevel: clog.Severity_Debug,
  805. ErrorLogType: log.LogType_Console,
  806. }),
  807. },
  808. Inbound: []*core.InboundHandlerConfig{
  809. {
  810. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  811. PortRange: net.SinglePortRange(clientPort),
  812. Listen: net.NewIPOrDomain(net.LocalHostIP),
  813. }),
  814. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  815. Address: net.NewIPOrDomain(dest.Address),
  816. Port: uint32(dest.Port),
  817. NetworkList: &net.NetworkList{
  818. Network: []net.Network{net.Network_TCP},
  819. },
  820. }),
  821. },
  822. },
  823. Outbound: []*core.OutboundHandlerConfig{
  824. {
  825. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  826. Receiver: []*protocol.ServerEndpoint{
  827. {
  828. Address: net.NewIPOrDomain(net.LocalHostIP),
  829. Port: uint32(serverPort),
  830. User: []*protocol.User{
  831. {
  832. Account: serial.ToTypedMessage(&vmess.Account{
  833. Id: userID.String(),
  834. AlterId: 64,
  835. SecuritySettings: &protocol.SecurityConfig{
  836. Type: protocol.SecurityType_AES128_GCM,
  837. },
  838. }),
  839. },
  840. },
  841. },
  842. },
  843. }),
  844. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  845. StreamSettings: &internet.StreamConfig{
  846. Protocol: internet.TransportProtocol_MKCP,
  847. TransportSettings: []*internet.TransportConfig{
  848. {
  849. Protocol: internet.TransportProtocol_MKCP,
  850. Settings: serial.ToTypedMessage(&kcp.Config{
  851. ReadBuffer: &kcp.ReadBuffer{
  852. Size: 4096,
  853. },
  854. WriteBuffer: &kcp.WriteBuffer{
  855. Size: 4096,
  856. },
  857. UplinkCapacity: &kcp.UplinkCapacity{
  858. Value: 20,
  859. },
  860. DownlinkCapacity: &kcp.DownlinkCapacity{
  861. Value: 20,
  862. },
  863. }),
  864. },
  865. },
  866. },
  867. }),
  868. },
  869. },
  870. }
  871. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  872. assert(err, IsNil)
  873. var wg sync.WaitGroup
  874. for i := 0; i < 2; i++ {
  875. wg.Add(1)
  876. go func() {
  877. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  878. IP: []byte{127, 0, 0, 1},
  879. Port: int(clientPort),
  880. })
  881. assert(err, IsNil)
  882. payload := make([]byte, 10240*1024)
  883. rand.Read(payload)
  884. nBytes, err := conn.Write(payload)
  885. assert(err, IsNil)
  886. assert(nBytes, Equals, len(payload))
  887. response := readFrom(conn, time.Minute*10, 10240*1024)
  888. assert(response, Equals, xor(payload))
  889. assert(conn.Close(), IsNil)
  890. wg.Done()
  891. }()
  892. }
  893. wg.Wait()
  894. CloseAllServers(servers)
  895. }
  896. func TestVMessIPv6(t *testing.T) {
  897. t.SkipNow() // No IPv6 on travis-ci.
  898. assert := With(t)
  899. tcpServer := tcp.Server{
  900. MsgProcessor: xor,
  901. Listen: net.LocalHostIPv6,
  902. }
  903. dest, err := tcpServer.Start()
  904. assert(err, IsNil)
  905. defer tcpServer.Close()
  906. userID := protocol.NewID(uuid.New())
  907. serverPort := tcp.PickPort()
  908. serverConfig := &core.Config{
  909. App: []*serial.TypedMessage{
  910. serial.ToTypedMessage(&log.Config{
  911. ErrorLogLevel: clog.Severity_Debug,
  912. ErrorLogType: log.LogType_Console,
  913. }),
  914. },
  915. Inbound: []*core.InboundHandlerConfig{
  916. {
  917. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  918. PortRange: net.SinglePortRange(serverPort),
  919. Listen: net.NewIPOrDomain(net.LocalHostIPv6),
  920. }),
  921. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  922. User: []*protocol.User{
  923. {
  924. Account: serial.ToTypedMessage(&vmess.Account{
  925. Id: userID.String(),
  926. AlterId: 64,
  927. }),
  928. },
  929. },
  930. }),
  931. },
  932. },
  933. Outbound: []*core.OutboundHandlerConfig{
  934. {
  935. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  936. },
  937. },
  938. }
  939. clientPort := tcp.PickPort()
  940. clientConfig := &core.Config{
  941. App: []*serial.TypedMessage{
  942. serial.ToTypedMessage(&log.Config{
  943. ErrorLogLevel: clog.Severity_Debug,
  944. ErrorLogType: log.LogType_Console,
  945. }),
  946. },
  947. Inbound: []*core.InboundHandlerConfig{
  948. {
  949. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  950. PortRange: net.SinglePortRange(clientPort),
  951. Listen: net.NewIPOrDomain(net.LocalHostIPv6),
  952. }),
  953. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  954. Address: net.NewIPOrDomain(dest.Address),
  955. Port: uint32(dest.Port),
  956. NetworkList: &net.NetworkList{
  957. Network: []net.Network{net.Network_TCP},
  958. },
  959. }),
  960. },
  961. },
  962. Outbound: []*core.OutboundHandlerConfig{
  963. {
  964. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  965. Receiver: []*protocol.ServerEndpoint{
  966. {
  967. Address: net.NewIPOrDomain(net.LocalHostIPv6),
  968. Port: uint32(serverPort),
  969. User: []*protocol.User{
  970. {
  971. Account: serial.ToTypedMessage(&vmess.Account{
  972. Id: userID.String(),
  973. AlterId: 64,
  974. SecuritySettings: &protocol.SecurityConfig{
  975. Type: protocol.SecurityType_AES128_GCM,
  976. },
  977. }),
  978. },
  979. },
  980. },
  981. },
  982. }),
  983. },
  984. },
  985. }
  986. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  987. assert(err, IsNil)
  988. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  989. IP: net.LocalHostIPv6.IP(),
  990. Port: int(clientPort),
  991. })
  992. assert(err, IsNil)
  993. payload := make([]byte, 1024)
  994. rand.Read(payload)
  995. nBytes, err := conn.Write(payload)
  996. assert(err, IsNil)
  997. assert(nBytes, Equals, len(payload))
  998. response := readFrom(conn, time.Second*20, 1024)
  999. assert(response, Equals, xor(payload))
  1000. assert(conn.Close(), IsNil)
  1001. CloseAllServers(servers)
  1002. }
  1003. func TestVMessGCMMux(t *testing.T) {
  1004. assert := With(t)
  1005. tcpServer := tcp.Server{
  1006. MsgProcessor: xor,
  1007. }
  1008. dest, err := tcpServer.Start()
  1009. assert(err, IsNil)
  1010. defer tcpServer.Close()
  1011. userID := protocol.NewID(uuid.New())
  1012. serverPort := tcp.PickPort()
  1013. serverConfig := &core.Config{
  1014. App: []*serial.TypedMessage{
  1015. serial.ToTypedMessage(&log.Config{
  1016. ErrorLogLevel: clog.Severity_Debug,
  1017. ErrorLogType: log.LogType_Console,
  1018. }),
  1019. },
  1020. Inbound: []*core.InboundHandlerConfig{
  1021. {
  1022. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  1023. PortRange: net.SinglePortRange(serverPort),
  1024. Listen: net.NewIPOrDomain(net.LocalHostIP),
  1025. }),
  1026. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  1027. User: []*protocol.User{
  1028. {
  1029. Account: serial.ToTypedMessage(&vmess.Account{
  1030. Id: userID.String(),
  1031. AlterId: 64,
  1032. }),
  1033. },
  1034. },
  1035. }),
  1036. },
  1037. },
  1038. Outbound: []*core.OutboundHandlerConfig{
  1039. {
  1040. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  1041. },
  1042. },
  1043. }
  1044. clientPort := tcp.PickPort()
  1045. clientConfig := &core.Config{
  1046. App: []*serial.TypedMessage{
  1047. serial.ToTypedMessage(&log.Config{
  1048. ErrorLogLevel: clog.Severity_Debug,
  1049. ErrorLogType: log.LogType_Console,
  1050. }),
  1051. },
  1052. Inbound: []*core.InboundHandlerConfig{
  1053. {
  1054. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  1055. PortRange: net.SinglePortRange(clientPort),
  1056. Listen: net.NewIPOrDomain(net.LocalHostIP),
  1057. }),
  1058. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  1059. Address: net.NewIPOrDomain(dest.Address),
  1060. Port: uint32(dest.Port),
  1061. NetworkList: &net.NetworkList{
  1062. Network: []net.Network{net.Network_TCP},
  1063. },
  1064. }),
  1065. },
  1066. },
  1067. Outbound: []*core.OutboundHandlerConfig{
  1068. {
  1069. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  1070. MultiplexSettings: &proxyman.MultiplexingConfig{
  1071. Enabled: true,
  1072. Concurrency: 4,
  1073. },
  1074. }),
  1075. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  1076. Receiver: []*protocol.ServerEndpoint{
  1077. {
  1078. Address: net.NewIPOrDomain(net.LocalHostIP),
  1079. Port: uint32(serverPort),
  1080. User: []*protocol.User{
  1081. {
  1082. Account: serial.ToTypedMessage(&vmess.Account{
  1083. Id: userID.String(),
  1084. AlterId: 64,
  1085. SecuritySettings: &protocol.SecurityConfig{
  1086. Type: protocol.SecurityType_AES128_GCM,
  1087. },
  1088. }),
  1089. },
  1090. },
  1091. },
  1092. },
  1093. }),
  1094. },
  1095. },
  1096. }
  1097. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  1098. assert(err, IsNil)
  1099. for range "abcd" {
  1100. var wg sync.WaitGroup
  1101. const nConnection = 16
  1102. wg.Add(nConnection)
  1103. for i := 0; i < nConnection; i++ {
  1104. go func() {
  1105. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  1106. IP: []byte{127, 0, 0, 1},
  1107. Port: int(clientPort),
  1108. })
  1109. assert(err, IsNil)
  1110. payload := make([]byte, 10240)
  1111. rand.Read(payload)
  1112. xorpayload := xor(payload)
  1113. nBytes, err := conn.Write(payload)
  1114. assert(err, IsNil)
  1115. assert(nBytes, Equals, len(payload))
  1116. response := readFrom(conn, time.Second*20, 10240)
  1117. assert(response, Equals, xorpayload)
  1118. assert(conn.Close(), IsNil)
  1119. wg.Done()
  1120. }()
  1121. }
  1122. wg.Wait()
  1123. time.Sleep(time.Second)
  1124. }
  1125. CloseAllServers(servers)
  1126. }
  1127. func TestVMessGCMMuxUDP(t *testing.T) {
  1128. assert := With(t)
  1129. tcpServer := tcp.Server{
  1130. MsgProcessor: xor,
  1131. }
  1132. dest, err := tcpServer.Start()
  1133. assert(err, IsNil)
  1134. defer tcpServer.Close()
  1135. udpServer := udp.Server{
  1136. MsgProcessor: xor,
  1137. }
  1138. udpDest, err := udpServer.Start()
  1139. assert(err, IsNil)
  1140. defer udpServer.Close()
  1141. userID := protocol.NewID(uuid.New())
  1142. serverPort := tcp.PickPort()
  1143. serverConfig := &core.Config{
  1144. App: []*serial.TypedMessage{
  1145. serial.ToTypedMessage(&log.Config{
  1146. ErrorLogLevel: clog.Severity_Debug,
  1147. ErrorLogType: log.LogType_Console,
  1148. }),
  1149. },
  1150. Inbound: []*core.InboundHandlerConfig{
  1151. {
  1152. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  1153. PortRange: net.SinglePortRange(serverPort),
  1154. Listen: net.NewIPOrDomain(net.LocalHostIP),
  1155. }),
  1156. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  1157. User: []*protocol.User{
  1158. {
  1159. Account: serial.ToTypedMessage(&vmess.Account{
  1160. Id: userID.String(),
  1161. AlterId: 64,
  1162. }),
  1163. },
  1164. },
  1165. }),
  1166. },
  1167. },
  1168. Outbound: []*core.OutboundHandlerConfig{
  1169. {
  1170. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  1171. },
  1172. },
  1173. }
  1174. clientPort := tcp.PickPort()
  1175. clientUDPPort := udp.PickPort()
  1176. clientConfig := &core.Config{
  1177. App: []*serial.TypedMessage{
  1178. serial.ToTypedMessage(&log.Config{
  1179. ErrorLogLevel: clog.Severity_Debug,
  1180. ErrorLogType: log.LogType_Console,
  1181. }),
  1182. },
  1183. Inbound: []*core.InboundHandlerConfig{
  1184. {
  1185. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  1186. PortRange: net.SinglePortRange(clientPort),
  1187. Listen: net.NewIPOrDomain(net.LocalHostIP),
  1188. }),
  1189. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  1190. Address: net.NewIPOrDomain(dest.Address),
  1191. Port: uint32(dest.Port),
  1192. NetworkList: &net.NetworkList{
  1193. Network: []net.Network{net.Network_TCP},
  1194. },
  1195. }),
  1196. },
  1197. {
  1198. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  1199. PortRange: net.SinglePortRange(clientUDPPort),
  1200. Listen: net.NewIPOrDomain(net.LocalHostIP),
  1201. }),
  1202. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  1203. Address: net.NewIPOrDomain(udpDest.Address),
  1204. Port: uint32(udpDest.Port),
  1205. NetworkList: &net.NetworkList{
  1206. Network: []net.Network{net.Network_UDP},
  1207. },
  1208. }),
  1209. },
  1210. },
  1211. Outbound: []*core.OutboundHandlerConfig{
  1212. {
  1213. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  1214. MultiplexSettings: &proxyman.MultiplexingConfig{
  1215. Enabled: true,
  1216. Concurrency: 4,
  1217. },
  1218. }),
  1219. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  1220. Receiver: []*protocol.ServerEndpoint{
  1221. {
  1222. Address: net.NewIPOrDomain(net.LocalHostIP),
  1223. Port: uint32(serverPort),
  1224. User: []*protocol.User{
  1225. {
  1226. Account: serial.ToTypedMessage(&vmess.Account{
  1227. Id: userID.String(),
  1228. AlterId: 64,
  1229. SecuritySettings: &protocol.SecurityConfig{
  1230. Type: protocol.SecurityType_AES128_GCM,
  1231. },
  1232. }),
  1233. },
  1234. },
  1235. },
  1236. },
  1237. }),
  1238. },
  1239. },
  1240. }
  1241. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  1242. assert(err, IsNil)
  1243. for range "abcd" {
  1244. var wg sync.WaitGroup
  1245. const nConnection = 16
  1246. wg.Add(nConnection * 2)
  1247. for i := 0; i < nConnection; i++ {
  1248. go func() {
  1249. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  1250. IP: []byte{127, 0, 0, 1},
  1251. Port: int(clientPort),
  1252. })
  1253. assert(err, IsNil)
  1254. payload := make([]byte, 10240)
  1255. rand.Read(payload)
  1256. xorpayload := xor(payload)
  1257. nBytes, err := conn.Write(payload)
  1258. assert(err, IsNil)
  1259. assert(nBytes, Equals, len(payload))
  1260. response := readFrom(conn, time.Second*20, 10240)
  1261. assert(response, Equals, xorpayload)
  1262. assert(conn.Close(), IsNil)
  1263. wg.Done()
  1264. }()
  1265. }
  1266. for i := 0; i < nConnection; i++ {
  1267. go func() {
  1268. conn, err := net.DialUDP("udp", nil, &net.UDPAddr{
  1269. IP: []byte{127, 0, 0, 1},
  1270. Port: int(clientUDPPort),
  1271. })
  1272. assert(err, IsNil)
  1273. conn.SetDeadline(time.Now().Add(time.Second * 10))
  1274. payload := make([]byte, 1024)
  1275. rand.Read(payload)
  1276. xorpayload := xor(payload)
  1277. for j := 0; j < 2; j++ {
  1278. nBytes, _, err := conn.WriteMsgUDP(payload, nil, nil)
  1279. assert(err, IsNil)
  1280. assert(nBytes, Equals, len(payload))
  1281. }
  1282. response := make([]byte, 1024)
  1283. oob := make([]byte, 16)
  1284. for j := 0; j < 2; j++ {
  1285. nBytes, _, _, _, err := conn.ReadMsgUDP(response, oob)
  1286. assert(err, IsNil)
  1287. assert(nBytes, Equals, 1024)
  1288. assert(response, Equals, xorpayload)
  1289. }
  1290. assert(conn.Close(), IsNil)
  1291. wg.Done()
  1292. }()
  1293. }
  1294. wg.Wait()
  1295. time.Sleep(time.Second)
  1296. }
  1297. CloseAllServers(servers)
  1298. }