vmess_test.go 35 KB

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