vmess_test.go 30 KB

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