shadowsocks_test.go 23 KB

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