shadowsocks_test.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824
  1. package scenarios
  2. import (
  3. "crypto/rand"
  4. "testing"
  5. "time"
  6. "github.com/google/go-cmp/cmp"
  7. "golang.org/x/sync/errgroup"
  8. "v2ray.com/core"
  9. "v2ray.com/core/app/log"
  10. "v2ray.com/core/app/proxyman"
  11. "v2ray.com/core/common"
  12. "v2ray.com/core/common/errors"
  13. clog "v2ray.com/core/common/log"
  14. "v2ray.com/core/common/net"
  15. "v2ray.com/core/common/protocol"
  16. "v2ray.com/core/common/serial"
  17. "v2ray.com/core/proxy/dokodemo"
  18. "v2ray.com/core/proxy/freedom"
  19. "v2ray.com/core/proxy/shadowsocks"
  20. "v2ray.com/core/testing/servers/tcp"
  21. "v2ray.com/core/testing/servers/udp"
  22. )
  23. func TestShadowsocksAES256TCP(t *testing.T) {
  24. tcpServer := tcp.Server{
  25. MsgProcessor: xor,
  26. }
  27. dest, err := tcpServer.Start()
  28. common.Must(err)
  29. defer tcpServer.Close()
  30. account := serial.ToTypedMessage(&shadowsocks.Account{
  31. Password: "shadowsocks-password",
  32. CipherType: shadowsocks.CipherType_AES_256_CFB,
  33. })
  34. serverPort := tcp.PickPort()
  35. serverConfig := &core.Config{
  36. App: []*serial.TypedMessage{
  37. serial.ToTypedMessage(&log.Config{
  38. ErrorLogLevel: clog.Severity_Debug,
  39. ErrorLogType: log.LogType_Console,
  40. }),
  41. },
  42. Inbound: []*core.InboundHandlerConfig{
  43. {
  44. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  45. PortRange: net.SinglePortRange(serverPort),
  46. Listen: net.NewIPOrDomain(net.LocalHostIP),
  47. }),
  48. ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{
  49. User: &protocol.User{
  50. Account: account,
  51. Level: 1,
  52. },
  53. Network: []net.Network{net.Network_TCP},
  54. }),
  55. },
  56. },
  57. Outbound: []*core.OutboundHandlerConfig{
  58. {
  59. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  60. },
  61. },
  62. }
  63. clientPort := tcp.PickPort()
  64. clientConfig := &core.Config{
  65. App: []*serial.TypedMessage{
  66. serial.ToTypedMessage(&log.Config{
  67. ErrorLogLevel: clog.Severity_Debug,
  68. ErrorLogType: log.LogType_Console,
  69. }),
  70. },
  71. Inbound: []*core.InboundHandlerConfig{
  72. {
  73. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  74. PortRange: net.SinglePortRange(clientPort),
  75. Listen: net.NewIPOrDomain(net.LocalHostIP),
  76. }),
  77. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  78. Address: net.NewIPOrDomain(dest.Address),
  79. Port: uint32(dest.Port),
  80. NetworkList: &net.NetworkList{
  81. Network: []net.Network{net.Network_TCP},
  82. },
  83. }),
  84. },
  85. },
  86. Outbound: []*core.OutboundHandlerConfig{
  87. {
  88. ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{
  89. Server: []*protocol.ServerEndpoint{
  90. {
  91. Address: net.NewIPOrDomain(net.LocalHostIP),
  92. Port: uint32(serverPort),
  93. User: []*protocol.User{
  94. {
  95. Account: account,
  96. },
  97. },
  98. },
  99. },
  100. }),
  101. },
  102. },
  103. }
  104. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  105. common.Must(err)
  106. defer CloseAllServers(servers)
  107. var errg errgroup.Group
  108. for i := 0; i < 10; i++ {
  109. errg.Go(testTCPConn(clientPort, 10240*1024, time.Second*20))
  110. }
  111. if err := errg.Wait(); err != nil {
  112. t.Fatal(err)
  113. }
  114. }
  115. func TestShadowsocksAES128UDP(t *testing.T) {
  116. udpServer := udp.Server{
  117. MsgProcessor: xor,
  118. }
  119. dest, err := udpServer.Start()
  120. common.Must(err)
  121. defer udpServer.Close()
  122. account := serial.ToTypedMessage(&shadowsocks.Account{
  123. Password: "shadowsocks-password",
  124. CipherType: shadowsocks.CipherType_AES_128_CFB,
  125. })
  126. serverPort := tcp.PickPort()
  127. serverConfig := &core.Config{
  128. App: []*serial.TypedMessage{
  129. serial.ToTypedMessage(&log.Config{
  130. ErrorLogLevel: clog.Severity_Debug,
  131. ErrorLogType: log.LogType_Console,
  132. }),
  133. },
  134. Inbound: []*core.InboundHandlerConfig{
  135. {
  136. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  137. PortRange: net.SinglePortRange(serverPort),
  138. Listen: net.NewIPOrDomain(net.LocalHostIP),
  139. }),
  140. ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{
  141. User: &protocol.User{
  142. Account: account,
  143. Level: 1,
  144. },
  145. Network: []net.Network{net.Network_UDP},
  146. }),
  147. },
  148. },
  149. Outbound: []*core.OutboundHandlerConfig{
  150. {
  151. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  152. },
  153. },
  154. }
  155. clientPort := tcp.PickPort()
  156. clientConfig := &core.Config{
  157. App: []*serial.TypedMessage{
  158. serial.ToTypedMessage(&log.Config{
  159. ErrorLogLevel: clog.Severity_Debug,
  160. ErrorLogType: log.LogType_Console,
  161. }),
  162. },
  163. Inbound: []*core.InboundHandlerConfig{
  164. {
  165. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  166. PortRange: net.SinglePortRange(clientPort),
  167. Listen: net.NewIPOrDomain(net.LocalHostIP),
  168. }),
  169. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  170. Address: net.NewIPOrDomain(dest.Address),
  171. Port: uint32(dest.Port),
  172. NetworkList: &net.NetworkList{
  173. Network: []net.Network{net.Network_UDP},
  174. },
  175. }),
  176. },
  177. },
  178. Outbound: []*core.OutboundHandlerConfig{
  179. {
  180. ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{
  181. Server: []*protocol.ServerEndpoint{
  182. {
  183. Address: net.NewIPOrDomain(net.LocalHostIP),
  184. Port: uint32(serverPort),
  185. User: []*protocol.User{
  186. {
  187. Account: account,
  188. },
  189. },
  190. },
  191. },
  192. }),
  193. },
  194. },
  195. }
  196. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  197. common.Must(err)
  198. defer CloseAllServers(servers)
  199. var errg errgroup.Group
  200. for i := 0; i < 10; i++ {
  201. errg.Go(func() error {
  202. conn, err := net.DialUDP("udp", nil, &net.UDPAddr{
  203. IP: []byte{127, 0, 0, 1},
  204. Port: int(clientPort),
  205. })
  206. if err != nil {
  207. return err
  208. }
  209. defer conn.Close()
  210. payload := make([]byte, 1024)
  211. common.Must2(rand.Read(payload))
  212. nBytes, err := conn.Write(payload)
  213. if err != nil {
  214. return err
  215. }
  216. if nBytes != len(payload) {
  217. return errors.New("expect ", len(payload), " written, but actually ", nBytes)
  218. }
  219. response := readFrom(conn, time.Second*5, 1024)
  220. if r := cmp.Diff(response, xor(payload)); r != "" {
  221. return errors.New(r)
  222. }
  223. return nil
  224. })
  225. }
  226. if err := errg.Wait(); err != nil {
  227. t.Fatal(err)
  228. }
  229. }
  230. func TestShadowsocksChacha20TCP(t *testing.T) {
  231. tcpServer := tcp.Server{
  232. MsgProcessor: xor,
  233. }
  234. dest, err := tcpServer.Start()
  235. common.Must(err)
  236. defer tcpServer.Close()
  237. account := serial.ToTypedMessage(&shadowsocks.Account{
  238. Password: "shadowsocks-password",
  239. CipherType: shadowsocks.CipherType_CHACHA20_IETF,
  240. })
  241. serverPort := tcp.PickPort()
  242. serverConfig := &core.Config{
  243. App: []*serial.TypedMessage{
  244. serial.ToTypedMessage(&log.Config{
  245. ErrorLogLevel: clog.Severity_Debug,
  246. ErrorLogType: log.LogType_Console,
  247. }),
  248. },
  249. Inbound: []*core.InboundHandlerConfig{
  250. {
  251. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  252. PortRange: net.SinglePortRange(serverPort),
  253. Listen: net.NewIPOrDomain(net.LocalHostIP),
  254. }),
  255. ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{
  256. User: &protocol.User{
  257. Account: account,
  258. Level: 1,
  259. },
  260. Network: []net.Network{net.Network_TCP},
  261. }),
  262. },
  263. },
  264. Outbound: []*core.OutboundHandlerConfig{
  265. {
  266. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  267. },
  268. },
  269. }
  270. clientPort := tcp.PickPort()
  271. clientConfig := &core.Config{
  272. App: []*serial.TypedMessage{
  273. serial.ToTypedMessage(&log.Config{
  274. ErrorLogLevel: clog.Severity_Debug,
  275. ErrorLogType: log.LogType_Console,
  276. }),
  277. },
  278. Inbound: []*core.InboundHandlerConfig{
  279. {
  280. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  281. PortRange: net.SinglePortRange(clientPort),
  282. Listen: net.NewIPOrDomain(net.LocalHostIP),
  283. }),
  284. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  285. Address: net.NewIPOrDomain(dest.Address),
  286. Port: uint32(dest.Port),
  287. NetworkList: &net.NetworkList{
  288. Network: []net.Network{net.Network_TCP},
  289. },
  290. }),
  291. },
  292. },
  293. Outbound: []*core.OutboundHandlerConfig{
  294. {
  295. ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{
  296. Server: []*protocol.ServerEndpoint{
  297. {
  298. Address: net.NewIPOrDomain(net.LocalHostIP),
  299. Port: uint32(serverPort),
  300. User: []*protocol.User{
  301. {
  302. Account: account,
  303. },
  304. },
  305. },
  306. },
  307. }),
  308. },
  309. },
  310. }
  311. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  312. common.Must(err)
  313. defer CloseAllServers(servers)
  314. var errg errgroup.Group
  315. for i := 0; i < 10; i++ {
  316. errg.Go(testTCPConn(clientPort, 10240*1024, time.Second*40))
  317. }
  318. if err := errg.Wait(); err != nil {
  319. t.Error(err)
  320. }
  321. }
  322. func TestShadowsocksChacha20Poly1305TCP(t *testing.T) {
  323. tcpServer := tcp.Server{
  324. MsgProcessor: xor,
  325. }
  326. dest, err := tcpServer.Start()
  327. common.Must(err)
  328. defer tcpServer.Close()
  329. account := serial.ToTypedMessage(&shadowsocks.Account{
  330. Password: "shadowsocks-password",
  331. CipherType: shadowsocks.CipherType_CHACHA20_POLY1305,
  332. })
  333. serverPort := tcp.PickPort()
  334. serverConfig := &core.Config{
  335. Inbound: []*core.InboundHandlerConfig{
  336. {
  337. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  338. PortRange: net.SinglePortRange(serverPort),
  339. Listen: net.NewIPOrDomain(net.LocalHostIP),
  340. }),
  341. ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{
  342. User: &protocol.User{
  343. Account: account,
  344. Level: 1,
  345. },
  346. Network: []net.Network{net.Network_TCP},
  347. }),
  348. },
  349. },
  350. Outbound: []*core.OutboundHandlerConfig{
  351. {
  352. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  353. },
  354. },
  355. }
  356. clientPort := tcp.PickPort()
  357. clientConfig := &core.Config{
  358. Inbound: []*core.InboundHandlerConfig{
  359. {
  360. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  361. PortRange: net.SinglePortRange(clientPort),
  362. Listen: net.NewIPOrDomain(net.LocalHostIP),
  363. }),
  364. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  365. Address: net.NewIPOrDomain(dest.Address),
  366. Port: uint32(dest.Port),
  367. NetworkList: &net.NetworkList{
  368. Network: []net.Network{net.Network_TCP},
  369. },
  370. }),
  371. },
  372. },
  373. Outbound: []*core.OutboundHandlerConfig{
  374. {
  375. ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{
  376. Server: []*protocol.ServerEndpoint{
  377. {
  378. Address: net.NewIPOrDomain(net.LocalHostIP),
  379. Port: uint32(serverPort),
  380. User: []*protocol.User{
  381. {
  382. Account: account,
  383. },
  384. },
  385. },
  386. },
  387. }),
  388. },
  389. },
  390. }
  391. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  392. common.Must(err)
  393. defer CloseAllServers(servers)
  394. var errg errgroup.Group
  395. for i := 0; i < 10; i++ {
  396. errg.Go(testTCPConn(clientPort, 10240*1024, time.Second*20))
  397. }
  398. if err := errg.Wait(); err != nil {
  399. t.Error(err)
  400. }
  401. }
  402. func TestShadowsocksAES256GCMTCP(t *testing.T) {
  403. tcpServer := tcp.Server{
  404. MsgProcessor: xor,
  405. }
  406. dest, err := tcpServer.Start()
  407. common.Must(err)
  408. defer tcpServer.Close()
  409. account := serial.ToTypedMessage(&shadowsocks.Account{
  410. Password: "shadowsocks-password",
  411. CipherType: shadowsocks.CipherType_AES_256_GCM,
  412. })
  413. serverPort := tcp.PickPort()
  414. serverConfig := &core.Config{
  415. App: []*serial.TypedMessage{
  416. serial.ToTypedMessage(&log.Config{
  417. ErrorLogLevel: clog.Severity_Debug,
  418. ErrorLogType: log.LogType_Console,
  419. }),
  420. },
  421. Inbound: []*core.InboundHandlerConfig{
  422. {
  423. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  424. PortRange: net.SinglePortRange(serverPort),
  425. Listen: net.NewIPOrDomain(net.LocalHostIP),
  426. }),
  427. ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{
  428. User: &protocol.User{
  429. Account: account,
  430. Level: 1,
  431. },
  432. Network: []net.Network{net.Network_TCP},
  433. }),
  434. },
  435. },
  436. Outbound: []*core.OutboundHandlerConfig{
  437. {
  438. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  439. },
  440. },
  441. }
  442. clientPort := tcp.PickPort()
  443. clientConfig := &core.Config{
  444. App: []*serial.TypedMessage{
  445. serial.ToTypedMessage(&log.Config{
  446. ErrorLogLevel: clog.Severity_Debug,
  447. ErrorLogType: log.LogType_Console,
  448. }),
  449. },
  450. Inbound: []*core.InboundHandlerConfig{
  451. {
  452. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  453. PortRange: net.SinglePortRange(clientPort),
  454. Listen: net.NewIPOrDomain(net.LocalHostIP),
  455. }),
  456. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  457. Address: net.NewIPOrDomain(dest.Address),
  458. Port: uint32(dest.Port),
  459. NetworkList: &net.NetworkList{
  460. Network: []net.Network{net.Network_TCP},
  461. },
  462. }),
  463. },
  464. },
  465. Outbound: []*core.OutboundHandlerConfig{
  466. {
  467. ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{
  468. Server: []*protocol.ServerEndpoint{
  469. {
  470. Address: net.NewIPOrDomain(net.LocalHostIP),
  471. Port: uint32(serverPort),
  472. User: []*protocol.User{
  473. {
  474. Account: account,
  475. },
  476. },
  477. },
  478. },
  479. }),
  480. },
  481. },
  482. }
  483. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  484. common.Must(err)
  485. defer CloseAllServers(servers)
  486. var errg errgroup.Group
  487. for i := 0; i < 10; i++ {
  488. errg.Go(testTCPConn(clientPort, 10240*1024, time.Second*20))
  489. }
  490. if err := errg.Wait(); err != nil {
  491. t.Error(err)
  492. }
  493. }
  494. func TestShadowsocksAES128GCMUDP(t *testing.T) {
  495. udpServer := udp.Server{
  496. MsgProcessor: xor,
  497. }
  498. dest, err := udpServer.Start()
  499. common.Must(err)
  500. defer udpServer.Close()
  501. account := serial.ToTypedMessage(&shadowsocks.Account{
  502. Password: "shadowsocks-password",
  503. CipherType: shadowsocks.CipherType_AES_128_GCM,
  504. })
  505. serverPort := tcp.PickPort()
  506. serverConfig := &core.Config{
  507. App: []*serial.TypedMessage{
  508. serial.ToTypedMessage(&log.Config{
  509. ErrorLogLevel: clog.Severity_Debug,
  510. ErrorLogType: log.LogType_Console,
  511. }),
  512. },
  513. Inbound: []*core.InboundHandlerConfig{
  514. {
  515. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  516. PortRange: net.SinglePortRange(serverPort),
  517. Listen: net.NewIPOrDomain(net.LocalHostIP),
  518. }),
  519. ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{
  520. User: &protocol.User{
  521. Account: account,
  522. Level: 1,
  523. },
  524. Network: []net.Network{net.Network_UDP},
  525. }),
  526. },
  527. },
  528. Outbound: []*core.OutboundHandlerConfig{
  529. {
  530. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  531. },
  532. },
  533. }
  534. clientPort := tcp.PickPort()
  535. clientConfig := &core.Config{
  536. App: []*serial.TypedMessage{
  537. serial.ToTypedMessage(&log.Config{
  538. ErrorLogLevel: clog.Severity_Debug,
  539. ErrorLogType: log.LogType_Console,
  540. }),
  541. },
  542. Inbound: []*core.InboundHandlerConfig{
  543. {
  544. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  545. PortRange: net.SinglePortRange(clientPort),
  546. Listen: net.NewIPOrDomain(net.LocalHostIP),
  547. }),
  548. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  549. Address: net.NewIPOrDomain(dest.Address),
  550. Port: uint32(dest.Port),
  551. NetworkList: &net.NetworkList{
  552. Network: []net.Network{net.Network_UDP},
  553. },
  554. }),
  555. },
  556. },
  557. Outbound: []*core.OutboundHandlerConfig{
  558. {
  559. ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{
  560. Server: []*protocol.ServerEndpoint{
  561. {
  562. Address: net.NewIPOrDomain(net.LocalHostIP),
  563. Port: uint32(serverPort),
  564. User: []*protocol.User{
  565. {
  566. Account: account,
  567. },
  568. },
  569. },
  570. },
  571. }),
  572. },
  573. },
  574. }
  575. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  576. common.Must(err)
  577. defer CloseAllServers(servers)
  578. var errg errgroup.Group
  579. for i := 0; i < 10; i++ {
  580. errg.Go(testUDPConn(clientPort, 1024, time.Second*5))
  581. }
  582. if err := errg.Wait(); err != nil {
  583. t.Error(err)
  584. }
  585. }
  586. func TestShadowsocksAES128GCMUDPMux(t *testing.T) {
  587. udpServer := udp.Server{
  588. MsgProcessor: xor,
  589. }
  590. dest, err := udpServer.Start()
  591. common.Must(err)
  592. defer udpServer.Close()
  593. account := serial.ToTypedMessage(&shadowsocks.Account{
  594. Password: "shadowsocks-password",
  595. CipherType: shadowsocks.CipherType_AES_128_GCM,
  596. })
  597. serverPort := tcp.PickPort()
  598. serverConfig := &core.Config{
  599. App: []*serial.TypedMessage{
  600. serial.ToTypedMessage(&log.Config{
  601. ErrorLogLevel: clog.Severity_Debug,
  602. ErrorLogType: log.LogType_Console,
  603. }),
  604. },
  605. Inbound: []*core.InboundHandlerConfig{
  606. {
  607. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  608. PortRange: net.SinglePortRange(serverPort),
  609. Listen: net.NewIPOrDomain(net.LocalHostIP),
  610. }),
  611. ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{
  612. User: &protocol.User{
  613. Account: account,
  614. Level: 1,
  615. },
  616. Network: []net.Network{net.Network_TCP},
  617. }),
  618. },
  619. },
  620. Outbound: []*core.OutboundHandlerConfig{
  621. {
  622. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  623. },
  624. },
  625. }
  626. clientPort := tcp.PickPort()
  627. clientConfig := &core.Config{
  628. App: []*serial.TypedMessage{
  629. serial.ToTypedMessage(&log.Config{
  630. ErrorLogLevel: clog.Severity_Debug,
  631. ErrorLogType: log.LogType_Console,
  632. }),
  633. },
  634. Inbound: []*core.InboundHandlerConfig{
  635. {
  636. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  637. PortRange: net.SinglePortRange(clientPort),
  638. Listen: net.NewIPOrDomain(net.LocalHostIP),
  639. }),
  640. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  641. Address: net.NewIPOrDomain(dest.Address),
  642. Port: uint32(dest.Port),
  643. NetworkList: &net.NetworkList{
  644. Network: []net.Network{net.Network_UDP},
  645. },
  646. }),
  647. },
  648. },
  649. Outbound: []*core.OutboundHandlerConfig{
  650. {
  651. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  652. MultiplexSettings: &proxyman.MultiplexingConfig{
  653. Enabled: true,
  654. Concurrency: 8,
  655. },
  656. }),
  657. ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{
  658. Server: []*protocol.ServerEndpoint{
  659. {
  660. Address: net.NewIPOrDomain(net.LocalHostIP),
  661. Port: uint32(serverPort),
  662. User: []*protocol.User{
  663. {
  664. Account: account,
  665. },
  666. },
  667. },
  668. },
  669. }),
  670. },
  671. },
  672. }
  673. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  674. common.Must(err)
  675. defer CloseAllServers(servers)
  676. var errg errgroup.Group
  677. for i := 0; i < 10; i++ {
  678. errg.Go(testUDPConn(clientPort, 1024, time.Second*5))
  679. }
  680. if err := errg.Wait(); err != nil {
  681. t.Error(err)
  682. }
  683. }
  684. func TestShadowsocksNone(t *testing.T) {
  685. tcpServer := tcp.Server{
  686. MsgProcessor: xor,
  687. }
  688. dest, err := tcpServer.Start()
  689. common.Must(err)
  690. defer tcpServer.Close()
  691. account := serial.ToTypedMessage(&shadowsocks.Account{
  692. Password: "shadowsocks-password",
  693. CipherType: shadowsocks.CipherType_NONE,
  694. })
  695. serverPort := tcp.PickPort()
  696. serverConfig := &core.Config{
  697. Inbound: []*core.InboundHandlerConfig{
  698. {
  699. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  700. PortRange: net.SinglePortRange(serverPort),
  701. Listen: net.NewIPOrDomain(net.LocalHostIP),
  702. }),
  703. ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{
  704. User: &protocol.User{
  705. Account: account,
  706. Level: 1,
  707. },
  708. Network: []net.Network{net.Network_TCP},
  709. }),
  710. },
  711. },
  712. Outbound: []*core.OutboundHandlerConfig{
  713. {
  714. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  715. },
  716. },
  717. }
  718. clientPort := tcp.PickPort()
  719. clientConfig := &core.Config{
  720. Inbound: []*core.InboundHandlerConfig{
  721. {
  722. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  723. PortRange: net.SinglePortRange(clientPort),
  724. Listen: net.NewIPOrDomain(net.LocalHostIP),
  725. }),
  726. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  727. Address: net.NewIPOrDomain(dest.Address),
  728. Port: uint32(dest.Port),
  729. NetworkList: &net.NetworkList{
  730. Network: []net.Network{net.Network_TCP},
  731. },
  732. }),
  733. },
  734. },
  735. Outbound: []*core.OutboundHandlerConfig{
  736. {
  737. ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{
  738. Server: []*protocol.ServerEndpoint{
  739. {
  740. Address: net.NewIPOrDomain(net.LocalHostIP),
  741. Port: uint32(serverPort),
  742. User: []*protocol.User{
  743. {
  744. Account: account,
  745. },
  746. },
  747. },
  748. },
  749. }),
  750. },
  751. },
  752. }
  753. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  754. common.Must(err)
  755. defer CloseAllServers(servers)
  756. var errg errgroup.Group
  757. for i := 0; i < 10; i++ {
  758. errg.Go(testTCPConn(clientPort, 10240*1024, time.Second*20))
  759. }
  760. if err := errg.Wait(); err != nil {
  761. t.Fatal(err)
  762. }
  763. }