shadowsocks_test.go 23 KB

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