vmess_test.go 30 KB

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