vmess_test.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777
  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. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  211. Receiver: []*protocol.ServerEndpoint{
  212. {
  213. Address: v2net.NewIPOrDomain(v2net.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. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  239. assert.Error(InitializeServerConfig(clientConfig)).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*10, 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()
  262. }
  263. func TestVMessChacha20(t *testing.T) {
  264. assert := assert.On(t)
  265. tcpServer := tcp.Server{
  266. MsgProcessor: xor,
  267. }
  268. dest, err := tcpServer.Start()
  269. assert.Error(err).IsNil()
  270. defer tcpServer.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: v2net.SinglePortRange(serverPort),
  278. Listen: v2net.NewIPOrDomain(v2net.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: v2net.SinglePortRange(clientPort),
  310. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  311. }),
  312. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  313. Address: v2net.NewIPOrDomain(dest.Address),
  314. Port: uint32(dest.Port),
  315. NetworkList: &v2net.NetworkList{
  316. Network: []v2net.Network{v2net.Network_TCP},
  317. },
  318. }),
  319. },
  320. },
  321. Outbound: []*proxyman.OutboundHandlerConfig{
  322. {
  323. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  324. Receiver: []*protocol.ServerEndpoint{
  325. {
  326. Address: v2net.NewIPOrDomain(v2net.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_CHACHA20_POLY1305,
  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. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  352. assert.Error(InitializeServerConfig(clientConfig)).IsNil()
  353. var wg sync.WaitGroup
  354. wg.Add(10)
  355. for i := 0; i < 10; i++ {
  356. go func() {
  357. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  358. IP: []byte{127, 0, 0, 1},
  359. Port: int(clientPort),
  360. })
  361. assert.Error(err).IsNil()
  362. payload := make([]byte, 10240*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. response := readFrom(conn, time.Second*10, 10240*1024)
  368. assert.Bytes(response).Equals(xor([]byte(payload)))
  369. assert.Error(conn.Close()).IsNil()
  370. wg.Done()
  371. }()
  372. }
  373. wg.Wait()
  374. CloseAllServers()
  375. }
  376. func TestVMessNone(t *testing.T) {
  377. assert := assert.On(t)
  378. tcpServer := tcp.Server{
  379. MsgProcessor: xor,
  380. }
  381. dest, err := tcpServer.Start()
  382. assert.Error(err).IsNil()
  383. defer tcpServer.Close()
  384. userID := protocol.NewID(uuid.New())
  385. serverPort := pickPort()
  386. serverConfig := &core.Config{
  387. Inbound: []*proxyman.InboundHandlerConfig{
  388. {
  389. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  390. PortRange: v2net.SinglePortRange(serverPort),
  391. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  392. }),
  393. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  394. User: []*protocol.User{
  395. {
  396. Account: serial.ToTypedMessage(&vmess.Account{
  397. Id: userID.String(),
  398. AlterId: 64,
  399. }),
  400. },
  401. },
  402. }),
  403. },
  404. },
  405. Outbound: []*proxyman.OutboundHandlerConfig{
  406. {
  407. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  408. },
  409. },
  410. App: []*serial.TypedMessage{
  411. serial.ToTypedMessage(&log.Config{
  412. ErrorLogLevel: log.LogLevel_Debug,
  413. ErrorLogType: log.LogType_Console,
  414. }),
  415. },
  416. }
  417. clientPort := pickPort()
  418. clientConfig := &core.Config{
  419. Inbound: []*proxyman.InboundHandlerConfig{
  420. {
  421. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  422. PortRange: v2net.SinglePortRange(clientPort),
  423. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  424. }),
  425. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  426. Address: v2net.NewIPOrDomain(dest.Address),
  427. Port: uint32(dest.Port),
  428. NetworkList: &v2net.NetworkList{
  429. Network: []v2net.Network{v2net.Network_TCP},
  430. },
  431. }),
  432. },
  433. },
  434. Outbound: []*proxyman.OutboundHandlerConfig{
  435. {
  436. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  437. Receiver: []*protocol.ServerEndpoint{
  438. {
  439. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  440. Port: uint32(serverPort),
  441. User: []*protocol.User{
  442. {
  443. Account: serial.ToTypedMessage(&vmess.Account{
  444. Id: userID.String(),
  445. AlterId: 64,
  446. SecuritySettings: &protocol.SecurityConfig{
  447. Type: protocol.SecurityType_NONE,
  448. },
  449. }),
  450. },
  451. },
  452. },
  453. },
  454. }),
  455. },
  456. },
  457. App: []*serial.TypedMessage{
  458. serial.ToTypedMessage(&log.Config{
  459. ErrorLogLevel: log.LogLevel_Debug,
  460. ErrorLogType: log.LogType_Console,
  461. }),
  462. },
  463. }
  464. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  465. assert.Error(InitializeServerConfig(clientConfig)).IsNil()
  466. var wg sync.WaitGroup
  467. wg.Add(10)
  468. for i := 0; i < 10; i++ {
  469. go func() {
  470. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  471. IP: []byte{127, 0, 0, 1},
  472. Port: int(clientPort),
  473. })
  474. assert.Error(err).IsNil()
  475. payload := make([]byte, 10240*1024)
  476. rand.Read(payload)
  477. nBytes, err := conn.Write([]byte(payload))
  478. assert.Error(err).IsNil()
  479. assert.Int(nBytes).Equals(len(payload))
  480. response := readFrom(conn, time.Second*10, 10240*1024)
  481. assert.Bytes(response).Equals(xor([]byte(payload)))
  482. assert.Error(conn.Close()).IsNil()
  483. wg.Done()
  484. }()
  485. }
  486. wg.Wait()
  487. CloseAllServers()
  488. }
  489. func TestVMessKCP(t *testing.T) {
  490. assert := assert.On(t)
  491. tcpServer := tcp.Server{
  492. MsgProcessor: xor,
  493. }
  494. dest, err := tcpServer.Start()
  495. assert.Error(err).IsNil()
  496. defer tcpServer.Close()
  497. userID := protocol.NewID(uuid.New())
  498. serverPort := pickPort()
  499. serverConfig := &core.Config{
  500. Inbound: []*proxyman.InboundHandlerConfig{
  501. {
  502. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  503. PortRange: v2net.SinglePortRange(serverPort),
  504. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  505. StreamSettings: &internet.StreamConfig{
  506. Protocol: internet.TransportProtocol_MKCP,
  507. },
  508. }),
  509. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  510. User: []*protocol.User{
  511. {
  512. Account: serial.ToTypedMessage(&vmess.Account{
  513. Id: userID.String(),
  514. AlterId: 64,
  515. }),
  516. },
  517. },
  518. }),
  519. },
  520. },
  521. Outbound: []*proxyman.OutboundHandlerConfig{
  522. {
  523. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  524. },
  525. },
  526. App: []*serial.TypedMessage{
  527. serial.ToTypedMessage(&log.Config{
  528. ErrorLogLevel: log.LogLevel_Debug,
  529. ErrorLogType: log.LogType_Console,
  530. }),
  531. },
  532. }
  533. clientPort := pickPort()
  534. clientConfig := &core.Config{
  535. Inbound: []*proxyman.InboundHandlerConfig{
  536. {
  537. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  538. PortRange: v2net.SinglePortRange(clientPort),
  539. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  540. }),
  541. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  542. Address: v2net.NewIPOrDomain(dest.Address),
  543. Port: uint32(dest.Port),
  544. NetworkList: &v2net.NetworkList{
  545. Network: []v2net.Network{v2net.Network_TCP},
  546. },
  547. }),
  548. },
  549. },
  550. Outbound: []*proxyman.OutboundHandlerConfig{
  551. {
  552. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  553. Receiver: []*protocol.ServerEndpoint{
  554. {
  555. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  556. Port: uint32(serverPort),
  557. User: []*protocol.User{
  558. {
  559. Account: serial.ToTypedMessage(&vmess.Account{
  560. Id: userID.String(),
  561. AlterId: 64,
  562. SecuritySettings: &protocol.SecurityConfig{
  563. Type: protocol.SecurityType_AES128_GCM,
  564. },
  565. }),
  566. },
  567. },
  568. },
  569. },
  570. }),
  571. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  572. StreamSettings: &internet.StreamConfig{
  573. Protocol: internet.TransportProtocol_MKCP,
  574. },
  575. }),
  576. },
  577. },
  578. App: []*serial.TypedMessage{
  579. serial.ToTypedMessage(&log.Config{
  580. ErrorLogLevel: log.LogLevel_Debug,
  581. ErrorLogType: log.LogType_Console,
  582. }),
  583. },
  584. }
  585. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  586. assert.Error(InitializeServerConfig(clientConfig)).IsNil()
  587. var wg sync.WaitGroup
  588. for i := 0; i < 10; i++ {
  589. wg.Add(1)
  590. go func() {
  591. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  592. IP: []byte{127, 0, 0, 1},
  593. Port: int(clientPort),
  594. })
  595. assert.Error(err).IsNil()
  596. payload := make([]byte, 10240*1024)
  597. rand.Read(payload)
  598. nBytes, err := conn.Write([]byte(payload))
  599. assert.Error(err).IsNil()
  600. assert.Int(nBytes).Equals(len(payload))
  601. response := readFrom(conn, time.Minute, 10240*1024)
  602. assert.Bytes(response).Equals(xor([]byte(payload)))
  603. assert.Error(conn.Close()).IsNil()
  604. wg.Done()
  605. }()
  606. }
  607. wg.Wait()
  608. CloseAllServers()
  609. }
  610. func TestVMessIPv6(t *testing.T) {
  611. t.SkipNow() // No IPv6 on travis-ci.
  612. assert := assert.On(t)
  613. tcpServer := tcp.Server{
  614. MsgProcessor: xor,
  615. Listen: v2net.LocalHostIPv6,
  616. }
  617. dest, err := tcpServer.Start()
  618. assert.Error(err).IsNil()
  619. defer tcpServer.Close()
  620. userID := protocol.NewID(uuid.New())
  621. serverPort := pickPort()
  622. serverConfig := &core.Config{
  623. Inbound: []*proxyman.InboundHandlerConfig{
  624. {
  625. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  626. PortRange: v2net.SinglePortRange(serverPort),
  627. Listen: v2net.NewIPOrDomain(v2net.LocalHostIPv6),
  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: v2net.SinglePortRange(clientPort),
  659. Listen: v2net.NewIPOrDomain(v2net.LocalHostIPv6),
  660. }),
  661. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  662. Address: v2net.NewIPOrDomain(dest.Address),
  663. Port: uint32(dest.Port),
  664. NetworkList: &v2net.NetworkList{
  665. Network: []v2net.Network{v2net.Network_TCP},
  666. },
  667. }),
  668. },
  669. },
  670. Outbound: []*proxyman.OutboundHandlerConfig{
  671. {
  672. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  673. Receiver: []*protocol.ServerEndpoint{
  674. {
  675. Address: v2net.NewIPOrDomain(v2net.LocalHostIPv6),
  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. },
  692. },
  693. App: []*serial.TypedMessage{
  694. serial.ToTypedMessage(&log.Config{
  695. ErrorLogLevel: log.LogLevel_Debug,
  696. ErrorLogType: log.LogType_Console,
  697. }),
  698. },
  699. }
  700. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  701. assert.Error(InitializeServerConfig(clientConfig)).IsNil()
  702. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  703. IP: v2net.LocalHostIPv6.IP(),
  704. Port: int(clientPort),
  705. })
  706. assert.Error(err).IsNil()
  707. payload := make([]byte, 1024)
  708. rand.Read(payload)
  709. nBytes, err := conn.Write([]byte(payload))
  710. assert.Error(err).IsNil()
  711. assert.Int(nBytes).Equals(len(payload))
  712. response := readFrom(conn, time.Second, 1024)
  713. assert.Bytes(response).Equals(xor([]byte(payload)))
  714. assert.Error(conn.Close()).IsNil()
  715. CloseAllServers()
  716. }