feature_test.go 19 KB

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