vmess_test.go 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910
  1. package scenarios
  2. import (
  3. "crypto/rand"
  4. "net"
  5. "sync"
  6. "testing"
  7. "time"
  8. "v2ray.com/core"
  9. "v2ray.com/core/app/log"
  10. "v2ray.com/core/app/proxyman"
  11. v2net "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/assert"
  21. "v2ray.com/core/testing/servers/tcp"
  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: v2net.SinglePortRange(serverPort),
  39. Listen: v2net.NewIPOrDomain(v2net.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: &v2net.PortRange{
  57. From: uint32(serverPort + 1),
  58. To: uint32(serverPort + 100),
  59. },
  60. Listen: v2net.NewIPOrDomain(v2net.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: v2net.SinglePortRange(clientPort),
  93. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  94. }),
  95. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  96. Address: v2net.NewIPOrDomain(dest.Address),
  97. Port: uint32(dest.Port),
  98. NetworkList: &v2net.NetworkList{
  99. Network: []v2net.Network{v2net.Network_TCP},
  100. },
  101. }),
  102. },
  103. },
  104. Outbound: []*proxyman.OutboundHandlerConfig{
  105. {
  106. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  107. Receiver: []*protocol.ServerEndpoint{
  108. {
  109. Address: v2net.NewIPOrDomain(v2net.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. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  131. assert.Error(InitializeServerConfig(clientConfig)).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()
  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: v2net.SinglePortRange(serverPort),
  165. Listen: v2net.NewIPOrDomain(v2net.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: v2net.SinglePortRange(clientPort),
  197. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  198. }),
  199. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  200. Address: v2net.NewIPOrDomain(dest.Address),
  201. Port: uint32(dest.Port),
  202. NetworkList: &v2net.NetworkList{
  203. Network: []v2net.Network{v2net.Network_TCP},
  204. },
  205. }),
  206. },
  207. },
  208. Outbound: []*proxyman.OutboundHandlerConfig{
  209. {
  210. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  211. MultiplexSettings: &proxyman.MultiplexingConfig{
  212. Enabled: true,
  213. },
  214. }),
  215. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  216. Receiver: []*protocol.ServerEndpoint{
  217. {
  218. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  219. Port: uint32(serverPort),
  220. User: []*protocol.User{
  221. {
  222. Account: serial.ToTypedMessage(&vmess.Account{
  223. Id: userID.String(),
  224. AlterId: 64,
  225. SecuritySettings: &protocol.SecurityConfig{
  226. Type: protocol.SecurityType_AES128_GCM,
  227. },
  228. }),
  229. },
  230. },
  231. },
  232. },
  233. }),
  234. },
  235. },
  236. App: []*serial.TypedMessage{
  237. serial.ToTypedMessage(&log.Config{
  238. ErrorLogLevel: log.LogLevel_Debug,
  239. ErrorLogType: log.LogType_Console,
  240. }),
  241. },
  242. }
  243. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  244. assert.Error(InitializeServerConfig(clientConfig)).IsNil()
  245. var wg sync.WaitGroup
  246. wg.Add(10)
  247. for i := 0; i < 10; i++ {
  248. go func() {
  249. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  250. IP: []byte{127, 0, 0, 1},
  251. Port: int(clientPort),
  252. })
  253. assert.Error(err).IsNil()
  254. payload := make([]byte, 10240*1024)
  255. rand.Read(payload)
  256. nBytes, err := conn.Write([]byte(payload))
  257. assert.Error(err).IsNil()
  258. assert.Int(nBytes).Equals(len(payload))
  259. response := readFrom(conn, time.Second*10, 10240*1024)
  260. assert.Bytes(response).Equals(xor([]byte(payload)))
  261. assert.Error(conn.Close()).IsNil()
  262. wg.Done()
  263. }()
  264. }
  265. wg.Wait()
  266. CloseAllServers()
  267. }
  268. func TestVMessChacha20(t *testing.T) {
  269. assert := assert.On(t)
  270. tcpServer := tcp.Server{
  271. MsgProcessor: xor,
  272. }
  273. dest, err := tcpServer.Start()
  274. assert.Error(err).IsNil()
  275. defer tcpServer.Close()
  276. userID := protocol.NewID(uuid.New())
  277. serverPort := pickPort()
  278. serverConfig := &core.Config{
  279. Inbound: []*proxyman.InboundHandlerConfig{
  280. {
  281. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  282. PortRange: v2net.SinglePortRange(serverPort),
  283. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  284. }),
  285. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  286. User: []*protocol.User{
  287. {
  288. Account: serial.ToTypedMessage(&vmess.Account{
  289. Id: userID.String(),
  290. AlterId: 64,
  291. }),
  292. },
  293. },
  294. }),
  295. },
  296. },
  297. Outbound: []*proxyman.OutboundHandlerConfig{
  298. {
  299. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  300. },
  301. },
  302. App: []*serial.TypedMessage{
  303. serial.ToTypedMessage(&log.Config{
  304. ErrorLogLevel: log.LogLevel_Debug,
  305. ErrorLogType: log.LogType_Console,
  306. }),
  307. },
  308. }
  309. clientPort := pickPort()
  310. clientConfig := &core.Config{
  311. Inbound: []*proxyman.InboundHandlerConfig{
  312. {
  313. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  314. PortRange: v2net.SinglePortRange(clientPort),
  315. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  316. }),
  317. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  318. Address: v2net.NewIPOrDomain(dest.Address),
  319. Port: uint32(dest.Port),
  320. NetworkList: &v2net.NetworkList{
  321. Network: []v2net.Network{v2net.Network_TCP},
  322. },
  323. }),
  324. },
  325. },
  326. Outbound: []*proxyman.OutboundHandlerConfig{
  327. {
  328. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  329. Receiver: []*protocol.ServerEndpoint{
  330. {
  331. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  332. Port: uint32(serverPort),
  333. User: []*protocol.User{
  334. {
  335. Account: serial.ToTypedMessage(&vmess.Account{
  336. Id: userID.String(),
  337. AlterId: 64,
  338. SecuritySettings: &protocol.SecurityConfig{
  339. Type: protocol.SecurityType_CHACHA20_POLY1305,
  340. },
  341. }),
  342. },
  343. },
  344. },
  345. },
  346. }),
  347. },
  348. },
  349. App: []*serial.TypedMessage{
  350. serial.ToTypedMessage(&log.Config{
  351. ErrorLogLevel: log.LogLevel_Debug,
  352. ErrorLogType: log.LogType_Console,
  353. }),
  354. },
  355. }
  356. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  357. assert.Error(InitializeServerConfig(clientConfig)).IsNil()
  358. var wg sync.WaitGroup
  359. wg.Add(10)
  360. for i := 0; i < 10; i++ {
  361. go func() {
  362. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  363. IP: []byte{127, 0, 0, 1},
  364. Port: int(clientPort),
  365. })
  366. assert.Error(err).IsNil()
  367. payload := make([]byte, 10240*1024)
  368. rand.Read(payload)
  369. nBytes, err := conn.Write([]byte(payload))
  370. assert.Error(err).IsNil()
  371. assert.Int(nBytes).Equals(len(payload))
  372. response := readFrom(conn, time.Second*10, 10240*1024)
  373. assert.Bytes(response).Equals(xor([]byte(payload)))
  374. assert.Error(conn.Close()).IsNil()
  375. wg.Done()
  376. }()
  377. }
  378. wg.Wait()
  379. CloseAllServers()
  380. }
  381. func TestVMessNone(t *testing.T) {
  382. assert := assert.On(t)
  383. tcpServer := tcp.Server{
  384. MsgProcessor: xor,
  385. }
  386. dest, err := tcpServer.Start()
  387. assert.Error(err).IsNil()
  388. defer tcpServer.Close()
  389. userID := protocol.NewID(uuid.New())
  390. serverPort := pickPort()
  391. serverConfig := &core.Config{
  392. Inbound: []*proxyman.InboundHandlerConfig{
  393. {
  394. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  395. PortRange: v2net.SinglePortRange(serverPort),
  396. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  397. }),
  398. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  399. User: []*protocol.User{
  400. {
  401. Account: serial.ToTypedMessage(&vmess.Account{
  402. Id: userID.String(),
  403. AlterId: 64,
  404. }),
  405. },
  406. },
  407. }),
  408. },
  409. },
  410. Outbound: []*proxyman.OutboundHandlerConfig{
  411. {
  412. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  413. },
  414. },
  415. App: []*serial.TypedMessage{
  416. serial.ToTypedMessage(&log.Config{
  417. ErrorLogLevel: log.LogLevel_Debug,
  418. ErrorLogType: log.LogType_Console,
  419. }),
  420. },
  421. }
  422. clientPort := pickPort()
  423. clientConfig := &core.Config{
  424. Inbound: []*proxyman.InboundHandlerConfig{
  425. {
  426. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  427. PortRange: v2net.SinglePortRange(clientPort),
  428. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  429. }),
  430. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  431. Address: v2net.NewIPOrDomain(dest.Address),
  432. Port: uint32(dest.Port),
  433. NetworkList: &v2net.NetworkList{
  434. Network: []v2net.Network{v2net.Network_TCP},
  435. },
  436. }),
  437. },
  438. },
  439. Outbound: []*proxyman.OutboundHandlerConfig{
  440. {
  441. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  442. Receiver: []*protocol.ServerEndpoint{
  443. {
  444. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  445. Port: uint32(serverPort),
  446. User: []*protocol.User{
  447. {
  448. Account: serial.ToTypedMessage(&vmess.Account{
  449. Id: userID.String(),
  450. AlterId: 64,
  451. SecuritySettings: &protocol.SecurityConfig{
  452. Type: protocol.SecurityType_NONE,
  453. },
  454. }),
  455. },
  456. },
  457. },
  458. },
  459. }),
  460. },
  461. },
  462. App: []*serial.TypedMessage{
  463. serial.ToTypedMessage(&log.Config{
  464. ErrorLogLevel: log.LogLevel_Debug,
  465. ErrorLogType: log.LogType_Console,
  466. }),
  467. },
  468. }
  469. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  470. assert.Error(InitializeServerConfig(clientConfig)).IsNil()
  471. var wg sync.WaitGroup
  472. wg.Add(10)
  473. for i := 0; i < 10; i++ {
  474. go func() {
  475. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  476. IP: []byte{127, 0, 0, 1},
  477. Port: int(clientPort),
  478. })
  479. assert.Error(err).IsNil()
  480. payload := make([]byte, 10240*1024)
  481. rand.Read(payload)
  482. nBytes, err := conn.Write([]byte(payload))
  483. assert.Error(err).IsNil()
  484. assert.Int(nBytes).Equals(len(payload))
  485. response := readFrom(conn, time.Second*10, 10240*1024)
  486. assert.Bytes(response).Equals(xor([]byte(payload)))
  487. assert.Error(conn.Close()).IsNil()
  488. wg.Done()
  489. }()
  490. }
  491. wg.Wait()
  492. CloseAllServers()
  493. }
  494. func TestVMessKCP(t *testing.T) {
  495. assert := assert.On(t)
  496. tcpServer := tcp.Server{
  497. MsgProcessor: xor,
  498. }
  499. dest, err := tcpServer.Start()
  500. assert.Error(err).IsNil()
  501. defer tcpServer.Close()
  502. userID := protocol.NewID(uuid.New())
  503. serverPort := pickPort()
  504. serverConfig := &core.Config{
  505. Inbound: []*proxyman.InboundHandlerConfig{
  506. {
  507. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  508. PortRange: v2net.SinglePortRange(serverPort),
  509. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  510. StreamSettings: &internet.StreamConfig{
  511. Protocol: internet.TransportProtocol_MKCP,
  512. },
  513. }),
  514. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  515. User: []*protocol.User{
  516. {
  517. Account: serial.ToTypedMessage(&vmess.Account{
  518. Id: userID.String(),
  519. AlterId: 64,
  520. }),
  521. },
  522. },
  523. }),
  524. },
  525. },
  526. Outbound: []*proxyman.OutboundHandlerConfig{
  527. {
  528. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  529. },
  530. },
  531. App: []*serial.TypedMessage{
  532. serial.ToTypedMessage(&log.Config{
  533. ErrorLogLevel: log.LogLevel_Debug,
  534. ErrorLogType: log.LogType_Console,
  535. }),
  536. },
  537. }
  538. clientPort := pickPort()
  539. clientConfig := &core.Config{
  540. Inbound: []*proxyman.InboundHandlerConfig{
  541. {
  542. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  543. PortRange: v2net.SinglePortRange(clientPort),
  544. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  545. }),
  546. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  547. Address: v2net.NewIPOrDomain(dest.Address),
  548. Port: uint32(dest.Port),
  549. NetworkList: &v2net.NetworkList{
  550. Network: []v2net.Network{v2net.Network_TCP},
  551. },
  552. }),
  553. },
  554. },
  555. Outbound: []*proxyman.OutboundHandlerConfig{
  556. {
  557. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  558. Receiver: []*protocol.ServerEndpoint{
  559. {
  560. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  561. Port: uint32(serverPort),
  562. User: []*protocol.User{
  563. {
  564. Account: serial.ToTypedMessage(&vmess.Account{
  565. Id: userID.String(),
  566. AlterId: 64,
  567. SecuritySettings: &protocol.SecurityConfig{
  568. Type: protocol.SecurityType_AES128_GCM,
  569. },
  570. }),
  571. },
  572. },
  573. },
  574. },
  575. }),
  576. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  577. StreamSettings: &internet.StreamConfig{
  578. Protocol: internet.TransportProtocol_MKCP,
  579. },
  580. }),
  581. },
  582. },
  583. App: []*serial.TypedMessage{
  584. serial.ToTypedMessage(&log.Config{
  585. ErrorLogLevel: log.LogLevel_Debug,
  586. ErrorLogType: log.LogType_Console,
  587. }),
  588. },
  589. }
  590. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  591. assert.Error(InitializeServerConfig(clientConfig)).IsNil()
  592. var wg sync.WaitGroup
  593. for i := 0; i < 10; i++ {
  594. wg.Add(1)
  595. go func() {
  596. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  597. IP: []byte{127, 0, 0, 1},
  598. Port: int(clientPort),
  599. })
  600. assert.Error(err).IsNil()
  601. payload := make([]byte, 10240*1024)
  602. rand.Read(payload)
  603. nBytes, err := conn.Write([]byte(payload))
  604. assert.Error(err).IsNil()
  605. assert.Int(nBytes).Equals(len(payload))
  606. response := readFrom(conn, time.Minute, 10240*1024)
  607. assert.Bytes(response).Equals(xor([]byte(payload)))
  608. assert.Error(conn.Close()).IsNil()
  609. wg.Done()
  610. }()
  611. }
  612. wg.Wait()
  613. CloseAllServers()
  614. }
  615. func TestVMessIPv6(t *testing.T) {
  616. t.SkipNow() // No IPv6 on travis-ci.
  617. assert := assert.On(t)
  618. tcpServer := tcp.Server{
  619. MsgProcessor: xor,
  620. Listen: v2net.LocalHostIPv6,
  621. }
  622. dest, err := tcpServer.Start()
  623. assert.Error(err).IsNil()
  624. defer tcpServer.Close()
  625. userID := protocol.NewID(uuid.New())
  626. serverPort := pickPort()
  627. serverConfig := &core.Config{
  628. Inbound: []*proxyman.InboundHandlerConfig{
  629. {
  630. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  631. PortRange: v2net.SinglePortRange(serverPort),
  632. Listen: v2net.NewIPOrDomain(v2net.LocalHostIPv6),
  633. }),
  634. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  635. User: []*protocol.User{
  636. {
  637. Account: serial.ToTypedMessage(&vmess.Account{
  638. Id: userID.String(),
  639. AlterId: 64,
  640. }),
  641. },
  642. },
  643. }),
  644. },
  645. },
  646. Outbound: []*proxyman.OutboundHandlerConfig{
  647. {
  648. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  649. },
  650. },
  651. App: []*serial.TypedMessage{
  652. serial.ToTypedMessage(&log.Config{
  653. ErrorLogLevel: log.LogLevel_Debug,
  654. ErrorLogType: log.LogType_Console,
  655. }),
  656. },
  657. }
  658. clientPort := pickPort()
  659. clientConfig := &core.Config{
  660. Inbound: []*proxyman.InboundHandlerConfig{
  661. {
  662. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  663. PortRange: v2net.SinglePortRange(clientPort),
  664. Listen: v2net.NewIPOrDomain(v2net.LocalHostIPv6),
  665. }),
  666. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  667. Address: v2net.NewIPOrDomain(dest.Address),
  668. Port: uint32(dest.Port),
  669. NetworkList: &v2net.NetworkList{
  670. Network: []v2net.Network{v2net.Network_TCP},
  671. },
  672. }),
  673. },
  674. },
  675. Outbound: []*proxyman.OutboundHandlerConfig{
  676. {
  677. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  678. Receiver: []*protocol.ServerEndpoint{
  679. {
  680. Address: v2net.NewIPOrDomain(v2net.LocalHostIPv6),
  681. Port: uint32(serverPort),
  682. User: []*protocol.User{
  683. {
  684. Account: serial.ToTypedMessage(&vmess.Account{
  685. Id: userID.String(),
  686. AlterId: 64,
  687. SecuritySettings: &protocol.SecurityConfig{
  688. Type: protocol.SecurityType_AES128_GCM,
  689. },
  690. }),
  691. },
  692. },
  693. },
  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. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  706. assert.Error(InitializeServerConfig(clientConfig)).IsNil()
  707. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  708. IP: v2net.LocalHostIPv6.IP(),
  709. Port: int(clientPort),
  710. })
  711. assert.Error(err).IsNil()
  712. payload := make([]byte, 1024)
  713. rand.Read(payload)
  714. nBytes, err := conn.Write([]byte(payload))
  715. assert.Error(err).IsNil()
  716. assert.Int(nBytes).Equals(len(payload))
  717. response := readFrom(conn, time.Second, 1024)
  718. assert.Bytes(response).Equals(xor([]byte(payload)))
  719. assert.Error(conn.Close()).IsNil()
  720. CloseAllServers()
  721. }
  722. func TestVMessGCMMux(t *testing.T) {
  723. assert := assert.On(t)
  724. tcpServer := tcp.Server{
  725. MsgProcessor: xor,
  726. }
  727. dest, err := tcpServer.Start()
  728. assert.Error(err).IsNil()
  729. defer tcpServer.Close()
  730. userID := protocol.NewID(uuid.New())
  731. serverPort := pickPort()
  732. serverConfig := &core.Config{
  733. Inbound: []*proxyman.InboundHandlerConfig{
  734. {
  735. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  736. PortRange: v2net.SinglePortRange(serverPort),
  737. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  738. }),
  739. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  740. User: []*protocol.User{
  741. {
  742. Account: serial.ToTypedMessage(&vmess.Account{
  743. Id: userID.String(),
  744. AlterId: 64,
  745. }),
  746. },
  747. },
  748. }),
  749. },
  750. },
  751. Outbound: []*proxyman.OutboundHandlerConfig{
  752. {
  753. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  754. },
  755. },
  756. App: []*serial.TypedMessage{
  757. serial.ToTypedMessage(&log.Config{
  758. ErrorLogLevel: log.LogLevel_Debug,
  759. ErrorLogType: log.LogType_Console,
  760. }),
  761. },
  762. }
  763. clientPort := pickPort()
  764. clientConfig := &core.Config{
  765. Inbound: []*proxyman.InboundHandlerConfig{
  766. {
  767. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  768. PortRange: v2net.SinglePortRange(clientPort),
  769. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  770. }),
  771. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  772. Address: v2net.NewIPOrDomain(dest.Address),
  773. Port: uint32(dest.Port),
  774. NetworkList: &v2net.NetworkList{
  775. Network: []v2net.Network{v2net.Network_TCP},
  776. },
  777. }),
  778. },
  779. },
  780. Outbound: []*proxyman.OutboundHandlerConfig{
  781. {
  782. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  783. MultiplexSettings: &proxyman.MultiplexingConfig{
  784. Enabled: true,
  785. },
  786. }),
  787. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  788. Receiver: []*protocol.ServerEndpoint{
  789. {
  790. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  791. Port: uint32(serverPort),
  792. User: []*protocol.User{
  793. {
  794. Account: serial.ToTypedMessage(&vmess.Account{
  795. Id: userID.String(),
  796. AlterId: 64,
  797. SecuritySettings: &protocol.SecurityConfig{
  798. Type: protocol.SecurityType_AES128_GCM,
  799. },
  800. }),
  801. },
  802. },
  803. },
  804. },
  805. }),
  806. },
  807. },
  808. App: []*serial.TypedMessage{
  809. serial.ToTypedMessage(&log.Config{
  810. ErrorLogLevel: log.LogLevel_Debug,
  811. ErrorLogType: log.LogType_Console,
  812. }),
  813. },
  814. }
  815. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  816. assert.Error(InitializeServerConfig(clientConfig)).IsNil()
  817. var wg sync.WaitGroup
  818. wg.Add(100)
  819. for i := 0; i < 100; i++ {
  820. go func() {
  821. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  822. IP: []byte{127, 0, 0, 1},
  823. Port: int(clientPort),
  824. })
  825. assert.Error(err).IsNil()
  826. payload := make([]byte, 10240)
  827. rand.Read(payload)
  828. nBytes, err := conn.Write([]byte(payload))
  829. assert.Error(err).IsNil()
  830. assert.Int(nBytes).Equals(len(payload))
  831. response := readFrom(conn, time.Second*10, 10240)
  832. assert.Bytes(response).Equals(xor([]byte(payload)))
  833. assert.Error(conn.Close()).IsNil()
  834. wg.Done()
  835. }()
  836. }
  837. wg.Wait()
  838. CloseAllServers()
  839. }