vmess_test.go 31 KB

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