shadowsocks_test.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  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. )
  20. func TestShadowsocksAES256TCP(t *testing.T) {
  21. assert := assert.On(t)
  22. tcpServer := tcp.Server{
  23. MsgProcessor: xor,
  24. }
  25. dest, err := tcpServer.Start()
  26. assert.Error(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. Inbound: []*proxyman.InboundHandlerConfig{
  36. {
  37. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  38. PortRange: v2net.SinglePortRange(serverPort),
  39. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  40. }),
  41. ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{
  42. User: &protocol.User{
  43. Account: account,
  44. },
  45. }),
  46. },
  47. },
  48. Outbound: []*proxyman.OutboundHandlerConfig{
  49. {
  50. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  51. },
  52. },
  53. App: []*serial.TypedMessage{
  54. serial.ToTypedMessage(&log.Config{
  55. ErrorLogLevel: log.LogLevel_Debug,
  56. ErrorLogType: log.LogType_Console,
  57. }),
  58. },
  59. }
  60. clientPort := pickPort()
  61. clientConfig := &core.Config{
  62. Inbound: []*proxyman.InboundHandlerConfig{
  63. {
  64. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  65. PortRange: v2net.SinglePortRange(clientPort),
  66. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  67. }),
  68. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  69. Address: v2net.NewIPOrDomain(dest.Address),
  70. Port: uint32(dest.Port),
  71. NetworkList: &v2net.NetworkList{
  72. Network: []v2net.Network{v2net.Network_TCP},
  73. },
  74. }),
  75. },
  76. },
  77. Outbound: []*proxyman.OutboundHandlerConfig{
  78. {
  79. ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{
  80. Server: []*protocol.ServerEndpoint{
  81. {
  82. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  83. Port: uint32(serverPort),
  84. User: []*protocol.User{
  85. {
  86. Account: account,
  87. },
  88. },
  89. },
  90. },
  91. }),
  92. },
  93. },
  94. App: []*serial.TypedMessage{
  95. serial.ToTypedMessage(&log.Config{
  96. ErrorLogLevel: log.LogLevel_Debug,
  97. ErrorLogType: log.LogType_Console,
  98. }),
  99. },
  100. }
  101. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  102. assert.Error(InitializeServerConfig(clientConfig)).IsNil()
  103. var wg sync.WaitGroup
  104. wg.Add(10)
  105. for i := 0; i < 10; i++ {
  106. go func() {
  107. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  108. IP: []byte{127, 0, 0, 1},
  109. Port: int(clientPort),
  110. })
  111. assert.Error(err).IsNil()
  112. payload := make([]byte, 10240*1024)
  113. rand.Read(payload)
  114. nBytes, err := conn.Write([]byte(payload))
  115. assert.Error(err).IsNil()
  116. assert.Int(nBytes).Equals(len(payload))
  117. response := readFrom(conn, time.Second*10, 10240*1024)
  118. assert.Bytes(response).Equals(xor([]byte(payload)))
  119. assert.Error(conn.Close()).IsNil()
  120. wg.Done()
  121. }()
  122. }
  123. wg.Wait()
  124. CloseAllServers()
  125. }
  126. func TestShadowsocksChacha20TCP(t *testing.T) {
  127. assert := assert.On(t)
  128. tcpServer := tcp.Server{
  129. MsgProcessor: xor,
  130. }
  131. dest, err := tcpServer.Start()
  132. assert.Error(err).IsNil()
  133. defer tcpServer.Close()
  134. account := serial.ToTypedMessage(&shadowsocks.Account{
  135. Password: "shadowsocks-password",
  136. CipherType: shadowsocks.CipherType_CHACHA20_IETF,
  137. Ota: shadowsocks.Account_Enabled,
  138. })
  139. serverPort := pickPort()
  140. serverConfig := &core.Config{
  141. Inbound: []*proxyman.InboundHandlerConfig{
  142. {
  143. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  144. PortRange: v2net.SinglePortRange(serverPort),
  145. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  146. }),
  147. ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{
  148. User: &protocol.User{
  149. Account: account,
  150. },
  151. }),
  152. },
  153. },
  154. Outbound: []*proxyman.OutboundHandlerConfig{
  155. {
  156. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  157. },
  158. },
  159. App: []*serial.TypedMessage{
  160. serial.ToTypedMessage(&log.Config{
  161. ErrorLogLevel: log.LogLevel_Debug,
  162. ErrorLogType: log.LogType_Console,
  163. }),
  164. },
  165. }
  166. clientPort := pickPort()
  167. clientConfig := &core.Config{
  168. Inbound: []*proxyman.InboundHandlerConfig{
  169. {
  170. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  171. PortRange: v2net.SinglePortRange(clientPort),
  172. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  173. }),
  174. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  175. Address: v2net.NewIPOrDomain(dest.Address),
  176. Port: uint32(dest.Port),
  177. NetworkList: &v2net.NetworkList{
  178. Network: []v2net.Network{v2net.Network_TCP},
  179. },
  180. }),
  181. },
  182. },
  183. Outbound: []*proxyman.OutboundHandlerConfig{
  184. {
  185. ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{
  186. Server: []*protocol.ServerEndpoint{
  187. {
  188. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  189. Port: uint32(serverPort),
  190. User: []*protocol.User{
  191. {
  192. Account: account,
  193. },
  194. },
  195. },
  196. },
  197. }),
  198. },
  199. },
  200. App: []*serial.TypedMessage{
  201. serial.ToTypedMessage(&log.Config{
  202. ErrorLogLevel: log.LogLevel_Debug,
  203. ErrorLogType: log.LogType_Console,
  204. }),
  205. },
  206. }
  207. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  208. assert.Error(InitializeServerConfig(clientConfig)).IsNil()
  209. var wg sync.WaitGroup
  210. wg.Add(10)
  211. for i := 0; i < 10; i++ {
  212. go func() {
  213. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  214. IP: []byte{127, 0, 0, 1},
  215. Port: int(clientPort),
  216. })
  217. assert.Error(err).IsNil()
  218. payload := make([]byte, 10240*1024)
  219. rand.Read(payload)
  220. nBytes, err := conn.Write([]byte(payload))
  221. assert.Error(err).IsNil()
  222. assert.Int(nBytes).Equals(len(payload))
  223. response := readFrom(conn, time.Second*10, 10240*1024)
  224. assert.Bytes(response).Equals(xor([]byte(payload)))
  225. assert.Error(conn.Close()).IsNil()
  226. wg.Done()
  227. }()
  228. }
  229. wg.Wait()
  230. CloseAllServers()
  231. }