shadowsocks_test.go 12 KB

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