socks_test.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431
  1. package scenarios
  2. import (
  3. "testing"
  4. "time"
  5. xproxy "golang.org/x/net/proxy"
  6. socks4 "h12.io/socks"
  7. "v2ray.com/core"
  8. "v2ray.com/core/app/proxyman"
  9. "v2ray.com/core/app/router"
  10. "v2ray.com/core/common"
  11. "v2ray.com/core/common/net"
  12. "v2ray.com/core/common/protocol"
  13. "v2ray.com/core/common/serial"
  14. "v2ray.com/core/proxy/blackhole"
  15. "v2ray.com/core/proxy/dokodemo"
  16. "v2ray.com/core/proxy/freedom"
  17. "v2ray.com/core/proxy/socks"
  18. "v2ray.com/core/testing/servers/tcp"
  19. "v2ray.com/core/testing/servers/udp"
  20. . "v2ray.com/ext/assert"
  21. )
  22. func TestSocksBridgeTCP(t *testing.T) {
  23. tcpServer := tcp.Server{
  24. MsgProcessor: xor,
  25. }
  26. dest, err := tcpServer.Start()
  27. common.Must(err)
  28. defer tcpServer.Close()
  29. serverPort := tcp.PickPort()
  30. serverConfig := &core.Config{
  31. Inbound: []*core.InboundHandlerConfig{
  32. {
  33. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  34. PortRange: net.SinglePortRange(serverPort),
  35. Listen: net.NewIPOrDomain(net.LocalHostIP),
  36. }),
  37. ProxySettings: serial.ToTypedMessage(&socks.ServerConfig{
  38. AuthType: socks.AuthType_PASSWORD,
  39. Accounts: map[string]string{
  40. "Test Account": "Test Password",
  41. },
  42. Address: net.NewIPOrDomain(net.LocalHostIP),
  43. UdpEnabled: false,
  44. }),
  45. },
  46. },
  47. Outbound: []*core.OutboundHandlerConfig{
  48. {
  49. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  50. },
  51. },
  52. }
  53. clientPort := tcp.PickPort()
  54. clientConfig := &core.Config{
  55. Inbound: []*core.InboundHandlerConfig{
  56. {
  57. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  58. PortRange: net.SinglePortRange(clientPort),
  59. Listen: net.NewIPOrDomain(net.LocalHostIP),
  60. }),
  61. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  62. Address: net.NewIPOrDomain(dest.Address),
  63. Port: uint32(dest.Port),
  64. NetworkList: &net.NetworkList{
  65. Network: []net.Network{net.Network_TCP},
  66. },
  67. }),
  68. },
  69. },
  70. Outbound: []*core.OutboundHandlerConfig{
  71. {
  72. ProxySettings: serial.ToTypedMessage(&socks.ClientConfig{
  73. Server: []*protocol.ServerEndpoint{
  74. {
  75. Address: net.NewIPOrDomain(net.LocalHostIP),
  76. Port: uint32(serverPort),
  77. User: []*protocol.User{
  78. {
  79. Account: serial.ToTypedMessage(&socks.Account{
  80. Username: "Test Account",
  81. Password: "Test Password",
  82. }),
  83. },
  84. },
  85. },
  86. },
  87. }),
  88. },
  89. },
  90. }
  91. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  92. common.Must(err)
  93. defer CloseAllServers(servers)
  94. if err := testTCPConn(clientPort, 1024, time.Second*2)(); err != nil {
  95. t.Error(err)
  96. }
  97. }
  98. func TestSocksBridageUDP(t *testing.T) {
  99. assert := With(t)
  100. udpServer := udp.Server{
  101. MsgProcessor: xor,
  102. }
  103. dest, err := udpServer.Start()
  104. common.Must(err)
  105. defer udpServer.Close()
  106. serverPort := tcp.PickPort()
  107. serverConfig := &core.Config{
  108. Inbound: []*core.InboundHandlerConfig{
  109. {
  110. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  111. PortRange: net.SinglePortRange(serverPort),
  112. Listen: net.NewIPOrDomain(net.LocalHostIP),
  113. }),
  114. ProxySettings: serial.ToTypedMessage(&socks.ServerConfig{
  115. AuthType: socks.AuthType_PASSWORD,
  116. Accounts: map[string]string{
  117. "Test Account": "Test Password",
  118. },
  119. Address: net.NewIPOrDomain(net.LocalHostIP),
  120. UdpEnabled: true,
  121. }),
  122. },
  123. },
  124. Outbound: []*core.OutboundHandlerConfig{
  125. {
  126. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  127. },
  128. },
  129. }
  130. clientPort := tcp.PickPort()
  131. clientConfig := &core.Config{
  132. Inbound: []*core.InboundHandlerConfig{
  133. {
  134. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  135. PortRange: net.SinglePortRange(clientPort),
  136. Listen: net.NewIPOrDomain(net.LocalHostIP),
  137. }),
  138. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  139. Address: net.NewIPOrDomain(dest.Address),
  140. Port: uint32(dest.Port),
  141. NetworkList: &net.NetworkList{
  142. Network: []net.Network{net.Network_TCP, net.Network_UDP},
  143. },
  144. }),
  145. },
  146. },
  147. Outbound: []*core.OutboundHandlerConfig{
  148. {
  149. ProxySettings: serial.ToTypedMessage(&socks.ClientConfig{
  150. Server: []*protocol.ServerEndpoint{
  151. {
  152. Address: net.NewIPOrDomain(net.LocalHostIP),
  153. Port: uint32(serverPort),
  154. User: []*protocol.User{
  155. {
  156. Account: serial.ToTypedMessage(&socks.Account{
  157. Username: "Test Account",
  158. Password: "Test Password",
  159. }),
  160. },
  161. },
  162. },
  163. },
  164. }),
  165. },
  166. },
  167. }
  168. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  169. common.Must(err)
  170. conn, err := net.DialUDP("udp", nil, &net.UDPAddr{
  171. IP: []byte{127, 0, 0, 1},
  172. Port: int(clientPort),
  173. })
  174. common.Must(err)
  175. payload := "dokodemo request."
  176. nBytes, err := conn.Write([]byte(payload))
  177. common.Must(err)
  178. assert(nBytes, Equals, len(payload))
  179. response := make([]byte, 1024)
  180. nBytes, err = conn.Read(response)
  181. common.Must(err)
  182. assert(response[:nBytes], Equals, xor([]byte(payload)))
  183. assert(conn.Close(), IsNil)
  184. CloseAllServers(servers)
  185. }
  186. func TestSocksBridageUDPWithRouting(t *testing.T) {
  187. assert := With(t)
  188. udpServer := udp.Server{
  189. MsgProcessor: xor,
  190. }
  191. dest, err := udpServer.Start()
  192. common.Must(err)
  193. defer udpServer.Close()
  194. serverPort := tcp.PickPort()
  195. serverConfig := &core.Config{
  196. App: []*serial.TypedMessage{
  197. serial.ToTypedMessage(&router.Config{
  198. Rule: []*router.RoutingRule{
  199. {
  200. TargetTag: &router.RoutingRule_Tag{
  201. Tag: "out",
  202. },
  203. InboundTag: []string{"socks"},
  204. },
  205. },
  206. }),
  207. },
  208. Inbound: []*core.InboundHandlerConfig{
  209. {
  210. Tag: "socks",
  211. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  212. PortRange: net.SinglePortRange(serverPort),
  213. Listen: net.NewIPOrDomain(net.LocalHostIP),
  214. }),
  215. ProxySettings: serial.ToTypedMessage(&socks.ServerConfig{
  216. AuthType: socks.AuthType_NO_AUTH,
  217. Address: net.NewIPOrDomain(net.LocalHostIP),
  218. UdpEnabled: true,
  219. }),
  220. },
  221. },
  222. Outbound: []*core.OutboundHandlerConfig{
  223. {
  224. ProxySettings: serial.ToTypedMessage(&blackhole.Config{}),
  225. },
  226. {
  227. Tag: "out",
  228. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  229. },
  230. },
  231. }
  232. clientPort := tcp.PickPort()
  233. clientConfig := &core.Config{
  234. Inbound: []*core.InboundHandlerConfig{
  235. {
  236. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  237. PortRange: net.SinglePortRange(clientPort),
  238. Listen: net.NewIPOrDomain(net.LocalHostIP),
  239. }),
  240. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  241. Address: net.NewIPOrDomain(dest.Address),
  242. Port: uint32(dest.Port),
  243. NetworkList: &net.NetworkList{
  244. Network: []net.Network{net.Network_TCP, net.Network_UDP},
  245. },
  246. }),
  247. },
  248. },
  249. Outbound: []*core.OutboundHandlerConfig{
  250. {
  251. ProxySettings: serial.ToTypedMessage(&socks.ClientConfig{
  252. Server: []*protocol.ServerEndpoint{
  253. {
  254. Address: net.NewIPOrDomain(net.LocalHostIP),
  255. Port: uint32(serverPort),
  256. },
  257. },
  258. }),
  259. },
  260. },
  261. }
  262. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  263. common.Must(err)
  264. conn, err := net.DialUDP("udp", nil, &net.UDPAddr{
  265. IP: []byte{127, 0, 0, 1},
  266. Port: int(clientPort),
  267. })
  268. common.Must(err)
  269. payload := "dokodemo request."
  270. nBytes, err := conn.Write([]byte(payload))
  271. common.Must(err)
  272. assert(nBytes, Equals, len(payload))
  273. response := make([]byte, 1024)
  274. nBytes, err = conn.Read(response)
  275. common.Must(err)
  276. assert(response[:nBytes], Equals, xor([]byte(payload)))
  277. assert(conn.Close(), IsNil)
  278. CloseAllServers(servers)
  279. }
  280. func TestSocksConformance(t *testing.T) {
  281. assert := With(t)
  282. tcpServer := tcp.Server{
  283. MsgProcessor: xor,
  284. }
  285. dest, err := tcpServer.Start()
  286. common.Must(err)
  287. defer tcpServer.Close()
  288. authPort := tcp.PickPort()
  289. noAuthPort := tcp.PickPort()
  290. serverConfig := &core.Config{
  291. Inbound: []*core.InboundHandlerConfig{
  292. {
  293. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  294. PortRange: net.SinglePortRange(authPort),
  295. Listen: net.NewIPOrDomain(net.LocalHostIP),
  296. }),
  297. ProxySettings: serial.ToTypedMessage(&socks.ServerConfig{
  298. AuthType: socks.AuthType_PASSWORD,
  299. Accounts: map[string]string{
  300. "Test Account": "Test Password",
  301. },
  302. Address: net.NewIPOrDomain(net.LocalHostIP),
  303. UdpEnabled: false,
  304. }),
  305. },
  306. {
  307. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  308. PortRange: net.SinglePortRange(noAuthPort),
  309. Listen: net.NewIPOrDomain(net.LocalHostIP),
  310. }),
  311. ProxySettings: serial.ToTypedMessage(&socks.ServerConfig{
  312. AuthType: socks.AuthType_NO_AUTH,
  313. Accounts: map[string]string{
  314. "Test Account": "Test Password",
  315. },
  316. Address: net.NewIPOrDomain(net.LocalHostIP),
  317. UdpEnabled: false,
  318. }),
  319. },
  320. },
  321. Outbound: []*core.OutboundHandlerConfig{
  322. {
  323. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  324. },
  325. },
  326. }
  327. servers, err := InitializeServerConfigs(serverConfig)
  328. common.Must(err)
  329. {
  330. noAuthDialer, err := xproxy.SOCKS5("tcp", net.TCPDestination(net.LocalHostIP, noAuthPort).NetAddr(), nil, xproxy.Direct)
  331. common.Must(err)
  332. conn, err := noAuthDialer.Dial("tcp", dest.NetAddr())
  333. common.Must(err)
  334. payload := "test payload"
  335. nBytes, err := conn.Write([]byte(payload))
  336. common.Must(err)
  337. assert(nBytes, Equals, len(payload))
  338. response := make([]byte, 1024)
  339. nBytes, err = conn.Read(response)
  340. common.Must(err)
  341. assert(response[:nBytes], Equals, xor([]byte(payload)))
  342. assert(conn.Close(), IsNil)
  343. }
  344. {
  345. authDialer, err := xproxy.SOCKS5("tcp", net.TCPDestination(net.LocalHostIP, authPort).NetAddr(), &xproxy.Auth{User: "Test Account", Password: "Test Password"}, xproxy.Direct)
  346. common.Must(err)
  347. conn, err := authDialer.Dial("tcp", dest.NetAddr())
  348. common.Must(err)
  349. payload := "test payload"
  350. nBytes, err := conn.Write([]byte(payload))
  351. common.Must(err)
  352. assert(nBytes, Equals, len(payload))
  353. response := make([]byte, 1024)
  354. nBytes, err = conn.Read(response)
  355. common.Must(err)
  356. assert(response[:nBytes], Equals, xor([]byte(payload)))
  357. assert(conn.Close(), IsNil)
  358. }
  359. {
  360. dialer := socks4.DialSocksProxy(socks4.SOCKS4, net.TCPDestination(net.LocalHostIP, noAuthPort).NetAddr())
  361. conn, err := dialer("tcp", dest.NetAddr())
  362. common.Must(err)
  363. payload := "test payload"
  364. nBytes, err := conn.Write([]byte(payload))
  365. common.Must(err)
  366. assert(nBytes, Equals, len(payload))
  367. response := make([]byte, 1024)
  368. nBytes, err = conn.Read(response)
  369. common.Must(err)
  370. assert(response[:nBytes], Equals, xor([]byte(payload)))
  371. assert(conn.Close(), IsNil)
  372. }
  373. {
  374. dialer := socks4.DialSocksProxy(socks4.SOCKS4A, net.TCPDestination(net.LocalHostIP, noAuthPort).NetAddr())
  375. conn, err := dialer("tcp", net.TCPDestination(net.LocalHostDomain, tcpServer.Port).NetAddr())
  376. common.Must(err)
  377. payload := "test payload"
  378. nBytes, err := conn.Write([]byte(payload))
  379. common.Must(err)
  380. assert(nBytes, Equals, len(payload))
  381. response := make([]byte, 1024)
  382. nBytes, err = conn.Read(response)
  383. common.Must(err)
  384. assert(response[:nBytes], Equals, xor([]byte(payload)))
  385. assert(conn.Close(), IsNil)
  386. }
  387. CloseAllServers(servers)
  388. }