vmess_test.go 34 KB

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