shadowsocks_test.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739
  1. package scenarios
  2. import (
  3. "crypto/rand"
  4. "sync"
  5. "testing"
  6. "time"
  7. "v2ray.com/core"
  8. "v2ray.com/core/app/log"
  9. "v2ray.com/core/app/proxyman"
  10. clog "v2ray.com/core/common/log"
  11. "v2ray.com/core/common/net"
  12. "v2ray.com/core/common/protocol"
  13. "v2ray.com/core/common/serial"
  14. "v2ray.com/core/proxy/dokodemo"
  15. "v2ray.com/core/proxy/freedom"
  16. "v2ray.com/core/proxy/shadowsocks"
  17. "v2ray.com/core/testing/servers/tcp"
  18. "v2ray.com/core/testing/servers/udp"
  19. . "v2ray.com/ext/assert"
  20. )
  21. func TestShadowsocksAES256TCP(t *testing.T) {
  22. assert := With(t)
  23. tcpServer := tcp.Server{
  24. MsgProcessor: xor,
  25. }
  26. dest, err := tcpServer.Start()
  27. assert(err, IsNil)
  28. defer tcpServer.Close()
  29. account := serial.ToTypedMessage(&shadowsocks.Account{
  30. Password: "shadowsocks-password",
  31. CipherType: shadowsocks.CipherType_AES_256_CFB,
  32. Ota: shadowsocks.Account_Enabled,
  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. assert(err, IsNil)
  106. var wg sync.WaitGroup
  107. wg.Add(10)
  108. for i := 0; i < 10; i++ {
  109. go func() {
  110. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  111. IP: []byte{127, 0, 0, 1},
  112. Port: int(clientPort),
  113. })
  114. assert(err, IsNil)
  115. payload := make([]byte, 10240*1024)
  116. rand.Read(payload)
  117. nBytes, err := conn.Write([]byte(payload))
  118. assert(err, IsNil)
  119. assert(nBytes, Equals, len(payload))
  120. response := readFrom(conn, time.Second*20, 10240*1024)
  121. assert(response, Equals, xor([]byte(payload)))
  122. assert(conn.Close(), IsNil)
  123. wg.Done()
  124. }()
  125. }
  126. wg.Wait()
  127. CloseAllServers(servers)
  128. }
  129. func TestShadowsocksAES128UDP(t *testing.T) {
  130. assert := With(t)
  131. udpServer := udp.Server{
  132. MsgProcessor: xor,
  133. }
  134. dest, err := udpServer.Start()
  135. assert(err, IsNil)
  136. defer udpServer.Close()
  137. account := serial.ToTypedMessage(&shadowsocks.Account{
  138. Password: "shadowsocks-password",
  139. CipherType: shadowsocks.CipherType_AES_128_CFB,
  140. Ota: shadowsocks.Account_Enabled,
  141. })
  142. serverPort := tcp.PickPort()
  143. serverConfig := &core.Config{
  144. App: []*serial.TypedMessage{
  145. serial.ToTypedMessage(&log.Config{
  146. ErrorLogLevel: clog.Severity_Debug,
  147. ErrorLogType: log.LogType_Console,
  148. }),
  149. },
  150. Inbound: []*core.InboundHandlerConfig{
  151. {
  152. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  153. PortRange: net.SinglePortRange(serverPort),
  154. Listen: net.NewIPOrDomain(net.LocalHostIP),
  155. }),
  156. ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{
  157. User: &protocol.User{
  158. Account: account,
  159. Level: 1,
  160. },
  161. Network: []net.Network{net.Network_UDP},
  162. }),
  163. },
  164. },
  165. Outbound: []*core.OutboundHandlerConfig{
  166. {
  167. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  168. },
  169. },
  170. }
  171. clientPort := tcp.PickPort()
  172. clientConfig := &core.Config{
  173. App: []*serial.TypedMessage{
  174. serial.ToTypedMessage(&log.Config{
  175. ErrorLogLevel: clog.Severity_Debug,
  176. ErrorLogType: log.LogType_Console,
  177. }),
  178. },
  179. Inbound: []*core.InboundHandlerConfig{
  180. {
  181. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  182. PortRange: net.SinglePortRange(clientPort),
  183. Listen: net.NewIPOrDomain(net.LocalHostIP),
  184. }),
  185. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  186. Address: net.NewIPOrDomain(dest.Address),
  187. Port: uint32(dest.Port),
  188. NetworkList: &net.NetworkList{
  189. Network: []net.Network{net.Network_UDP},
  190. },
  191. }),
  192. },
  193. },
  194. Outbound: []*core.OutboundHandlerConfig{
  195. {
  196. ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{
  197. Server: []*protocol.ServerEndpoint{
  198. {
  199. Address: net.NewIPOrDomain(net.LocalHostIP),
  200. Port: uint32(serverPort),
  201. User: []*protocol.User{
  202. {
  203. Account: account,
  204. },
  205. },
  206. },
  207. },
  208. }),
  209. },
  210. },
  211. }
  212. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  213. assert(err, IsNil)
  214. var wg sync.WaitGroup
  215. wg.Add(10)
  216. for i := 0; i < 10; i++ {
  217. go func() {
  218. conn, err := net.DialUDP("udp", nil, &net.UDPAddr{
  219. IP: []byte{127, 0, 0, 1},
  220. Port: int(clientPort),
  221. })
  222. assert(err, IsNil)
  223. payload := make([]byte, 1024)
  224. rand.Read(payload)
  225. nBytes, err := conn.Write([]byte(payload))
  226. assert(err, IsNil)
  227. assert(nBytes, Equals, len(payload))
  228. response := readFrom(conn, time.Second*5, 1024)
  229. assert(response, Equals, xor([]byte(payload)))
  230. assert(conn.Close(), IsNil)
  231. wg.Done()
  232. }()
  233. }
  234. wg.Wait()
  235. CloseAllServers(servers)
  236. }
  237. func TestShadowsocksChacha20TCP(t *testing.T) {
  238. assert := With(t)
  239. tcpServer := tcp.Server{
  240. MsgProcessor: xor,
  241. }
  242. dest, err := tcpServer.Start()
  243. assert(err, IsNil)
  244. defer tcpServer.Close()
  245. account := serial.ToTypedMessage(&shadowsocks.Account{
  246. Password: "shadowsocks-password",
  247. CipherType: shadowsocks.CipherType_CHACHA20_IETF,
  248. Ota: shadowsocks.Account_Enabled,
  249. })
  250. serverPort := tcp.PickPort()
  251. serverConfig := &core.Config{
  252. App: []*serial.TypedMessage{
  253. serial.ToTypedMessage(&log.Config{
  254. ErrorLogLevel: clog.Severity_Debug,
  255. ErrorLogType: log.LogType_Console,
  256. }),
  257. },
  258. Inbound: []*core.InboundHandlerConfig{
  259. {
  260. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  261. PortRange: net.SinglePortRange(serverPort),
  262. Listen: net.NewIPOrDomain(net.LocalHostIP),
  263. }),
  264. ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{
  265. User: &protocol.User{
  266. Account: account,
  267. Level: 1,
  268. },
  269. Network: []net.Network{net.Network_TCP},
  270. }),
  271. },
  272. },
  273. Outbound: []*core.OutboundHandlerConfig{
  274. {
  275. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  276. },
  277. },
  278. }
  279. clientPort := tcp.PickPort()
  280. clientConfig := &core.Config{
  281. App: []*serial.TypedMessage{
  282. serial.ToTypedMessage(&log.Config{
  283. ErrorLogLevel: clog.Severity_Debug,
  284. ErrorLogType: log.LogType_Console,
  285. }),
  286. },
  287. Inbound: []*core.InboundHandlerConfig{
  288. {
  289. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  290. PortRange: net.SinglePortRange(clientPort),
  291. Listen: net.NewIPOrDomain(net.LocalHostIP),
  292. }),
  293. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  294. Address: net.NewIPOrDomain(dest.Address),
  295. Port: uint32(dest.Port),
  296. NetworkList: &net.NetworkList{
  297. Network: []net.Network{net.Network_TCP},
  298. },
  299. }),
  300. },
  301. },
  302. Outbound: []*core.OutboundHandlerConfig{
  303. {
  304. ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{
  305. Server: []*protocol.ServerEndpoint{
  306. {
  307. Address: net.NewIPOrDomain(net.LocalHostIP),
  308. Port: uint32(serverPort),
  309. User: []*protocol.User{
  310. {
  311. Account: account,
  312. },
  313. },
  314. },
  315. },
  316. }),
  317. },
  318. },
  319. }
  320. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  321. assert(err, IsNil)
  322. var wg sync.WaitGroup
  323. wg.Add(10)
  324. for i := 0; i < 10; i++ {
  325. go func() {
  326. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  327. IP: []byte{127, 0, 0, 1},
  328. Port: int(clientPort),
  329. })
  330. assert(err, IsNil)
  331. payload := make([]byte, 10240*1024)
  332. rand.Read(payload)
  333. nBytes, err := conn.Write([]byte(payload))
  334. assert(err, IsNil)
  335. assert(nBytes, Equals, len(payload))
  336. response := readFrom(conn, time.Second*20, 10240*1024)
  337. assert(response, Equals, xor([]byte(payload)))
  338. assert(conn.Close(), IsNil)
  339. wg.Done()
  340. }()
  341. }
  342. wg.Wait()
  343. CloseAllServers(servers)
  344. }
  345. func TestShadowsocksAES256GCMTCP(t *testing.T) {
  346. assert := With(t)
  347. tcpServer := tcp.Server{
  348. MsgProcessor: xor,
  349. }
  350. dest, err := tcpServer.Start()
  351. assert(err, IsNil)
  352. defer tcpServer.Close()
  353. account := serial.ToTypedMessage(&shadowsocks.Account{
  354. Password: "shadowsocks-password",
  355. CipherType: shadowsocks.CipherType_AES_256_GCM,
  356. })
  357. serverPort := tcp.PickPort()
  358. serverConfig := &core.Config{
  359. App: []*serial.TypedMessage{
  360. serial.ToTypedMessage(&log.Config{
  361. ErrorLogLevel: clog.Severity_Debug,
  362. ErrorLogType: log.LogType_Console,
  363. }),
  364. },
  365. Inbound: []*core.InboundHandlerConfig{
  366. {
  367. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  368. PortRange: net.SinglePortRange(serverPort),
  369. Listen: net.NewIPOrDomain(net.LocalHostIP),
  370. }),
  371. ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{
  372. User: &protocol.User{
  373. Account: account,
  374. Level: 1,
  375. },
  376. Network: []net.Network{net.Network_TCP},
  377. }),
  378. },
  379. },
  380. Outbound: []*core.OutboundHandlerConfig{
  381. {
  382. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  383. },
  384. },
  385. }
  386. clientPort := tcp.PickPort()
  387. clientConfig := &core.Config{
  388. App: []*serial.TypedMessage{
  389. serial.ToTypedMessage(&log.Config{
  390. ErrorLogLevel: clog.Severity_Debug,
  391. ErrorLogType: log.LogType_Console,
  392. }),
  393. },
  394. Inbound: []*core.InboundHandlerConfig{
  395. {
  396. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  397. PortRange: net.SinglePortRange(clientPort),
  398. Listen: net.NewIPOrDomain(net.LocalHostIP),
  399. }),
  400. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  401. Address: net.NewIPOrDomain(dest.Address),
  402. Port: uint32(dest.Port),
  403. NetworkList: &net.NetworkList{
  404. Network: []net.Network{net.Network_TCP},
  405. },
  406. }),
  407. },
  408. },
  409. Outbound: []*core.OutboundHandlerConfig{
  410. {
  411. ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{
  412. Server: []*protocol.ServerEndpoint{
  413. {
  414. Address: net.NewIPOrDomain(net.LocalHostIP),
  415. Port: uint32(serverPort),
  416. User: []*protocol.User{
  417. {
  418. Account: account,
  419. },
  420. },
  421. },
  422. },
  423. }),
  424. },
  425. },
  426. }
  427. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  428. assert(err, IsNil)
  429. var wg sync.WaitGroup
  430. wg.Add(10)
  431. for i := 0; i < 10; i++ {
  432. go func() {
  433. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  434. IP: []byte{127, 0, 0, 1},
  435. Port: int(clientPort),
  436. })
  437. assert(err, IsNil)
  438. payload := make([]byte, 10240*1024)
  439. rand.Read(payload)
  440. nBytes, err := conn.Write([]byte(payload))
  441. assert(err, IsNil)
  442. assert(nBytes, Equals, len(payload))
  443. response := readFrom(conn, time.Second*20, 10240*1024)
  444. assert(response, Equals, xor([]byte(payload)))
  445. assert(conn.Close(), IsNil)
  446. wg.Done()
  447. }()
  448. }
  449. wg.Wait()
  450. CloseAllServers(servers)
  451. }
  452. func TestShadowsocksAES128GCMUDP(t *testing.T) {
  453. assert := With(t)
  454. udpServer := udp.Server{
  455. MsgProcessor: xor,
  456. }
  457. dest, err := udpServer.Start()
  458. assert(err, IsNil)
  459. defer udpServer.Close()
  460. account := serial.ToTypedMessage(&shadowsocks.Account{
  461. Password: "shadowsocks-password",
  462. CipherType: shadowsocks.CipherType_AES_128_GCM,
  463. })
  464. serverPort := tcp.PickPort()
  465. serverConfig := &core.Config{
  466. App: []*serial.TypedMessage{
  467. serial.ToTypedMessage(&log.Config{
  468. ErrorLogLevel: clog.Severity_Debug,
  469. ErrorLogType: log.LogType_Console,
  470. }),
  471. },
  472. Inbound: []*core.InboundHandlerConfig{
  473. {
  474. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  475. PortRange: net.SinglePortRange(serverPort),
  476. Listen: net.NewIPOrDomain(net.LocalHostIP),
  477. }),
  478. ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{
  479. User: &protocol.User{
  480. Account: account,
  481. Level: 1,
  482. },
  483. Network: []net.Network{net.Network_UDP},
  484. }),
  485. },
  486. },
  487. Outbound: []*core.OutboundHandlerConfig{
  488. {
  489. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  490. },
  491. },
  492. }
  493. clientPort := tcp.PickPort()
  494. clientConfig := &core.Config{
  495. App: []*serial.TypedMessage{
  496. serial.ToTypedMessage(&log.Config{
  497. ErrorLogLevel: clog.Severity_Debug,
  498. ErrorLogType: log.LogType_Console,
  499. }),
  500. },
  501. Inbound: []*core.InboundHandlerConfig{
  502. {
  503. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  504. PortRange: net.SinglePortRange(clientPort),
  505. Listen: net.NewIPOrDomain(net.LocalHostIP),
  506. }),
  507. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  508. Address: net.NewIPOrDomain(dest.Address),
  509. Port: uint32(dest.Port),
  510. NetworkList: &net.NetworkList{
  511. Network: []net.Network{net.Network_UDP},
  512. },
  513. }),
  514. },
  515. },
  516. Outbound: []*core.OutboundHandlerConfig{
  517. {
  518. ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{
  519. Server: []*protocol.ServerEndpoint{
  520. {
  521. Address: net.NewIPOrDomain(net.LocalHostIP),
  522. Port: uint32(serverPort),
  523. User: []*protocol.User{
  524. {
  525. Account: account,
  526. },
  527. },
  528. },
  529. },
  530. }),
  531. },
  532. },
  533. }
  534. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  535. assert(err, IsNil)
  536. var wg sync.WaitGroup
  537. wg.Add(10)
  538. for i := 0; i < 10; i++ {
  539. go func() {
  540. conn, err := net.DialUDP("udp", nil, &net.UDPAddr{
  541. IP: []byte{127, 0, 0, 1},
  542. Port: int(clientPort),
  543. })
  544. assert(err, IsNil)
  545. payload := make([]byte, 1024)
  546. rand.Read(payload)
  547. nBytes, err := conn.Write([]byte(payload))
  548. assert(err, IsNil)
  549. assert(nBytes, Equals, len(payload))
  550. response := readFrom(conn, time.Second*5, 1024)
  551. assert(response, Equals, xor([]byte(payload)))
  552. assert(conn.Close(), IsNil)
  553. wg.Done()
  554. }()
  555. }
  556. wg.Wait()
  557. CloseAllServers(servers)
  558. }
  559. func TestShadowsocksAES128GCMUDPMux(t *testing.T) {
  560. assert := With(t)
  561. udpServer := udp.Server{
  562. MsgProcessor: xor,
  563. }
  564. dest, err := udpServer.Start()
  565. assert(err, IsNil)
  566. defer udpServer.Close()
  567. account := serial.ToTypedMessage(&shadowsocks.Account{
  568. Password: "shadowsocks-password",
  569. CipherType: shadowsocks.CipherType_AES_128_GCM,
  570. })
  571. serverPort := tcp.PickPort()
  572. serverConfig := &core.Config{
  573. App: []*serial.TypedMessage{
  574. serial.ToTypedMessage(&log.Config{
  575. ErrorLogLevel: clog.Severity_Debug,
  576. ErrorLogType: log.LogType_Console,
  577. }),
  578. },
  579. Inbound: []*core.InboundHandlerConfig{
  580. {
  581. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  582. PortRange: net.SinglePortRange(serverPort),
  583. Listen: net.NewIPOrDomain(net.LocalHostIP),
  584. }),
  585. ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{
  586. User: &protocol.User{
  587. Account: account,
  588. Level: 1,
  589. },
  590. Network: []net.Network{net.Network_TCP},
  591. }),
  592. },
  593. },
  594. Outbound: []*core.OutboundHandlerConfig{
  595. {
  596. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  597. },
  598. },
  599. }
  600. clientPort := tcp.PickPort()
  601. clientConfig := &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(clientPort),
  612. Listen: net.NewIPOrDomain(net.LocalHostIP),
  613. }),
  614. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  615. Address: net.NewIPOrDomain(dest.Address),
  616. Port: uint32(dest.Port),
  617. NetworkList: &net.NetworkList{
  618. Network: []net.Network{net.Network_UDP},
  619. },
  620. }),
  621. },
  622. },
  623. Outbound: []*core.OutboundHandlerConfig{
  624. {
  625. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  626. MultiplexSettings: &proxyman.MultiplexingConfig{
  627. Enabled: true,
  628. Concurrency: 8,
  629. },
  630. }),
  631. ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{
  632. Server: []*protocol.ServerEndpoint{
  633. {
  634. Address: net.NewIPOrDomain(net.LocalHostIP),
  635. Port: uint32(serverPort),
  636. User: []*protocol.User{
  637. {
  638. Account: account,
  639. },
  640. },
  641. },
  642. },
  643. }),
  644. },
  645. },
  646. }
  647. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  648. assert(err, IsNil)
  649. var wg sync.WaitGroup
  650. wg.Add(10)
  651. for i := 0; i < 10; i++ {
  652. go func() {
  653. conn, err := net.DialUDP("udp", nil, &net.UDPAddr{
  654. IP: []byte{127, 0, 0, 1},
  655. Port: int(clientPort),
  656. })
  657. assert(err, IsNil)
  658. payload := make([]byte, 1024)
  659. rand.Read(payload)
  660. nBytes, err := conn.Write([]byte(payload))
  661. assert(err, IsNil)
  662. assert(nBytes, Equals, len(payload))
  663. response := readFrom(conn, time.Second*5, 1024)
  664. assert(response, Equals, xor([]byte(payload)))
  665. assert(conn.Close(), IsNil)
  666. wg.Done()
  667. }()
  668. }
  669. wg.Wait()
  670. CloseAllServers(servers)
  671. }