vmess_test.go 30 KB

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