feature_test.go 18 KB

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