1
0

socks_test.go 12 KB

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