shadowsocks_test.go 20 KB

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