shadowsocks_test.go 9.1 KB

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