vmess_test.go 38 KB

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