feature_test.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650
  1. package scenarios
  2. import (
  3. "net"
  4. "testing"
  5. "time"
  6. xproxy "golang.org/x/net/proxy"
  7. "v2ray.com/core"
  8. "v2ray.com/core/app/proxyman"
  9. "v2ray.com/core/app/router"
  10. v2net "v2ray.com/core/common/net"
  11. "v2ray.com/core/common/protocol"
  12. "v2ray.com/core/common/serial"
  13. "v2ray.com/core/common/uuid"
  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/proxy/vmess"
  19. "v2ray.com/core/proxy/vmess/inbound"
  20. "v2ray.com/core/proxy/vmess/outbound"
  21. "v2ray.com/core/testing/assert"
  22. "v2ray.com/core/testing/servers/tcp"
  23. "v2ray.com/core/testing/servers/udp"
  24. "v2ray.com/core/transport/internet"
  25. )
  26. func TestPassiveConnection(t *testing.T) {
  27. assert := assert.On(t)
  28. tcpServer := tcp.Server{
  29. MsgProcessor: xor,
  30. SendFirst: []byte("send first"),
  31. }
  32. dest, err := tcpServer.Start()
  33. assert.Error(err).IsNil()
  34. defer tcpServer.Close()
  35. serverPort := pickPort()
  36. serverConfig := &core.Config{
  37. Inbound: []*proxyman.InboundHandlerConfig{
  38. {
  39. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  40. PortRange: v2net.SinglePortRange(serverPort),
  41. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  42. }),
  43. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  44. Address: v2net.NewIPOrDomain(dest.Address),
  45. Port: uint32(dest.Port),
  46. NetworkList: &v2net.NetworkList{
  47. Network: []v2net.Network{v2net.Network_TCP},
  48. },
  49. }),
  50. },
  51. },
  52. Outbound: []*proxyman.OutboundHandlerConfig{
  53. {
  54. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  55. },
  56. },
  57. }
  58. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  59. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  60. IP: []byte{127, 0, 0, 1},
  61. Port: int(serverPort),
  62. })
  63. assert.Error(err).IsNil()
  64. {
  65. response := make([]byte, 1024)
  66. nBytes, err := conn.Read(response)
  67. assert.Error(err).IsNil()
  68. assert.String(string(response[:nBytes])).Equals("send first")
  69. }
  70. payload := "dokodemo request."
  71. {
  72. nBytes, err := conn.Write([]byte(payload))
  73. assert.Error(err).IsNil()
  74. assert.Int(nBytes).Equals(len(payload))
  75. }
  76. {
  77. response := make([]byte, 1024)
  78. nBytes, err := conn.Read(response)
  79. assert.Error(err).IsNil()
  80. assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload)))
  81. }
  82. assert.Error(conn.Close()).IsNil()
  83. CloseAllServers()
  84. }
  85. func TestProxy(t *testing.T) {
  86. assert := assert.On(t)
  87. tcpServer := tcp.Server{
  88. MsgProcessor: xor,
  89. }
  90. dest, err := tcpServer.Start()
  91. assert.Error(err).IsNil()
  92. defer tcpServer.Close()
  93. serverUserID := protocol.NewID(uuid.New())
  94. serverPort := pickPort()
  95. serverConfig := &core.Config{
  96. Inbound: []*proxyman.InboundHandlerConfig{
  97. {
  98. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  99. PortRange: v2net.SinglePortRange(serverPort),
  100. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  101. }),
  102. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  103. User: []*protocol.User{
  104. {
  105. Account: serial.ToTypedMessage(&vmess.Account{
  106. Id: serverUserID.String(),
  107. }),
  108. },
  109. },
  110. }),
  111. },
  112. },
  113. Outbound: []*proxyman.OutboundHandlerConfig{
  114. {
  115. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  116. },
  117. },
  118. }
  119. proxyUserID := protocol.NewID(uuid.New())
  120. proxyPort := pickPort()
  121. proxyConfig := &core.Config{
  122. Inbound: []*proxyman.InboundHandlerConfig{
  123. {
  124. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  125. PortRange: v2net.SinglePortRange(proxyPort),
  126. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  127. }),
  128. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  129. User: []*protocol.User{
  130. {
  131. Account: serial.ToTypedMessage(&vmess.Account{
  132. Id: proxyUserID.String(),
  133. }),
  134. },
  135. },
  136. }),
  137. },
  138. },
  139. Outbound: []*proxyman.OutboundHandlerConfig{
  140. {
  141. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  142. },
  143. },
  144. }
  145. clientPort := pickPort()
  146. clientConfig := &core.Config{
  147. Inbound: []*proxyman.InboundHandlerConfig{
  148. {
  149. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  150. PortRange: v2net.SinglePortRange(clientPort),
  151. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  152. }),
  153. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  154. Address: v2net.NewIPOrDomain(dest.Address),
  155. Port: uint32(dest.Port),
  156. NetworkList: &v2net.NetworkList{
  157. Network: []v2net.Network{v2net.Network_TCP},
  158. },
  159. }),
  160. },
  161. },
  162. Outbound: []*proxyman.OutboundHandlerConfig{
  163. {
  164. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  165. Receiver: []*protocol.ServerEndpoint{
  166. {
  167. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  168. Port: uint32(serverPort),
  169. User: []*protocol.User{
  170. {
  171. Account: serial.ToTypedMessage(&vmess.Account{
  172. Id: serverUserID.String(),
  173. }),
  174. },
  175. },
  176. },
  177. },
  178. }),
  179. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  180. ProxySettings: &internet.ProxyConfig{
  181. Tag: "proxy",
  182. },
  183. }),
  184. },
  185. {
  186. Tag: "proxy",
  187. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  188. Receiver: []*protocol.ServerEndpoint{
  189. {
  190. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  191. Port: uint32(proxyPort),
  192. User: []*protocol.User{
  193. {
  194. Account: serial.ToTypedMessage(&vmess.Account{
  195. Id: proxyUserID.String(),
  196. }),
  197. },
  198. },
  199. },
  200. },
  201. }),
  202. },
  203. },
  204. }
  205. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  206. assert.Error(InitializeServerConfig(proxyConfig)).IsNil()
  207. assert.Error(InitializeServerConfig(clientConfig)).IsNil()
  208. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  209. IP: []byte{127, 0, 0, 1},
  210. Port: int(clientPort),
  211. })
  212. assert.Error(err).IsNil()
  213. payload := "dokodemo request."
  214. nBytes, err := conn.Write([]byte(payload))
  215. assert.Error(err).IsNil()
  216. assert.Int(nBytes).Equals(len(payload))
  217. response := make([]byte, 1024)
  218. nBytes, err = conn.Read(response)
  219. assert.Error(err).IsNil()
  220. assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload)))
  221. assert.Error(conn.Close()).IsNil()
  222. CloseAllServers()
  223. }
  224. func TestProxyOverKCP(t *testing.T) {
  225. assert := assert.On(t)
  226. tcpServer := tcp.Server{
  227. MsgProcessor: xor,
  228. }
  229. dest, err := tcpServer.Start()
  230. assert.Error(err).IsNil()
  231. defer tcpServer.Close()
  232. serverUserID := protocol.NewID(uuid.New())
  233. serverPort := pickPort()
  234. serverConfig := &core.Config{
  235. Inbound: []*proxyman.InboundHandlerConfig{
  236. {
  237. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  238. PortRange: v2net.SinglePortRange(serverPort),
  239. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  240. StreamSettings: &internet.StreamConfig{
  241. Protocol: internet.TransportProtocol_MKCP,
  242. },
  243. }),
  244. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  245. User: []*protocol.User{
  246. {
  247. Account: serial.ToTypedMessage(&vmess.Account{
  248. Id: serverUserID.String(),
  249. }),
  250. },
  251. },
  252. }),
  253. },
  254. },
  255. Outbound: []*proxyman.OutboundHandlerConfig{
  256. {
  257. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  258. },
  259. },
  260. }
  261. proxyUserID := protocol.NewID(uuid.New())
  262. proxyPort := pickPort()
  263. proxyConfig := &core.Config{
  264. Inbound: []*proxyman.InboundHandlerConfig{
  265. {
  266. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  267. PortRange: v2net.SinglePortRange(proxyPort),
  268. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  269. }),
  270. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  271. User: []*protocol.User{
  272. {
  273. Account: serial.ToTypedMessage(&vmess.Account{
  274. Id: proxyUserID.String(),
  275. }),
  276. },
  277. },
  278. }),
  279. },
  280. },
  281. Outbound: []*proxyman.OutboundHandlerConfig{
  282. {
  283. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  284. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  285. StreamSettings: &internet.StreamConfig{
  286. Protocol: internet.TransportProtocol_MKCP,
  287. },
  288. }),
  289. },
  290. },
  291. }
  292. clientPort := pickPort()
  293. clientConfig := &core.Config{
  294. Inbound: []*proxyman.InboundHandlerConfig{
  295. {
  296. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  297. PortRange: v2net.SinglePortRange(clientPort),
  298. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  299. }),
  300. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  301. Address: v2net.NewIPOrDomain(dest.Address),
  302. Port: uint32(dest.Port),
  303. NetworkList: &v2net.NetworkList{
  304. Network: []v2net.Network{v2net.Network_TCP},
  305. },
  306. }),
  307. },
  308. },
  309. Outbound: []*proxyman.OutboundHandlerConfig{
  310. {
  311. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  312. Receiver: []*protocol.ServerEndpoint{
  313. {
  314. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  315. Port: uint32(serverPort),
  316. User: []*protocol.User{
  317. {
  318. Account: serial.ToTypedMessage(&vmess.Account{
  319. Id: serverUserID.String(),
  320. }),
  321. },
  322. },
  323. },
  324. },
  325. }),
  326. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  327. ProxySettings: &internet.ProxyConfig{
  328. Tag: "proxy",
  329. },
  330. StreamSettings: &internet.StreamConfig{
  331. Protocol: internet.TransportProtocol_MKCP,
  332. },
  333. }),
  334. },
  335. {
  336. Tag: "proxy",
  337. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  338. Receiver: []*protocol.ServerEndpoint{
  339. {
  340. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  341. Port: uint32(proxyPort),
  342. User: []*protocol.User{
  343. {
  344. Account: serial.ToTypedMessage(&vmess.Account{
  345. Id: proxyUserID.String(),
  346. }),
  347. },
  348. },
  349. },
  350. },
  351. }),
  352. },
  353. },
  354. }
  355. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  356. assert.Error(InitializeServerConfig(proxyConfig)).IsNil()
  357. assert.Error(InitializeServerConfig(clientConfig)).IsNil()
  358. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  359. IP: []byte{127, 0, 0, 1},
  360. Port: int(clientPort),
  361. })
  362. assert.Error(err).IsNil()
  363. payload := "dokodemo request."
  364. nBytes, err := conn.Write([]byte(payload))
  365. assert.Error(err).IsNil()
  366. assert.Int(nBytes).Equals(len(payload))
  367. response := make([]byte, 1024)
  368. nBytes, err = conn.Read(response)
  369. assert.Error(err).IsNil()
  370. assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload)))
  371. assert.Error(conn.Close()).IsNil()
  372. CloseAllServers()
  373. }
  374. func TestBlackhole(t *testing.T) {
  375. assert := assert.On(t)
  376. tcpServer := tcp.Server{
  377. MsgProcessor: xor,
  378. }
  379. dest, err := tcpServer.Start()
  380. assert.Error(err).IsNil()
  381. defer tcpServer.Close()
  382. tcpServer2 := tcp.Server{
  383. MsgProcessor: xor,
  384. }
  385. dest2, err := tcpServer2.Start()
  386. assert.Error(err).IsNil()
  387. defer tcpServer2.Close()
  388. serverPort := pickPort()
  389. serverPort2 := pickPort()
  390. serverConfig := &core.Config{
  391. Inbound: []*proxyman.InboundHandlerConfig{
  392. {
  393. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  394. PortRange: v2net.SinglePortRange(serverPort),
  395. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  396. }),
  397. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  398. Address: v2net.NewIPOrDomain(dest.Address),
  399. Port: uint32(dest.Port),
  400. NetworkList: &v2net.NetworkList{
  401. Network: []v2net.Network{v2net.Network_TCP},
  402. },
  403. }),
  404. },
  405. {
  406. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  407. PortRange: v2net.SinglePortRange(serverPort2),
  408. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  409. }),
  410. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  411. Address: v2net.NewIPOrDomain(dest2.Address),
  412. Port: uint32(dest2.Port),
  413. NetworkList: &v2net.NetworkList{
  414. Network: []v2net.Network{v2net.Network_TCP},
  415. },
  416. }),
  417. },
  418. },
  419. Outbound: []*proxyman.OutboundHandlerConfig{
  420. {
  421. Tag: "direct",
  422. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  423. },
  424. {
  425. Tag: "blocked",
  426. ProxySettings: serial.ToTypedMessage(&blackhole.Config{}),
  427. },
  428. },
  429. App: []*serial.TypedMessage{
  430. serial.ToTypedMessage(&router.Config{
  431. Rule: []*router.RoutingRule{
  432. {
  433. Tag: "blocked",
  434. PortRange: v2net.SinglePortRange(dest2.Port),
  435. },
  436. },
  437. }),
  438. },
  439. }
  440. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  441. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  442. IP: []byte{127, 0, 0, 1},
  443. Port: int(serverPort2),
  444. })
  445. assert.Error(err).IsNil()
  446. payload := "dokodemo request."
  447. {
  448. nBytes, err := conn.Write([]byte(payload))
  449. assert.Error(err).IsNil()
  450. assert.Int(nBytes).Equals(len(payload))
  451. }
  452. {
  453. response := make([]byte, 1024)
  454. _, err := conn.Read(response)
  455. assert.Error(err).IsNotNil()
  456. }
  457. assert.Error(conn.Close()).IsNil()
  458. CloseAllServers()
  459. }
  460. func TestForward(t *testing.T) {
  461. assert := assert.On(t)
  462. tcpServer := tcp.Server{
  463. MsgProcessor: xor,
  464. }
  465. dest, err := tcpServer.Start()
  466. assert.Error(err).IsNil()
  467. defer tcpServer.Close()
  468. serverPort := pickPort()
  469. serverConfig := &core.Config{
  470. Inbound: []*proxyman.InboundHandlerConfig{
  471. {
  472. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  473. PortRange: v2net.SinglePortRange(serverPort),
  474. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  475. }),
  476. ProxySettings: serial.ToTypedMessage(&socks.ServerConfig{
  477. AuthType: socks.AuthType_NO_AUTH,
  478. Accounts: map[string]string{
  479. "Test Account": "Test Password",
  480. },
  481. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  482. UdpEnabled: false,
  483. }),
  484. },
  485. },
  486. Outbound: []*proxyman.OutboundHandlerConfig{
  487. {
  488. ProxySettings: serial.ToTypedMessage(&freedom.Config{
  489. DestinationOverride: &freedom.DestinationOverride{
  490. Server: &protocol.ServerEndpoint{
  491. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  492. Port: uint32(dest.Port),
  493. },
  494. },
  495. }),
  496. },
  497. },
  498. }
  499. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  500. {
  501. noAuthDialer, err := xproxy.SOCKS5("tcp", v2net.TCPDestination(v2net.LocalHostIP, serverPort).NetAddr(), nil, xproxy.Direct)
  502. assert.Error(err).IsNil()
  503. conn, err := noAuthDialer.Dial("tcp", "google.com:80")
  504. assert.Error(err).IsNil()
  505. payload := "test payload"
  506. nBytes, err := conn.Write([]byte(payload))
  507. assert.Error(err).IsNil()
  508. assert.Int(nBytes).Equals(len(payload))
  509. response := make([]byte, 1024)
  510. nBytes, err = conn.Read(response)
  511. assert.Error(err).IsNil()
  512. assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload)))
  513. assert.Error(conn.Close()).IsNil()
  514. }
  515. CloseAllServers()
  516. }
  517. func TestUDPConnection(t *testing.T) {
  518. assert := assert.On(t)
  519. udpServer := udp.Server{
  520. MsgProcessor: xor,
  521. }
  522. dest, err := udpServer.Start()
  523. assert.Error(err).IsNil()
  524. defer udpServer.Close()
  525. clientPort := pickPort()
  526. clientConfig := &core.Config{
  527. Inbound: []*proxyman.InboundHandlerConfig{
  528. {
  529. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  530. PortRange: v2net.SinglePortRange(clientPort),
  531. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  532. }),
  533. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  534. Address: v2net.NewIPOrDomain(dest.Address),
  535. Port: uint32(dest.Port),
  536. NetworkList: &v2net.NetworkList{
  537. Network: []v2net.Network{v2net.Network_UDP},
  538. },
  539. }),
  540. },
  541. },
  542. Outbound: []*proxyman.OutboundHandlerConfig{
  543. {
  544. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  545. },
  546. },
  547. }
  548. assert.Error(InitializeServerConfig(clientConfig)).IsNil()
  549. {
  550. conn, err := net.DialUDP("udp", nil, &net.UDPAddr{
  551. IP: []byte{127, 0, 0, 1},
  552. Port: int(clientPort),
  553. })
  554. assert.Error(err).IsNil()
  555. payload := "dokodemo request."
  556. for i := 0; i < 5; i++ {
  557. nBytes, err := conn.Write([]byte(payload))
  558. assert.Error(err).IsNil()
  559. assert.Int(nBytes).Equals(len(payload))
  560. response := make([]byte, 1024)
  561. nBytes, err = conn.Read(response)
  562. assert.Error(err).IsNil()
  563. assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload)))
  564. }
  565. assert.Error(conn.Close()).IsNil()
  566. }
  567. time.Sleep(20 * time.Second)
  568. {
  569. conn, err := net.DialUDP("udp", nil, &net.UDPAddr{
  570. IP: []byte{127, 0, 0, 1},
  571. Port: int(clientPort),
  572. })
  573. assert.Error(err).IsNil()
  574. payload := "dokodemo request."
  575. nBytes, err := conn.Write([]byte(payload))
  576. assert.Error(err).IsNil()
  577. assert.Int(nBytes).Equals(len(payload))
  578. response := make([]byte, 1024)
  579. nBytes, err = conn.Read(response)
  580. assert.Error(err).IsNil()
  581. assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload)))
  582. assert.Error(conn.Close()).IsNil()
  583. }
  584. CloseAllServers()
  585. }