shadowsocks_test.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487
  1. package scenarios
  2. import (
  3. "testing"
  4. "time"
  5. "github.com/xtls/xray-core/app/log"
  6. "github.com/xtls/xray-core/app/proxyman"
  7. "github.com/xtls/xray-core/common"
  8. clog "github.com/xtls/xray-core/common/log"
  9. "github.com/xtls/xray-core/common/net"
  10. "github.com/xtls/xray-core/common/protocol"
  11. "github.com/xtls/xray-core/common/serial"
  12. "github.com/xtls/xray-core/core"
  13. "github.com/xtls/xray-core/proxy/dokodemo"
  14. "github.com/xtls/xray-core/proxy/freedom"
  15. "github.com/xtls/xray-core/proxy/shadowsocks"
  16. "github.com/xtls/xray-core/testing/servers/tcp"
  17. "github.com/xtls/xray-core/testing/servers/udp"
  18. "golang.org/x/sync/errgroup"
  19. )
  20. func TestShadowsocksChaCha20Poly1305TCP(t *testing.T) {
  21. tcpServer := tcp.Server{
  22. MsgProcessor: xor,
  23. }
  24. dest, err := tcpServer.Start()
  25. common.Must(err)
  26. defer tcpServer.Close()
  27. account := serial.ToTypedMessage(&shadowsocks.Account{
  28. Password: "shadowsocks-password",
  29. CipherType: shadowsocks.CipherType_CHACHA20_POLY1305,
  30. })
  31. serverPort := tcp.PickPort()
  32. serverConfig := &core.Config{
  33. Inbound: []*core.InboundHandlerConfig{
  34. {
  35. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  36. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  37. Listen: net.NewIPOrDomain(net.LocalHostIP),
  38. }),
  39. ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{
  40. Users: []*protocol.User{{
  41. Account: account,
  42. Level: 1,
  43. }},
  44. Network: []net.Network{net.Network_TCP},
  45. }),
  46. },
  47. },
  48. Outbound: []*core.OutboundHandlerConfig{
  49. {
  50. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  51. },
  52. },
  53. }
  54. clientPort := tcp.PickPort()
  55. clientConfig := &core.Config{
  56. Inbound: []*core.InboundHandlerConfig{
  57. {
  58. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  59. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  60. Listen: net.NewIPOrDomain(net.LocalHostIP),
  61. }),
  62. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  63. Address: net.NewIPOrDomain(dest.Address),
  64. Port: uint32(dest.Port),
  65. Networks: []net.Network{net.Network_TCP},
  66. }),
  67. },
  68. },
  69. Outbound: []*core.OutboundHandlerConfig{
  70. {
  71. ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{
  72. Server: []*protocol.ServerEndpoint{
  73. {
  74. Address: net.NewIPOrDomain(net.LocalHostIP),
  75. Port: uint32(serverPort),
  76. User: []*protocol.User{
  77. {
  78. Account: account,
  79. },
  80. },
  81. },
  82. },
  83. }),
  84. },
  85. },
  86. }
  87. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  88. common.Must(err)
  89. defer CloseAllServers(servers)
  90. var errGroup errgroup.Group
  91. for i := 0; i < 10; i++ {
  92. errGroup.Go(testTCPConn(clientPort, 10240*1024, time.Second*20))
  93. }
  94. if err := errGroup.Wait(); err != nil {
  95. t.Error(err)
  96. }
  97. }
  98. func TestShadowsocksAES256GCMTCP(t *testing.T) {
  99. tcpServer := tcp.Server{
  100. MsgProcessor: xor,
  101. }
  102. dest, err := tcpServer.Start()
  103. common.Must(err)
  104. defer tcpServer.Close()
  105. account := serial.ToTypedMessage(&shadowsocks.Account{
  106. Password: "shadowsocks-password",
  107. CipherType: shadowsocks.CipherType_AES_256_GCM,
  108. })
  109. serverPort := tcp.PickPort()
  110. serverConfig := &core.Config{
  111. App: []*serial.TypedMessage{
  112. serial.ToTypedMessage(&log.Config{
  113. ErrorLogLevel: clog.Severity_Debug,
  114. ErrorLogType: log.LogType_Console,
  115. }),
  116. },
  117. Inbound: []*core.InboundHandlerConfig{
  118. {
  119. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  120. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  121. Listen: net.NewIPOrDomain(net.LocalHostIP),
  122. }),
  123. ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{
  124. Users: []*protocol.User{{
  125. Account: account,
  126. Level: 1,
  127. }},
  128. Network: []net.Network{net.Network_TCP},
  129. }),
  130. },
  131. },
  132. Outbound: []*core.OutboundHandlerConfig{
  133. {
  134. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  135. },
  136. },
  137. }
  138. clientPort := tcp.PickPort()
  139. clientConfig := &core.Config{
  140. App: []*serial.TypedMessage{
  141. serial.ToTypedMessage(&log.Config{
  142. ErrorLogLevel: clog.Severity_Debug,
  143. ErrorLogType: log.LogType_Console,
  144. }),
  145. },
  146. Inbound: []*core.InboundHandlerConfig{
  147. {
  148. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  149. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  150. Listen: net.NewIPOrDomain(net.LocalHostIP),
  151. }),
  152. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  153. Address: net.NewIPOrDomain(dest.Address),
  154. Port: uint32(dest.Port),
  155. Networks: []net.Network{net.Network_TCP},
  156. }),
  157. },
  158. },
  159. Outbound: []*core.OutboundHandlerConfig{
  160. {
  161. ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{
  162. Server: []*protocol.ServerEndpoint{
  163. {
  164. Address: net.NewIPOrDomain(net.LocalHostIP),
  165. Port: uint32(serverPort),
  166. User: []*protocol.User{
  167. {
  168. Account: account,
  169. },
  170. },
  171. },
  172. },
  173. }),
  174. },
  175. },
  176. }
  177. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  178. common.Must(err)
  179. defer CloseAllServers(servers)
  180. var errGroup errgroup.Group
  181. for i := 0; i < 10; i++ {
  182. errGroup.Go(testTCPConn(clientPort, 10240*1024, time.Second*20))
  183. }
  184. if err := errGroup.Wait(); err != nil {
  185. t.Error(err)
  186. }
  187. }
  188. func TestShadowsocksAES128GCMUDP(t *testing.T) {
  189. udpServer := udp.Server{
  190. MsgProcessor: xor,
  191. }
  192. dest, err := udpServer.Start()
  193. common.Must(err)
  194. defer udpServer.Close()
  195. account := serial.ToTypedMessage(&shadowsocks.Account{
  196. Password: "shadowsocks-password",
  197. CipherType: shadowsocks.CipherType_AES_128_GCM,
  198. })
  199. serverPort := udp.PickPort()
  200. serverConfig := &core.Config{
  201. App: []*serial.TypedMessage{
  202. serial.ToTypedMessage(&log.Config{
  203. ErrorLogLevel: clog.Severity_Debug,
  204. ErrorLogType: log.LogType_Console,
  205. }),
  206. },
  207. Inbound: []*core.InboundHandlerConfig{
  208. {
  209. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  210. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  211. Listen: net.NewIPOrDomain(net.LocalHostIP),
  212. }),
  213. ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{
  214. Users: []*protocol.User{{
  215. Account: account,
  216. Level: 1,
  217. }},
  218. Network: []net.Network{net.Network_UDP},
  219. }),
  220. },
  221. },
  222. Outbound: []*core.OutboundHandlerConfig{
  223. {
  224. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  225. },
  226. },
  227. }
  228. clientPort := udp.PickPort()
  229. clientConfig := &core.Config{
  230. App: []*serial.TypedMessage{
  231. serial.ToTypedMessage(&log.Config{
  232. ErrorLogLevel: clog.Severity_Debug,
  233. ErrorLogType: log.LogType_Console,
  234. }),
  235. },
  236. Inbound: []*core.InboundHandlerConfig{
  237. {
  238. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  239. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  240. Listen: net.NewIPOrDomain(net.LocalHostIP),
  241. }),
  242. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  243. Address: net.NewIPOrDomain(dest.Address),
  244. Port: uint32(dest.Port),
  245. Networks: []net.Network{net.Network_UDP},
  246. }),
  247. },
  248. },
  249. Outbound: []*core.OutboundHandlerConfig{
  250. {
  251. ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{
  252. Server: []*protocol.ServerEndpoint{
  253. {
  254. Address: net.NewIPOrDomain(net.LocalHostIP),
  255. Port: uint32(serverPort),
  256. User: []*protocol.User{
  257. {
  258. Account: account,
  259. },
  260. },
  261. },
  262. },
  263. }),
  264. },
  265. },
  266. }
  267. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  268. common.Must(err)
  269. defer CloseAllServers(servers)
  270. var errGroup errgroup.Group
  271. for i := 0; i < 10; i++ {
  272. errGroup.Go(testUDPConn(clientPort, 1024, time.Second*5))
  273. }
  274. if err := errGroup.Wait(); err != nil {
  275. t.Error(err)
  276. }
  277. }
  278. func TestShadowsocksAES128GCMUDPMux(t *testing.T) {
  279. udpServer := udp.Server{
  280. MsgProcessor: xor,
  281. }
  282. dest, err := udpServer.Start()
  283. common.Must(err)
  284. defer udpServer.Close()
  285. account := serial.ToTypedMessage(&shadowsocks.Account{
  286. Password: "shadowsocks-password",
  287. CipherType: shadowsocks.CipherType_AES_128_GCM,
  288. })
  289. serverPort := tcp.PickPort()
  290. serverConfig := &core.Config{
  291. App: []*serial.TypedMessage{
  292. serial.ToTypedMessage(&log.Config{
  293. ErrorLogLevel: clog.Severity_Debug,
  294. ErrorLogType: log.LogType_Console,
  295. }),
  296. },
  297. Inbound: []*core.InboundHandlerConfig{
  298. {
  299. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  300. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  301. Listen: net.NewIPOrDomain(net.LocalHostIP),
  302. }),
  303. ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{
  304. Users: []*protocol.User{{
  305. Account: account,
  306. Level: 1,
  307. }},
  308. Network: []net.Network{net.Network_TCP},
  309. }),
  310. },
  311. },
  312. Outbound: []*core.OutboundHandlerConfig{
  313. {
  314. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  315. },
  316. },
  317. }
  318. clientPort := udp.PickPort()
  319. clientConfig := &core.Config{
  320. App: []*serial.TypedMessage{
  321. serial.ToTypedMessage(&log.Config{
  322. ErrorLogLevel: clog.Severity_Debug,
  323. ErrorLogType: log.LogType_Console,
  324. }),
  325. },
  326. Inbound: []*core.InboundHandlerConfig{
  327. {
  328. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  329. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  330. Listen: net.NewIPOrDomain(net.LocalHostIP),
  331. }),
  332. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  333. Address: net.NewIPOrDomain(dest.Address),
  334. Port: uint32(dest.Port),
  335. Networks: []net.Network{net.Network_UDP},
  336. }),
  337. },
  338. },
  339. Outbound: []*core.OutboundHandlerConfig{
  340. {
  341. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  342. MultiplexSettings: &proxyman.MultiplexingConfig{
  343. Enabled: true,
  344. Concurrency: 8,
  345. },
  346. }),
  347. ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{
  348. Server: []*protocol.ServerEndpoint{
  349. {
  350. Address: net.NewIPOrDomain(net.LocalHostIP),
  351. Port: uint32(serverPort),
  352. User: []*protocol.User{
  353. {
  354. Account: account,
  355. },
  356. },
  357. },
  358. },
  359. }),
  360. },
  361. },
  362. }
  363. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  364. common.Must(err)
  365. defer CloseAllServers(servers)
  366. var errGroup errgroup.Group
  367. for i := 0; i < 10; i++ {
  368. errGroup.Go(testUDPConn(clientPort, 1024, time.Second*5))
  369. }
  370. if err := errGroup.Wait(); err != nil {
  371. t.Error(err)
  372. }
  373. }
  374. func TestShadowsocksNone(t *testing.T) {
  375. tcpServer := tcp.Server{
  376. MsgProcessor: xor,
  377. }
  378. dest, err := tcpServer.Start()
  379. common.Must(err)
  380. defer tcpServer.Close()
  381. account := serial.ToTypedMessage(&shadowsocks.Account{
  382. Password: "shadowsocks-password",
  383. CipherType: shadowsocks.CipherType_NONE,
  384. })
  385. serverPort := tcp.PickPort()
  386. serverConfig := &core.Config{
  387. Inbound: []*core.InboundHandlerConfig{
  388. {
  389. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  390. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  391. Listen: net.NewIPOrDomain(net.LocalHostIP),
  392. }),
  393. ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{
  394. Users: []*protocol.User{{
  395. Account: account,
  396. Level: 1,
  397. }},
  398. Network: []net.Network{net.Network_TCP},
  399. }),
  400. },
  401. },
  402. Outbound: []*core.OutboundHandlerConfig{
  403. {
  404. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  405. },
  406. },
  407. }
  408. clientPort := tcp.PickPort()
  409. clientConfig := &core.Config{
  410. Inbound: []*core.InboundHandlerConfig{
  411. {
  412. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  413. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  414. Listen: net.NewIPOrDomain(net.LocalHostIP),
  415. }),
  416. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  417. Address: net.NewIPOrDomain(dest.Address),
  418. Port: uint32(dest.Port),
  419. Networks: []net.Network{net.Network_TCP},
  420. }),
  421. },
  422. },
  423. Outbound: []*core.OutboundHandlerConfig{
  424. {
  425. ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{
  426. Server: []*protocol.ServerEndpoint{
  427. {
  428. Address: net.NewIPOrDomain(net.LocalHostIP),
  429. Port: uint32(serverPort),
  430. User: []*protocol.User{
  431. {
  432. Account: account,
  433. },
  434. },
  435. },
  436. },
  437. }),
  438. },
  439. },
  440. }
  441. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  442. common.Must(err)
  443. defer CloseAllServers(servers)
  444. var errGroup errgroup.Group
  445. for i := 0; i < 10; i++ {
  446. errGroup.Go(testTCPConn(clientPort, 10240*1024, time.Second*20))
  447. }
  448. if err := errGroup.Wait(); err != nil {
  449. t.Fatal(err)
  450. }
  451. }