shadowsocks_test.go 12 KB

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