shadowsocks_test.go 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  1. package scenarios
  2. import (
  3. "crypto/rand"
  4. "sync"
  5. "testing"
  6. "time"
  7. "v2ray.com/core"
  8. "v2ray.com/core/app/log"
  9. "v2ray.com/core/app/proxyman"
  10. "v2ray.com/core/common/net"
  11. "v2ray.com/core/common/protocol"
  12. "v2ray.com/core/common/serial"
  13. "v2ray.com/core/proxy/dokodemo"
  14. "v2ray.com/core/proxy/freedom"
  15. "v2ray.com/core/proxy/shadowsocks"
  16. "v2ray.com/core/testing/servers/tcp"
  17. "v2ray.com/core/testing/servers/udp"
  18. . "v2ray.com/ext/assert"
  19. )
  20. func TestShadowsocksAES256TCP(t *testing.T) {
  21. assert := With(t)
  22. tcpServer := tcp.Server{
  23. MsgProcessor: xor,
  24. }
  25. dest, err := tcpServer.Start()
  26. assert(err, IsNil)
  27. defer tcpServer.Close()
  28. account := serial.ToTypedMessage(&shadowsocks.Account{
  29. Password: "shadowsocks-password",
  30. CipherType: shadowsocks.CipherType_AES_256_CFB,
  31. Ota: shadowsocks.Account_Enabled,
  32. })
  33. serverPort := pickPort()
  34. serverConfig := &core.Config{
  35. App: []*serial.TypedMessage{
  36. serial.ToTypedMessage(&log.Config{
  37. ErrorLogLevel: log.LogLevel_Debug,
  38. ErrorLogType: log.LogType_Console,
  39. }),
  40. },
  41. Inbound: []*proxyman.InboundHandlerConfig{
  42. {
  43. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  44. PortRange: net.SinglePortRange(serverPort),
  45. Listen: net.NewIPOrDomain(net.LocalHostIP),
  46. }),
  47. ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{
  48. User: &protocol.User{
  49. Account: account,
  50. Level: 1,
  51. },
  52. }),
  53. },
  54. },
  55. Outbound: []*proxyman.OutboundHandlerConfig{
  56. {
  57. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  58. },
  59. },
  60. }
  61. clientPort := pickPort()
  62. clientConfig := &core.Config{
  63. App: []*serial.TypedMessage{
  64. serial.ToTypedMessage(&log.Config{
  65. ErrorLogLevel: log.LogLevel_Debug,
  66. ErrorLogType: log.LogType_Console,
  67. }),
  68. },
  69. Inbound: []*proxyman.InboundHandlerConfig{
  70. {
  71. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  72. PortRange: net.SinglePortRange(clientPort),
  73. Listen: net.NewIPOrDomain(net.LocalHostIP),
  74. }),
  75. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  76. Address: net.NewIPOrDomain(dest.Address),
  77. Port: uint32(dest.Port),
  78. NetworkList: &net.NetworkList{
  79. Network: []net.Network{net.Network_TCP},
  80. },
  81. }),
  82. },
  83. },
  84. Outbound: []*proxyman.OutboundHandlerConfig{
  85. {
  86. ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{
  87. Server: []*protocol.ServerEndpoint{
  88. {
  89. Address: net.NewIPOrDomain(net.LocalHostIP),
  90. Port: uint32(serverPort),
  91. User: []*protocol.User{
  92. {
  93. Account: account,
  94. },
  95. },
  96. },
  97. },
  98. }),
  99. },
  100. },
  101. }
  102. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  103. assert(err, IsNil)
  104. var wg sync.WaitGroup
  105. wg.Add(10)
  106. for i := 0; i < 10; i++ {
  107. go func() {
  108. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  109. IP: []byte{127, 0, 0, 1},
  110. Port: int(clientPort),
  111. })
  112. assert(err, IsNil)
  113. payload := make([]byte, 10240*1024)
  114. rand.Read(payload)
  115. nBytes, err := conn.Write([]byte(payload))
  116. assert(err, IsNil)
  117. assert(nBytes, Equals, len(payload))
  118. response := readFrom(conn, time.Second*20, 10240*1024)
  119. assert(response, Equals, xor([]byte(payload)))
  120. assert(conn.Close(), IsNil)
  121. wg.Done()
  122. }()
  123. }
  124. wg.Wait()
  125. CloseAllServers(servers)
  126. }
  127. func TestShadowsocksAES128UDP(t *testing.T) {
  128. assert := With(t)
  129. udpServer := udp.Server{
  130. MsgProcessor: xor,
  131. }
  132. dest, err := udpServer.Start()
  133. assert(err, IsNil)
  134. defer udpServer.Close()
  135. account := serial.ToTypedMessage(&shadowsocks.Account{
  136. Password: "shadowsocks-password",
  137. CipherType: shadowsocks.CipherType_AES_128_CFB,
  138. Ota: shadowsocks.Account_Enabled,
  139. })
  140. serverPort := pickPort()
  141. serverConfig := &core.Config{
  142. App: []*serial.TypedMessage{
  143. serial.ToTypedMessage(&log.Config{
  144. ErrorLogLevel: log.LogLevel_Debug,
  145. ErrorLogType: log.LogType_Console,
  146. }),
  147. },
  148. Inbound: []*proxyman.InboundHandlerConfig{
  149. {
  150. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  151. PortRange: net.SinglePortRange(serverPort),
  152. Listen: net.NewIPOrDomain(net.LocalHostIP),
  153. }),
  154. ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{
  155. UdpEnabled: true,
  156. User: &protocol.User{
  157. Account: account,
  158. Level: 1,
  159. },
  160. }),
  161. },
  162. },
  163. Outbound: []*proxyman.OutboundHandlerConfig{
  164. {
  165. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  166. },
  167. },
  168. }
  169. clientPort := pickPort()
  170. clientConfig := &core.Config{
  171. App: []*serial.TypedMessage{
  172. serial.ToTypedMessage(&log.Config{
  173. ErrorLogLevel: log.LogLevel_Debug,
  174. ErrorLogType: log.LogType_Console,
  175. }),
  176. },
  177. Inbound: []*proxyman.InboundHandlerConfig{
  178. {
  179. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  180. PortRange: net.SinglePortRange(clientPort),
  181. Listen: net.NewIPOrDomain(net.LocalHostIP),
  182. }),
  183. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  184. Address: net.NewIPOrDomain(dest.Address),
  185. Port: uint32(dest.Port),
  186. NetworkList: &net.NetworkList{
  187. Network: []net.Network{net.Network_UDP},
  188. },
  189. }),
  190. },
  191. },
  192. Outbound: []*proxyman.OutboundHandlerConfig{
  193. {
  194. ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{
  195. Server: []*protocol.ServerEndpoint{
  196. {
  197. Address: net.NewIPOrDomain(net.LocalHostIP),
  198. Port: uint32(serverPort),
  199. User: []*protocol.User{
  200. {
  201. Account: account,
  202. },
  203. },
  204. },
  205. },
  206. }),
  207. },
  208. },
  209. }
  210. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  211. assert(err, IsNil)
  212. var wg sync.WaitGroup
  213. wg.Add(10)
  214. for i := 0; i < 10; i++ {
  215. go func() {
  216. conn, err := net.DialUDP("udp", nil, &net.UDPAddr{
  217. IP: []byte{127, 0, 0, 1},
  218. Port: int(clientPort),
  219. })
  220. assert(err, IsNil)
  221. payload := make([]byte, 1024)
  222. rand.Read(payload)
  223. nBytes, err := conn.Write([]byte(payload))
  224. assert(err, IsNil)
  225. assert(nBytes, Equals, len(payload))
  226. response := readFrom(conn, time.Second*5, 1024)
  227. assert(response, Equals, xor([]byte(payload)))
  228. assert(conn.Close(), IsNil)
  229. wg.Done()
  230. }()
  231. }
  232. wg.Wait()
  233. CloseAllServers(servers)
  234. }
  235. func TestShadowsocksChacha20TCP(t *testing.T) {
  236. assert := With(t)
  237. tcpServer := tcp.Server{
  238. MsgProcessor: xor,
  239. }
  240. dest, err := tcpServer.Start()
  241. assert(err, IsNil)
  242. defer tcpServer.Close()
  243. account := serial.ToTypedMessage(&shadowsocks.Account{
  244. Password: "shadowsocks-password",
  245. CipherType: shadowsocks.CipherType_CHACHA20_IETF,
  246. Ota: shadowsocks.Account_Enabled,
  247. })
  248. serverPort := pickPort()
  249. serverConfig := &core.Config{
  250. App: []*serial.TypedMessage{
  251. serial.ToTypedMessage(&log.Config{
  252. ErrorLogLevel: log.LogLevel_Debug,
  253. ErrorLogType: log.LogType_Console,
  254. }),
  255. },
  256. Inbound: []*proxyman.InboundHandlerConfig{
  257. {
  258. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  259. PortRange: net.SinglePortRange(serverPort),
  260. Listen: net.NewIPOrDomain(net.LocalHostIP),
  261. }),
  262. ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{
  263. User: &protocol.User{
  264. Account: account,
  265. Level: 1,
  266. },
  267. }),
  268. },
  269. },
  270. Outbound: []*proxyman.OutboundHandlerConfig{
  271. {
  272. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  273. },
  274. },
  275. }
  276. clientPort := pickPort()
  277. clientConfig := &core.Config{
  278. App: []*serial.TypedMessage{
  279. serial.ToTypedMessage(&log.Config{
  280. ErrorLogLevel: log.LogLevel_Debug,
  281. ErrorLogType: log.LogType_Console,
  282. }),
  283. },
  284. Inbound: []*proxyman.InboundHandlerConfig{
  285. {
  286. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  287. PortRange: net.SinglePortRange(clientPort),
  288. Listen: net.NewIPOrDomain(net.LocalHostIP),
  289. }),
  290. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  291. Address: net.NewIPOrDomain(dest.Address),
  292. Port: uint32(dest.Port),
  293. NetworkList: &net.NetworkList{
  294. Network: []net.Network{net.Network_TCP},
  295. },
  296. }),
  297. },
  298. },
  299. Outbound: []*proxyman.OutboundHandlerConfig{
  300. {
  301. ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{
  302. Server: []*protocol.ServerEndpoint{
  303. {
  304. Address: net.NewIPOrDomain(net.LocalHostIP),
  305. Port: uint32(serverPort),
  306. User: []*protocol.User{
  307. {
  308. Account: account,
  309. },
  310. },
  311. },
  312. },
  313. }),
  314. },
  315. },
  316. }
  317. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  318. assert(err, IsNil)
  319. var wg sync.WaitGroup
  320. wg.Add(10)
  321. for i := 0; i < 10; i++ {
  322. go func() {
  323. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  324. IP: []byte{127, 0, 0, 1},
  325. Port: int(clientPort),
  326. })
  327. assert(err, IsNil)
  328. payload := make([]byte, 10240*1024)
  329. rand.Read(payload)
  330. nBytes, err := conn.Write([]byte(payload))
  331. assert(err, IsNil)
  332. assert(nBytes, Equals, len(payload))
  333. response := readFrom(conn, time.Second*20, 10240*1024)
  334. assert(response, Equals, xor([]byte(payload)))
  335. assert(conn.Close(), IsNil)
  336. wg.Done()
  337. }()
  338. }
  339. wg.Wait()
  340. CloseAllServers(servers)
  341. }