vmess_test.go 32 KB

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