vmess_test.go 34 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418
  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. var wg sync.WaitGroup
  879. for i := 0; i < 2; i++ {
  880. wg.Add(1)
  881. go func() {
  882. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  883. IP: []byte{127, 0, 0, 1},
  884. Port: int(clientPort),
  885. })
  886. assert(err, IsNil)
  887. payload := make([]byte, 10240*1024)
  888. rand.Read(payload)
  889. nBytes, err := conn.Write(payload)
  890. assert(err, IsNil)
  891. assert(nBytes, Equals, len(payload))
  892. response := readFrom(conn, time.Minute*10, 10240*1024)
  893. assert(response, Equals, xor(payload))
  894. assert(conn.Close(), IsNil)
  895. wg.Done()
  896. }()
  897. }
  898. wg.Wait()
  899. CloseAllServers(servers)
  900. }
  901. func TestVMessIPv6(t *testing.T) {
  902. t.SkipNow() // No IPv6 on travis-ci.
  903. assert := With(t)
  904. tcpServer := tcp.Server{
  905. MsgProcessor: xor,
  906. Listen: net.LocalHostIPv6,
  907. }
  908. dest, err := tcpServer.Start()
  909. assert(err, IsNil)
  910. defer tcpServer.Close()
  911. userID := protocol.NewID(uuid.New())
  912. serverPort := tcp.PickPort()
  913. serverConfig := &core.Config{
  914. App: []*serial.TypedMessage{
  915. serial.ToTypedMessage(&log.Config{
  916. ErrorLogLevel: clog.Severity_Debug,
  917. ErrorLogType: log.LogType_Console,
  918. }),
  919. },
  920. Inbound: []*core.InboundHandlerConfig{
  921. {
  922. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  923. PortRange: net.SinglePortRange(serverPort),
  924. Listen: net.NewIPOrDomain(net.LocalHostIPv6),
  925. }),
  926. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  927. User: []*protocol.User{
  928. {
  929. Account: serial.ToTypedMessage(&vmess.Account{
  930. Id: userID.String(),
  931. AlterId: 64,
  932. }),
  933. },
  934. },
  935. }),
  936. },
  937. },
  938. Outbound: []*core.OutboundHandlerConfig{
  939. {
  940. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  941. },
  942. },
  943. }
  944. clientPort := tcp.PickPort()
  945. clientConfig := &core.Config{
  946. App: []*serial.TypedMessage{
  947. serial.ToTypedMessage(&log.Config{
  948. ErrorLogLevel: clog.Severity_Debug,
  949. ErrorLogType: log.LogType_Console,
  950. }),
  951. },
  952. Inbound: []*core.InboundHandlerConfig{
  953. {
  954. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  955. PortRange: net.SinglePortRange(clientPort),
  956. Listen: net.NewIPOrDomain(net.LocalHostIPv6),
  957. }),
  958. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  959. Address: net.NewIPOrDomain(dest.Address),
  960. Port: uint32(dest.Port),
  961. NetworkList: &net.NetworkList{
  962. Network: []net.Network{net.Network_TCP},
  963. },
  964. }),
  965. },
  966. },
  967. Outbound: []*core.OutboundHandlerConfig{
  968. {
  969. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  970. Receiver: []*protocol.ServerEndpoint{
  971. {
  972. Address: net.NewIPOrDomain(net.LocalHostIPv6),
  973. Port: uint32(serverPort),
  974. User: []*protocol.User{
  975. {
  976. Account: serial.ToTypedMessage(&vmess.Account{
  977. Id: userID.String(),
  978. AlterId: 64,
  979. SecuritySettings: &protocol.SecurityConfig{
  980. Type: protocol.SecurityType_AES128_GCM,
  981. },
  982. }),
  983. },
  984. },
  985. },
  986. },
  987. }),
  988. },
  989. },
  990. }
  991. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  992. assert(err, IsNil)
  993. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  994. IP: net.LocalHostIPv6.IP(),
  995. Port: int(clientPort),
  996. })
  997. assert(err, IsNil)
  998. payload := make([]byte, 1024)
  999. rand.Read(payload)
  1000. nBytes, err := conn.Write(payload)
  1001. assert(err, IsNil)
  1002. assert(nBytes, Equals, len(payload))
  1003. response := readFrom(conn, time.Second*20, 1024)
  1004. assert(response, Equals, xor(payload))
  1005. assert(conn.Close(), IsNil)
  1006. CloseAllServers(servers)
  1007. }
  1008. func TestVMessGCMMux(t *testing.T) {
  1009. assert := With(t)
  1010. tcpServer := tcp.Server{
  1011. MsgProcessor: xor,
  1012. }
  1013. dest, err := tcpServer.Start()
  1014. assert(err, IsNil)
  1015. defer tcpServer.Close()
  1016. userID := protocol.NewID(uuid.New())
  1017. serverPort := tcp.PickPort()
  1018. serverConfig := &core.Config{
  1019. App: []*serial.TypedMessage{
  1020. serial.ToTypedMessage(&log.Config{
  1021. ErrorLogLevel: clog.Severity_Debug,
  1022. ErrorLogType: log.LogType_Console,
  1023. }),
  1024. },
  1025. Inbound: []*core.InboundHandlerConfig{
  1026. {
  1027. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  1028. PortRange: net.SinglePortRange(serverPort),
  1029. Listen: net.NewIPOrDomain(net.LocalHostIP),
  1030. }),
  1031. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  1032. User: []*protocol.User{
  1033. {
  1034. Account: serial.ToTypedMessage(&vmess.Account{
  1035. Id: userID.String(),
  1036. AlterId: 64,
  1037. }),
  1038. },
  1039. },
  1040. }),
  1041. },
  1042. },
  1043. Outbound: []*core.OutboundHandlerConfig{
  1044. {
  1045. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  1046. },
  1047. },
  1048. }
  1049. clientPort := tcp.PickPort()
  1050. clientConfig := &core.Config{
  1051. App: []*serial.TypedMessage{
  1052. serial.ToTypedMessage(&log.Config{
  1053. ErrorLogLevel: clog.Severity_Debug,
  1054. ErrorLogType: log.LogType_Console,
  1055. }),
  1056. },
  1057. Inbound: []*core.InboundHandlerConfig{
  1058. {
  1059. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  1060. PortRange: net.SinglePortRange(clientPort),
  1061. Listen: net.NewIPOrDomain(net.LocalHostIP),
  1062. }),
  1063. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  1064. Address: net.NewIPOrDomain(dest.Address),
  1065. Port: uint32(dest.Port),
  1066. NetworkList: &net.NetworkList{
  1067. Network: []net.Network{net.Network_TCP},
  1068. },
  1069. }),
  1070. },
  1071. },
  1072. Outbound: []*core.OutboundHandlerConfig{
  1073. {
  1074. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  1075. MultiplexSettings: &proxyman.MultiplexingConfig{
  1076. Enabled: true,
  1077. Concurrency: 4,
  1078. },
  1079. }),
  1080. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  1081. Receiver: []*protocol.ServerEndpoint{
  1082. {
  1083. Address: net.NewIPOrDomain(net.LocalHostIP),
  1084. Port: uint32(serverPort),
  1085. User: []*protocol.User{
  1086. {
  1087. Account: serial.ToTypedMessage(&vmess.Account{
  1088. Id: userID.String(),
  1089. AlterId: 64,
  1090. SecuritySettings: &protocol.SecurityConfig{
  1091. Type: protocol.SecurityType_AES128_GCM,
  1092. },
  1093. }),
  1094. },
  1095. },
  1096. },
  1097. },
  1098. }),
  1099. },
  1100. },
  1101. }
  1102. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  1103. assert(err, IsNil)
  1104. for range "abcd" {
  1105. var wg sync.WaitGroup
  1106. const nConnection = 16
  1107. wg.Add(nConnection)
  1108. for i := 0; i < nConnection; i++ {
  1109. go func() {
  1110. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  1111. IP: []byte{127, 0, 0, 1},
  1112. Port: int(clientPort),
  1113. })
  1114. assert(err, IsNil)
  1115. payload := make([]byte, 10240)
  1116. rand.Read(payload)
  1117. xorpayload := xor(payload)
  1118. nBytes, err := conn.Write(payload)
  1119. assert(err, IsNil)
  1120. assert(nBytes, Equals, len(payload))
  1121. response := readFrom(conn, time.Second*20, 10240)
  1122. assert(response, Equals, xorpayload)
  1123. assert(conn.Close(), IsNil)
  1124. wg.Done()
  1125. }()
  1126. }
  1127. wg.Wait()
  1128. time.Sleep(time.Second)
  1129. }
  1130. CloseAllServers(servers)
  1131. }
  1132. func TestVMessGCMMuxUDP(t *testing.T) {
  1133. assert := With(t)
  1134. tcpServer := tcp.Server{
  1135. MsgProcessor: xor,
  1136. }
  1137. dest, err := tcpServer.Start()
  1138. assert(err, IsNil)
  1139. defer tcpServer.Close()
  1140. udpServer := udp.Server{
  1141. MsgProcessor: xor,
  1142. }
  1143. udpDest, err := udpServer.Start()
  1144. assert(err, IsNil)
  1145. defer udpServer.Close()
  1146. userID := protocol.NewID(uuid.New())
  1147. serverPort := tcp.PickPort()
  1148. serverConfig := &core.Config{
  1149. App: []*serial.TypedMessage{
  1150. serial.ToTypedMessage(&log.Config{
  1151. ErrorLogLevel: clog.Severity_Debug,
  1152. ErrorLogType: log.LogType_Console,
  1153. }),
  1154. },
  1155. Inbound: []*core.InboundHandlerConfig{
  1156. {
  1157. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  1158. PortRange: net.SinglePortRange(serverPort),
  1159. Listen: net.NewIPOrDomain(net.LocalHostIP),
  1160. }),
  1161. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  1162. User: []*protocol.User{
  1163. {
  1164. Account: serial.ToTypedMessage(&vmess.Account{
  1165. Id: userID.String(),
  1166. AlterId: 64,
  1167. }),
  1168. },
  1169. },
  1170. }),
  1171. },
  1172. },
  1173. Outbound: []*core.OutboundHandlerConfig{
  1174. {
  1175. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  1176. },
  1177. },
  1178. }
  1179. clientPort := tcp.PickPort()
  1180. clientUDPPort := udp.PickPort()
  1181. clientConfig := &core.Config{
  1182. App: []*serial.TypedMessage{
  1183. serial.ToTypedMessage(&log.Config{
  1184. ErrorLogLevel: clog.Severity_Debug,
  1185. ErrorLogType: log.LogType_Console,
  1186. }),
  1187. },
  1188. Inbound: []*core.InboundHandlerConfig{
  1189. {
  1190. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  1191. PortRange: net.SinglePortRange(clientPort),
  1192. Listen: net.NewIPOrDomain(net.LocalHostIP),
  1193. }),
  1194. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  1195. Address: net.NewIPOrDomain(dest.Address),
  1196. Port: uint32(dest.Port),
  1197. NetworkList: &net.NetworkList{
  1198. Network: []net.Network{net.Network_TCP},
  1199. },
  1200. }),
  1201. },
  1202. {
  1203. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  1204. PortRange: net.SinglePortRange(clientUDPPort),
  1205. Listen: net.NewIPOrDomain(net.LocalHostIP),
  1206. }),
  1207. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  1208. Address: net.NewIPOrDomain(udpDest.Address),
  1209. Port: uint32(udpDest.Port),
  1210. NetworkList: &net.NetworkList{
  1211. Network: []net.Network{net.Network_UDP},
  1212. },
  1213. }),
  1214. },
  1215. },
  1216. Outbound: []*core.OutboundHandlerConfig{
  1217. {
  1218. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  1219. MultiplexSettings: &proxyman.MultiplexingConfig{
  1220. Enabled: true,
  1221. Concurrency: 4,
  1222. },
  1223. }),
  1224. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  1225. Receiver: []*protocol.ServerEndpoint{
  1226. {
  1227. Address: net.NewIPOrDomain(net.LocalHostIP),
  1228. Port: uint32(serverPort),
  1229. User: []*protocol.User{
  1230. {
  1231. Account: serial.ToTypedMessage(&vmess.Account{
  1232. Id: userID.String(),
  1233. AlterId: 64,
  1234. SecuritySettings: &protocol.SecurityConfig{
  1235. Type: protocol.SecurityType_AES128_GCM,
  1236. },
  1237. }),
  1238. },
  1239. },
  1240. },
  1241. },
  1242. }),
  1243. },
  1244. },
  1245. }
  1246. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  1247. assert(err, IsNil)
  1248. for range "abcd" {
  1249. var wg sync.WaitGroup
  1250. const nConnection = 16
  1251. wg.Add(nConnection * 2)
  1252. for i := 0; i < nConnection; i++ {
  1253. go func() {
  1254. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  1255. IP: []byte{127, 0, 0, 1},
  1256. Port: int(clientPort),
  1257. })
  1258. assert(err, IsNil)
  1259. payload := make([]byte, 10240)
  1260. rand.Read(payload)
  1261. xorpayload := xor(payload)
  1262. nBytes, err := conn.Write(payload)
  1263. assert(err, IsNil)
  1264. assert(nBytes, Equals, len(payload))
  1265. response := readFrom(conn, time.Second*20, 10240)
  1266. assert(response, Equals, xorpayload)
  1267. assert(conn.Close(), IsNil)
  1268. wg.Done()
  1269. }()
  1270. }
  1271. for i := 0; i < nConnection; i++ {
  1272. go func() {
  1273. conn, err := net.DialUDP("udp", nil, &net.UDPAddr{
  1274. IP: []byte{127, 0, 0, 1},
  1275. Port: int(clientUDPPort),
  1276. })
  1277. assert(err, IsNil)
  1278. conn.SetDeadline(time.Now().Add(time.Second * 10))
  1279. payload := make([]byte, 1024)
  1280. rand.Read(payload)
  1281. xorpayload := xor(payload)
  1282. for j := 0; j < 2; j++ {
  1283. nBytes, _, err := conn.WriteMsgUDP(payload, nil, nil)
  1284. assert(err, IsNil)
  1285. assert(nBytes, Equals, len(payload))
  1286. }
  1287. response := make([]byte, 1024)
  1288. oob := make([]byte, 16)
  1289. for j := 0; j < 2; j++ {
  1290. nBytes, _, _, _, err := conn.ReadMsgUDP(response, oob)
  1291. assert(err, IsNil)
  1292. assert(nBytes, Equals, 1024)
  1293. assert(response, Equals, xorpayload)
  1294. }
  1295. assert(conn.Close(), IsNil)
  1296. wg.Done()
  1297. }()
  1298. }
  1299. wg.Wait()
  1300. time.Sleep(time.Second)
  1301. }
  1302. CloseAllServers(servers)
  1303. }