feature_test.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749
  1. package scenarios
  2. import (
  3. "io/ioutil"
  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. "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: net.SinglePortRange(serverPort),
  45. Listen: net.NewIPOrDomain(net.LocalHostIP),
  46. }),
  47. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  48. Address: net.NewIPOrDomain(dest.Address),
  49. Port: uint32(dest.Port),
  50. NetworkList: &net.NetworkList{
  51. Network: []net.Network{net.Network_TCP},
  52. },
  53. }),
  54. },
  55. },
  56. Outbound: []*proxyman.OutboundHandlerConfig{
  57. {
  58. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  59. },
  60. },
  61. }
  62. servers, err := InitializeServerConfigs(serverConfig)
  63. assert.Error(err).IsNil()
  64. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  65. IP: []byte{127, 0, 0, 1},
  66. Port: int(serverPort),
  67. })
  68. assert.Error(err).IsNil()
  69. {
  70. response := make([]byte, 1024)
  71. nBytes, err := conn.Read(response)
  72. assert.Error(err).IsNil()
  73. assert.String(string(response[:nBytes])).Equals("send first")
  74. }
  75. payload := "dokodemo request."
  76. {
  77. nBytes, err := conn.Write([]byte(payload))
  78. assert.Error(err).IsNil()
  79. assert.Int(nBytes).Equals(len(payload))
  80. }
  81. {
  82. response := make([]byte, 1024)
  83. nBytes, err := conn.Read(response)
  84. assert.Error(err).IsNil()
  85. assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload)))
  86. }
  87. assert.Error(conn.Close()).IsNil()
  88. CloseAllServers(servers)
  89. }
  90. func TestProxy(t *testing.T) {
  91. assert := assert.On(t)
  92. tcpServer := tcp.Server{
  93. MsgProcessor: xor,
  94. }
  95. dest, err := tcpServer.Start()
  96. assert.Error(err).IsNil()
  97. defer tcpServer.Close()
  98. serverUserID := protocol.NewID(uuid.New())
  99. serverPort := pickPort()
  100. serverConfig := &core.Config{
  101. Inbound: []*proxyman.InboundHandlerConfig{
  102. {
  103. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  104. PortRange: net.SinglePortRange(serverPort),
  105. Listen: net.NewIPOrDomain(net.LocalHostIP),
  106. }),
  107. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  108. User: []*protocol.User{
  109. {
  110. Account: serial.ToTypedMessage(&vmess.Account{
  111. Id: serverUserID.String(),
  112. }),
  113. },
  114. },
  115. }),
  116. },
  117. },
  118. Outbound: []*proxyman.OutboundHandlerConfig{
  119. {
  120. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  121. },
  122. },
  123. }
  124. proxyUserID := protocol.NewID(uuid.New())
  125. proxyPort := pickPort()
  126. proxyConfig := &core.Config{
  127. Inbound: []*proxyman.InboundHandlerConfig{
  128. {
  129. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  130. PortRange: net.SinglePortRange(proxyPort),
  131. Listen: net.NewIPOrDomain(net.LocalHostIP),
  132. }),
  133. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  134. User: []*protocol.User{
  135. {
  136. Account: serial.ToTypedMessage(&vmess.Account{
  137. Id: proxyUserID.String(),
  138. }),
  139. },
  140. },
  141. }),
  142. },
  143. },
  144. Outbound: []*proxyman.OutboundHandlerConfig{
  145. {
  146. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  147. },
  148. },
  149. }
  150. clientPort := pickPort()
  151. clientConfig := &core.Config{
  152. Inbound: []*proxyman.InboundHandlerConfig{
  153. {
  154. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  155. PortRange: net.SinglePortRange(clientPort),
  156. Listen: net.NewIPOrDomain(net.LocalHostIP),
  157. }),
  158. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  159. Address: net.NewIPOrDomain(dest.Address),
  160. Port: uint32(dest.Port),
  161. NetworkList: &net.NetworkList{
  162. Network: []net.Network{net.Network_TCP},
  163. },
  164. }),
  165. },
  166. },
  167. Outbound: []*proxyman.OutboundHandlerConfig{
  168. {
  169. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  170. Receiver: []*protocol.ServerEndpoint{
  171. {
  172. Address: net.NewIPOrDomain(net.LocalHostIP),
  173. Port: uint32(serverPort),
  174. User: []*protocol.User{
  175. {
  176. Account: serial.ToTypedMessage(&vmess.Account{
  177. Id: serverUserID.String(),
  178. }),
  179. },
  180. },
  181. },
  182. },
  183. }),
  184. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  185. ProxySettings: &internet.ProxyConfig{
  186. Tag: "proxy",
  187. },
  188. }),
  189. },
  190. {
  191. Tag: "proxy",
  192. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  193. Receiver: []*protocol.ServerEndpoint{
  194. {
  195. Address: net.NewIPOrDomain(net.LocalHostIP),
  196. Port: uint32(proxyPort),
  197. User: []*protocol.User{
  198. {
  199. Account: serial.ToTypedMessage(&vmess.Account{
  200. Id: proxyUserID.String(),
  201. }),
  202. },
  203. },
  204. },
  205. },
  206. }),
  207. },
  208. },
  209. }
  210. servers, err := InitializeServerConfigs(serverConfig, proxyConfig, clientConfig)
  211. assert.Error(err).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(servers)
  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: net.SinglePortRange(serverPort),
  243. Listen: net.NewIPOrDomain(net.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: net.SinglePortRange(proxyPort),
  272. Listen: net.NewIPOrDomain(net.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: net.SinglePortRange(clientPort),
  302. Listen: net.NewIPOrDomain(net.LocalHostIP),
  303. }),
  304. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  305. Address: net.NewIPOrDomain(dest.Address),
  306. Port: uint32(dest.Port),
  307. NetworkList: &net.NetworkList{
  308. Network: []net.Network{net.Network_TCP},
  309. },
  310. }),
  311. },
  312. },
  313. Outbound: []*proxyman.OutboundHandlerConfig{
  314. {
  315. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  316. Receiver: []*protocol.ServerEndpoint{
  317. {
  318. Address: net.NewIPOrDomain(net.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: net.NewIPOrDomain(net.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. servers, err := InitializeServerConfigs(serverConfig, proxyConfig, clientConfig)
  360. assert.Error(err).IsNil()
  361. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  362. IP: []byte{127, 0, 0, 1},
  363. Port: int(clientPort),
  364. })
  365. assert.Error(err).IsNil()
  366. payload := "dokodemo request."
  367. nBytes, err := conn.Write([]byte(payload))
  368. assert.Error(err).IsNil()
  369. assert.Int(nBytes).Equals(len(payload))
  370. response := make([]byte, 1024)
  371. nBytes, err = conn.Read(response)
  372. assert.Error(err).IsNil()
  373. assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload)))
  374. assert.Error(conn.Close()).IsNil()
  375. CloseAllServers(servers)
  376. }
  377. func TestBlackhole(t *testing.T) {
  378. assert := assert.On(t)
  379. tcpServer := tcp.Server{
  380. MsgProcessor: xor,
  381. }
  382. dest, err := tcpServer.Start()
  383. assert.Error(err).IsNil()
  384. defer tcpServer.Close()
  385. tcpServer2 := tcp.Server{
  386. MsgProcessor: xor,
  387. }
  388. dest2, err := tcpServer2.Start()
  389. assert.Error(err).IsNil()
  390. defer tcpServer2.Close()
  391. serverPort := pickPort()
  392. serverPort2 := pickPort()
  393. serverConfig := &core.Config{
  394. Inbound: []*proxyman.InboundHandlerConfig{
  395. {
  396. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  397. PortRange: net.SinglePortRange(serverPort),
  398. Listen: net.NewIPOrDomain(net.LocalHostIP),
  399. }),
  400. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  401. Address: net.NewIPOrDomain(dest.Address),
  402. Port: uint32(dest.Port),
  403. NetworkList: &net.NetworkList{
  404. Network: []net.Network{net.Network_TCP},
  405. },
  406. }),
  407. },
  408. {
  409. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  410. PortRange: net.SinglePortRange(serverPort2),
  411. Listen: net.NewIPOrDomain(net.LocalHostIP),
  412. }),
  413. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  414. Address: net.NewIPOrDomain(dest2.Address),
  415. Port: uint32(dest2.Port),
  416. NetworkList: &net.NetworkList{
  417. Network: []net.Network{net.Network_TCP},
  418. },
  419. }),
  420. },
  421. },
  422. Outbound: []*proxyman.OutboundHandlerConfig{
  423. {
  424. Tag: "direct",
  425. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  426. },
  427. {
  428. Tag: "blocked",
  429. ProxySettings: serial.ToTypedMessage(&blackhole.Config{}),
  430. },
  431. },
  432. App: []*serial.TypedMessage{
  433. serial.ToTypedMessage(&router.Config{
  434. Rule: []*router.RoutingRule{
  435. {
  436. Tag: "blocked",
  437. PortRange: net.SinglePortRange(dest2.Port),
  438. },
  439. },
  440. }),
  441. },
  442. }
  443. servers, err := InitializeServerConfigs(serverConfig)
  444. assert.Error(err).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(servers)
  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: net.SinglePortRange(serverPort),
  478. Listen: net.NewIPOrDomain(net.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: net.NewIPOrDomain(net.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: net.NewIPOrDomain(net.LocalHostIP),
  496. Port: uint32(dest.Port),
  497. },
  498. },
  499. }),
  500. },
  501. },
  502. }
  503. servers, err := InitializeServerConfigs(serverConfig)
  504. assert.Error(err).IsNil()
  505. {
  506. noAuthDialer, err := xproxy.SOCKS5("tcp", net.TCPDestination(net.LocalHostIP, serverPort).NetAddr(), nil, xproxy.Direct)
  507. assert.Error(err).IsNil()
  508. conn, err := noAuthDialer.Dial("tcp", "google.com:80")
  509. assert.Error(err).IsNil()
  510. payload := "test payload"
  511. nBytes, err := conn.Write([]byte(payload))
  512. assert.Error(err).IsNil()
  513. assert.Int(nBytes).Equals(len(payload))
  514. response := make([]byte, 1024)
  515. nBytes, err = conn.Read(response)
  516. assert.Error(err).IsNil()
  517. assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload)))
  518. assert.Error(conn.Close()).IsNil()
  519. }
  520. CloseAllServers(servers)
  521. }
  522. func TestUDPConnection(t *testing.T) {
  523. assert := assert.On(t)
  524. udpServer := udp.Server{
  525. MsgProcessor: xor,
  526. }
  527. dest, err := udpServer.Start()
  528. assert.Error(err).IsNil()
  529. defer udpServer.Close()
  530. clientPort := pickPort()
  531. clientConfig := &core.Config{
  532. Inbound: []*proxyman.InboundHandlerConfig{
  533. {
  534. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  535. PortRange: net.SinglePortRange(clientPort),
  536. Listen: net.NewIPOrDomain(net.LocalHostIP),
  537. }),
  538. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  539. Address: net.NewIPOrDomain(dest.Address),
  540. Port: uint32(dest.Port),
  541. NetworkList: &net.NetworkList{
  542. Network: []net.Network{net.Network_UDP},
  543. },
  544. }),
  545. },
  546. },
  547. Outbound: []*proxyman.OutboundHandlerConfig{
  548. {
  549. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  550. },
  551. },
  552. }
  553. servers, err := InitializeServerConfigs(clientConfig)
  554. assert.Error(err).IsNil()
  555. {
  556. conn, err := net.DialUDP("udp", nil, &net.UDPAddr{
  557. IP: []byte{127, 0, 0, 1},
  558. Port: int(clientPort),
  559. })
  560. assert.Error(err).IsNil()
  561. payload := "dokodemo request."
  562. for i := 0; i < 5; i++ {
  563. nBytes, err := conn.Write([]byte(payload))
  564. assert.Error(err).IsNil()
  565. assert.Int(nBytes).Equals(len(payload))
  566. response := make([]byte, 1024)
  567. nBytes, err = conn.Read(response)
  568. assert.Error(err).IsNil()
  569. assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload)))
  570. }
  571. assert.Error(conn.Close()).IsNil()
  572. }
  573. time.Sleep(20 * time.Second)
  574. {
  575. conn, err := net.DialUDP("udp", nil, &net.UDPAddr{
  576. IP: []byte{127, 0, 0, 1},
  577. Port: int(clientPort),
  578. })
  579. assert.Error(err).IsNil()
  580. payload := "dokodemo request."
  581. nBytes, err := conn.Write([]byte(payload))
  582. assert.Error(err).IsNil()
  583. assert.Int(nBytes).Equals(len(payload))
  584. response := make([]byte, 1024)
  585. nBytes, err = conn.Read(response)
  586. assert.Error(err).IsNil()
  587. assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload)))
  588. assert.Error(conn.Close()).IsNil()
  589. }
  590. CloseAllServers(servers)
  591. }
  592. func TestDomainSniffing(t *testing.T) {
  593. assert := assert.On(t)
  594. sniffingPort := pickPort()
  595. httpPort := pickPort()
  596. serverConfig := &core.Config{
  597. Inbound: []*proxyman.InboundHandlerConfig{
  598. {
  599. Tag: "snif",
  600. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  601. PortRange: net.SinglePortRange(sniffingPort),
  602. Listen: net.NewIPOrDomain(net.LocalHostIP),
  603. DomainOverride: []proxyman.KnownProtocols{
  604. proxyman.KnownProtocols_TLS,
  605. },
  606. }),
  607. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  608. Address: net.NewIPOrDomain(net.LocalHostIP),
  609. Port: 443,
  610. NetworkList: &net.NetworkList{
  611. Network: []net.Network{net.Network_TCP},
  612. },
  613. }),
  614. },
  615. {
  616. Tag: "http",
  617. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  618. PortRange: net.SinglePortRange(httpPort),
  619. Listen: net.NewIPOrDomain(net.LocalHostIP),
  620. }),
  621. ProxySettings: serial.ToTypedMessage(&v2http.ServerConfig{}),
  622. },
  623. },
  624. Outbound: []*proxyman.OutboundHandlerConfig{
  625. {
  626. Tag: "redir",
  627. ProxySettings: serial.ToTypedMessage(&freedom.Config{
  628. DestinationOverride: &freedom.DestinationOverride{
  629. Server: &protocol.ServerEndpoint{
  630. Address: net.NewIPOrDomain(net.LocalHostIP),
  631. Port: uint32(sniffingPort),
  632. },
  633. },
  634. }),
  635. },
  636. {
  637. Tag: "direct",
  638. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  639. },
  640. },
  641. App: []*serial.TypedMessage{
  642. serial.ToTypedMessage(&router.Config{
  643. Rule: []*router.RoutingRule{
  644. {
  645. Tag: "direct",
  646. InboundTag: []string{"snif"},
  647. }, {
  648. Tag: "redir",
  649. InboundTag: []string{"http"},
  650. },
  651. },
  652. }),
  653. serial.ToTypedMessage(&log.Config{
  654. ErrorLogLevel: log.LogLevel_Debug,
  655. ErrorLogType: log.LogType_Console,
  656. }),
  657. },
  658. }
  659. servers, err := InitializeServerConfigs(serverConfig)
  660. assert.Error(err).IsNil()
  661. {
  662. transport := &http.Transport{
  663. Proxy: func(req *http.Request) (*url.URL, error) {
  664. return url.Parse("http://127.0.0.1:" + httpPort.String())
  665. },
  666. }
  667. client := &http.Client{
  668. Transport: transport,
  669. }
  670. resp, err := client.Get("https://www.github.com/")
  671. assert.Error(err).IsNil()
  672. assert.Int(resp.StatusCode).Equals(200)
  673. assert.Error(resp.Write(ioutil.Discard)).IsNil()
  674. }
  675. CloseAllServers(servers)
  676. }