tls_test.go 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931
  1. package scenarios
  2. import (
  3. "crypto/x509"
  4. "runtime"
  5. "testing"
  6. "time"
  7. "golang.org/x/sync/errgroup"
  8. "github.com/xtls/xray-core/app/proxyman"
  9. "github.com/xtls/xray-core/common"
  10. "github.com/xtls/xray-core/common/net"
  11. "github.com/xtls/xray-core/common/protocol"
  12. "github.com/xtls/xray-core/common/protocol/tls/cert"
  13. "github.com/xtls/xray-core/common/serial"
  14. "github.com/xtls/xray-core/common/uuid"
  15. core "github.com/xtls/xray-core/core"
  16. "github.com/xtls/xray-core/proxy/dokodemo"
  17. "github.com/xtls/xray-core/proxy/freedom"
  18. "github.com/xtls/xray-core/proxy/vmess"
  19. "github.com/xtls/xray-core/proxy/vmess/inbound"
  20. "github.com/xtls/xray-core/proxy/vmess/outbound"
  21. "github.com/xtls/xray-core/testing/servers/tcp"
  22. "github.com/xtls/xray-core/testing/servers/udp"
  23. "github.com/xtls/xray-core/transport/internet"
  24. "github.com/xtls/xray-core/transport/internet/grpc"
  25. "github.com/xtls/xray-core/transport/internet/http"
  26. "github.com/xtls/xray-core/transport/internet/tls"
  27. "github.com/xtls/xray-core/transport/internet/websocket"
  28. )
  29. func TestSimpleTLSConnection(t *testing.T) {
  30. tcpServer := tcp.Server{
  31. MsgProcessor: xor,
  32. }
  33. dest, err := tcpServer.Start()
  34. common.Must(err)
  35. defer tcpServer.Close()
  36. userID := protocol.NewID(uuid.New())
  37. serverPort := tcp.PickPort()
  38. serverConfig := &core.Config{
  39. Inbound: []*core.InboundHandlerConfig{
  40. {
  41. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  42. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  43. Listen: net.NewIPOrDomain(net.LocalHostIP),
  44. StreamSettings: &internet.StreamConfig{
  45. SecurityType: serial.GetMessageType(&tls.Config{}),
  46. SecuritySettings: []*serial.TypedMessage{
  47. serial.ToTypedMessage(&tls.Config{
  48. Certificate: []*tls.Certificate{tls.ParseCertificate(cert.MustGenerate(nil))},
  49. }),
  50. },
  51. },
  52. }),
  53. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  54. User: []*protocol.User{
  55. {
  56. Account: serial.ToTypedMessage(&vmess.Account{
  57. Id: userID.String(),
  58. }),
  59. },
  60. },
  61. }),
  62. },
  63. },
  64. Outbound: []*core.OutboundHandlerConfig{
  65. {
  66. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  67. },
  68. },
  69. }
  70. clientPort := tcp.PickPort()
  71. clientConfig := &core.Config{
  72. Inbound: []*core.InboundHandlerConfig{
  73. {
  74. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  75. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  76. Listen: net.NewIPOrDomain(net.LocalHostIP),
  77. }),
  78. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  79. Address: net.NewIPOrDomain(dest.Address),
  80. Port: uint32(dest.Port),
  81. NetworkList: &net.NetworkList{
  82. Network: []net.Network{net.Network_TCP},
  83. },
  84. }),
  85. },
  86. },
  87. Outbound: []*core.OutboundHandlerConfig{
  88. {
  89. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  90. Receiver: []*protocol.ServerEndpoint{
  91. {
  92. Address: net.NewIPOrDomain(net.LocalHostIP),
  93. Port: uint32(serverPort),
  94. User: []*protocol.User{
  95. {
  96. Account: serial.ToTypedMessage(&vmess.Account{
  97. Id: userID.String(),
  98. }),
  99. },
  100. },
  101. },
  102. },
  103. }),
  104. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  105. StreamSettings: &internet.StreamConfig{
  106. SecurityType: serial.GetMessageType(&tls.Config{}),
  107. SecuritySettings: []*serial.TypedMessage{
  108. serial.ToTypedMessage(&tls.Config{
  109. AllowInsecure: true,
  110. }),
  111. },
  112. },
  113. }),
  114. },
  115. },
  116. }
  117. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  118. common.Must(err)
  119. defer CloseAllServers(servers)
  120. if err := testTCPConn(clientPort, 1024, time.Second*2)(); err != nil {
  121. t.Fatal(err)
  122. }
  123. }
  124. func TestAutoIssuingCertificate(t *testing.T) {
  125. if runtime.GOOS == "windows" {
  126. // Not supported on Windows yet.
  127. return
  128. }
  129. if runtime.GOARCH == "arm64" {
  130. return
  131. }
  132. tcpServer := tcp.Server{
  133. MsgProcessor: xor,
  134. }
  135. dest, err := tcpServer.Start()
  136. common.Must(err)
  137. defer tcpServer.Close()
  138. caCert, err := cert.Generate(nil, cert.Authority(true), cert.KeyUsage(x509.KeyUsageDigitalSignature|x509.KeyUsageKeyEncipherment|x509.KeyUsageCertSign))
  139. common.Must(err)
  140. certPEM, keyPEM := caCert.ToPEM()
  141. userID := protocol.NewID(uuid.New())
  142. serverPort := tcp.PickPort()
  143. serverConfig := &core.Config{
  144. Inbound: []*core.InboundHandlerConfig{
  145. {
  146. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  147. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  148. Listen: net.NewIPOrDomain(net.LocalHostIP),
  149. StreamSettings: &internet.StreamConfig{
  150. SecurityType: serial.GetMessageType(&tls.Config{}),
  151. SecuritySettings: []*serial.TypedMessage{
  152. serial.ToTypedMessage(&tls.Config{
  153. Certificate: []*tls.Certificate{{
  154. Certificate: certPEM,
  155. Key: keyPEM,
  156. Usage: tls.Certificate_AUTHORITY_ISSUE,
  157. }},
  158. }),
  159. },
  160. },
  161. }),
  162. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  163. User: []*protocol.User{
  164. {
  165. Account: serial.ToTypedMessage(&vmess.Account{
  166. Id: userID.String(),
  167. }),
  168. },
  169. },
  170. }),
  171. },
  172. },
  173. Outbound: []*core.OutboundHandlerConfig{
  174. {
  175. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  176. },
  177. },
  178. }
  179. clientPort := tcp.PickPort()
  180. clientConfig := &core.Config{
  181. Inbound: []*core.InboundHandlerConfig{
  182. {
  183. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  184. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  185. Listen: net.NewIPOrDomain(net.LocalHostIP),
  186. }),
  187. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  188. Address: net.NewIPOrDomain(dest.Address),
  189. Port: uint32(dest.Port),
  190. NetworkList: &net.NetworkList{
  191. Network: []net.Network{net.Network_TCP},
  192. },
  193. }),
  194. },
  195. },
  196. Outbound: []*core.OutboundHandlerConfig{
  197. {
  198. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  199. Receiver: []*protocol.ServerEndpoint{
  200. {
  201. Address: net.NewIPOrDomain(net.LocalHostIP),
  202. Port: uint32(serverPort),
  203. User: []*protocol.User{
  204. {
  205. Account: serial.ToTypedMessage(&vmess.Account{
  206. Id: userID.String(),
  207. }),
  208. },
  209. },
  210. },
  211. },
  212. }),
  213. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  214. StreamSettings: &internet.StreamConfig{
  215. SecurityType: serial.GetMessageType(&tls.Config{}),
  216. SecuritySettings: []*serial.TypedMessage{
  217. serial.ToTypedMessage(&tls.Config{
  218. ServerName: "example.com",
  219. Certificate: []*tls.Certificate{{
  220. Certificate: certPEM,
  221. Usage: tls.Certificate_AUTHORITY_VERIFY,
  222. }},
  223. }),
  224. },
  225. },
  226. }),
  227. },
  228. },
  229. }
  230. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  231. common.Must(err)
  232. defer CloseAllServers(servers)
  233. for i := 0; i < 10; i++ {
  234. if err := testTCPConn(clientPort, 1024, time.Second*2)(); err != nil {
  235. t.Error(err)
  236. }
  237. }
  238. }
  239. func TestTLSOverKCP(t *testing.T) {
  240. tcpServer := tcp.Server{
  241. MsgProcessor: xor,
  242. }
  243. dest, err := tcpServer.Start()
  244. common.Must(err)
  245. defer tcpServer.Close()
  246. userID := protocol.NewID(uuid.New())
  247. serverPort := udp.PickPort()
  248. serverConfig := &core.Config{
  249. Inbound: []*core.InboundHandlerConfig{
  250. {
  251. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  252. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  253. Listen: net.NewIPOrDomain(net.LocalHostIP),
  254. StreamSettings: &internet.StreamConfig{
  255. Protocol: internet.TransportProtocol_MKCP,
  256. SecurityType: serial.GetMessageType(&tls.Config{}),
  257. SecuritySettings: []*serial.TypedMessage{
  258. serial.ToTypedMessage(&tls.Config{
  259. Certificate: []*tls.Certificate{tls.ParseCertificate(cert.MustGenerate(nil))},
  260. }),
  261. },
  262. },
  263. }),
  264. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  265. User: []*protocol.User{
  266. {
  267. Account: serial.ToTypedMessage(&vmess.Account{
  268. Id: userID.String(),
  269. }),
  270. },
  271. },
  272. }),
  273. },
  274. },
  275. Outbound: []*core.OutboundHandlerConfig{
  276. {
  277. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  278. },
  279. },
  280. }
  281. clientPort := tcp.PickPort()
  282. clientConfig := &core.Config{
  283. Inbound: []*core.InboundHandlerConfig{
  284. {
  285. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  286. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  287. Listen: net.NewIPOrDomain(net.LocalHostIP),
  288. }),
  289. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  290. Address: net.NewIPOrDomain(dest.Address),
  291. Port: uint32(dest.Port),
  292. NetworkList: &net.NetworkList{
  293. Network: []net.Network{net.Network_TCP},
  294. },
  295. }),
  296. },
  297. },
  298. Outbound: []*core.OutboundHandlerConfig{
  299. {
  300. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  301. Receiver: []*protocol.ServerEndpoint{
  302. {
  303. Address: net.NewIPOrDomain(net.LocalHostIP),
  304. Port: uint32(serverPort),
  305. User: []*protocol.User{
  306. {
  307. Account: serial.ToTypedMessage(&vmess.Account{
  308. Id: userID.String(),
  309. }),
  310. },
  311. },
  312. },
  313. },
  314. }),
  315. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  316. StreamSettings: &internet.StreamConfig{
  317. Protocol: internet.TransportProtocol_MKCP,
  318. SecurityType: serial.GetMessageType(&tls.Config{}),
  319. SecuritySettings: []*serial.TypedMessage{
  320. serial.ToTypedMessage(&tls.Config{
  321. AllowInsecure: true,
  322. }),
  323. },
  324. },
  325. }),
  326. },
  327. },
  328. }
  329. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  330. common.Must(err)
  331. defer CloseAllServers(servers)
  332. if err := testTCPConn(clientPort, 1024, time.Second*2)(); err != nil {
  333. t.Error(err)
  334. }
  335. }
  336. func TestTLSOverWebSocket(t *testing.T) {
  337. tcpServer := tcp.Server{
  338. MsgProcessor: xor,
  339. }
  340. dest, err := tcpServer.Start()
  341. common.Must(err)
  342. defer tcpServer.Close()
  343. userID := protocol.NewID(uuid.New())
  344. serverPort := tcp.PickPort()
  345. serverConfig := &core.Config{
  346. Inbound: []*core.InboundHandlerConfig{
  347. {
  348. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  349. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  350. Listen: net.NewIPOrDomain(net.LocalHostIP),
  351. StreamSettings: &internet.StreamConfig{
  352. Protocol: internet.TransportProtocol_WebSocket,
  353. SecurityType: serial.GetMessageType(&tls.Config{}),
  354. SecuritySettings: []*serial.TypedMessage{
  355. serial.ToTypedMessage(&tls.Config{
  356. Certificate: []*tls.Certificate{tls.ParseCertificate(cert.MustGenerate(nil))},
  357. }),
  358. },
  359. },
  360. }),
  361. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  362. User: []*protocol.User{
  363. {
  364. Account: serial.ToTypedMessage(&vmess.Account{
  365. Id: userID.String(),
  366. }),
  367. },
  368. },
  369. }),
  370. },
  371. },
  372. Outbound: []*core.OutboundHandlerConfig{
  373. {
  374. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  375. },
  376. },
  377. }
  378. clientPort := tcp.PickPort()
  379. clientConfig := &core.Config{
  380. Inbound: []*core.InboundHandlerConfig{
  381. {
  382. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  383. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  384. Listen: net.NewIPOrDomain(net.LocalHostIP),
  385. }),
  386. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  387. Address: net.NewIPOrDomain(dest.Address),
  388. Port: uint32(dest.Port),
  389. NetworkList: &net.NetworkList{
  390. Network: []net.Network{net.Network_TCP},
  391. },
  392. }),
  393. },
  394. },
  395. Outbound: []*core.OutboundHandlerConfig{
  396. {
  397. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  398. Receiver: []*protocol.ServerEndpoint{
  399. {
  400. Address: net.NewIPOrDomain(net.LocalHostIP),
  401. Port: uint32(serverPort),
  402. User: []*protocol.User{
  403. {
  404. Account: serial.ToTypedMessage(&vmess.Account{
  405. Id: userID.String(),
  406. }),
  407. },
  408. },
  409. },
  410. },
  411. }),
  412. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  413. StreamSettings: &internet.StreamConfig{
  414. Protocol: internet.TransportProtocol_WebSocket,
  415. TransportSettings: []*internet.TransportConfig{
  416. {
  417. Protocol: internet.TransportProtocol_WebSocket,
  418. Settings: serial.ToTypedMessage(&websocket.Config{}),
  419. },
  420. },
  421. SecurityType: serial.GetMessageType(&tls.Config{}),
  422. SecuritySettings: []*serial.TypedMessage{
  423. serial.ToTypedMessage(&tls.Config{
  424. AllowInsecure: true,
  425. }),
  426. },
  427. },
  428. }),
  429. },
  430. },
  431. }
  432. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  433. common.Must(err)
  434. defer CloseAllServers(servers)
  435. var errg errgroup.Group
  436. for i := 0; i < 10; i++ {
  437. errg.Go(testTCPConn(clientPort, 10240*1024, time.Second*20))
  438. }
  439. if err := errg.Wait(); err != nil {
  440. t.Error(err)
  441. }
  442. }
  443. func TestHTTP2(t *testing.T) {
  444. tcpServer := tcp.Server{
  445. MsgProcessor: xor,
  446. }
  447. dest, err := tcpServer.Start()
  448. common.Must(err)
  449. defer tcpServer.Close()
  450. userID := protocol.NewID(uuid.New())
  451. serverPort := tcp.PickPort()
  452. serverConfig := &core.Config{
  453. Inbound: []*core.InboundHandlerConfig{
  454. {
  455. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  456. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  457. Listen: net.NewIPOrDomain(net.LocalHostIP),
  458. StreamSettings: &internet.StreamConfig{
  459. Protocol: internet.TransportProtocol_HTTP,
  460. TransportSettings: []*internet.TransportConfig{
  461. {
  462. Protocol: internet.TransportProtocol_HTTP,
  463. Settings: serial.ToTypedMessage(&http.Config{
  464. Host: []string{"example.com"},
  465. Path: "/testpath",
  466. }),
  467. },
  468. },
  469. SecurityType: serial.GetMessageType(&tls.Config{}),
  470. SecuritySettings: []*serial.TypedMessage{
  471. serial.ToTypedMessage(&tls.Config{
  472. Certificate: []*tls.Certificate{tls.ParseCertificate(cert.MustGenerate(nil))},
  473. }),
  474. },
  475. },
  476. }),
  477. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  478. User: []*protocol.User{
  479. {
  480. Account: serial.ToTypedMessage(&vmess.Account{
  481. Id: userID.String(),
  482. }),
  483. },
  484. },
  485. }),
  486. },
  487. },
  488. Outbound: []*core.OutboundHandlerConfig{
  489. {
  490. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  491. },
  492. },
  493. }
  494. clientPort := tcp.PickPort()
  495. clientConfig := &core.Config{
  496. Inbound: []*core.InboundHandlerConfig{
  497. {
  498. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  499. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  500. Listen: net.NewIPOrDomain(net.LocalHostIP),
  501. }),
  502. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  503. Address: net.NewIPOrDomain(dest.Address),
  504. Port: uint32(dest.Port),
  505. NetworkList: &net.NetworkList{
  506. Network: []net.Network{net.Network_TCP},
  507. },
  508. }),
  509. },
  510. },
  511. Outbound: []*core.OutboundHandlerConfig{
  512. {
  513. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  514. Receiver: []*protocol.ServerEndpoint{
  515. {
  516. Address: net.NewIPOrDomain(net.LocalHostIP),
  517. Port: uint32(serverPort),
  518. User: []*protocol.User{
  519. {
  520. Account: serial.ToTypedMessage(&vmess.Account{
  521. Id: userID.String(),
  522. }),
  523. },
  524. },
  525. },
  526. },
  527. }),
  528. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  529. StreamSettings: &internet.StreamConfig{
  530. Protocol: internet.TransportProtocol_HTTP,
  531. TransportSettings: []*internet.TransportConfig{
  532. {
  533. Protocol: internet.TransportProtocol_HTTP,
  534. Settings: serial.ToTypedMessage(&http.Config{
  535. Host: []string{"example.com"},
  536. Path: "/testpath",
  537. }),
  538. },
  539. },
  540. SecurityType: serial.GetMessageType(&tls.Config{}),
  541. SecuritySettings: []*serial.TypedMessage{
  542. serial.ToTypedMessage(&tls.Config{
  543. AllowInsecure: true,
  544. }),
  545. },
  546. },
  547. }),
  548. },
  549. },
  550. }
  551. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  552. common.Must(err)
  553. defer CloseAllServers(servers)
  554. var errg errgroup.Group
  555. for i := 0; i < 10; i++ {
  556. errg.Go(testTCPConn(clientPort, 1024*1024, time.Second*40))
  557. }
  558. if err := errg.Wait(); err != nil {
  559. t.Error(err)
  560. }
  561. }
  562. func TestGRPC(t *testing.T) {
  563. tcpServer := tcp.Server{
  564. MsgProcessor: xor,
  565. }
  566. dest, err := tcpServer.Start()
  567. common.Must(err)
  568. defer tcpServer.Close()
  569. userID := protocol.NewID(uuid.New())
  570. serverPort := tcp.PickPort()
  571. serverConfig := &core.Config{
  572. Inbound: []*core.InboundHandlerConfig{
  573. {
  574. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  575. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  576. Listen: net.NewIPOrDomain(net.LocalHostIP),
  577. StreamSettings: &internet.StreamConfig{
  578. ProtocolName: "grpc",
  579. TransportSettings: []*internet.TransportConfig{
  580. {
  581. ProtocolName: "grpc",
  582. Settings: serial.ToTypedMessage(&grpc.Config{ServiceName: "🍉"}),
  583. },
  584. },
  585. SecurityType: serial.GetMessageType(&tls.Config{}),
  586. SecuritySettings: []*serial.TypedMessage{
  587. serial.ToTypedMessage(&tls.Config{
  588. Certificate: []*tls.Certificate{tls.ParseCertificate(cert.MustGenerate(nil))},
  589. }),
  590. },
  591. },
  592. }),
  593. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  594. User: []*protocol.User{
  595. {
  596. Account: serial.ToTypedMessage(&vmess.Account{
  597. Id: userID.String(),
  598. }),
  599. },
  600. },
  601. }),
  602. },
  603. },
  604. Outbound: []*core.OutboundHandlerConfig{
  605. {
  606. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  607. },
  608. },
  609. }
  610. clientPort := tcp.PickPort()
  611. clientConfig := &core.Config{
  612. Inbound: []*core.InboundHandlerConfig{
  613. {
  614. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  615. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  616. Listen: net.NewIPOrDomain(net.LocalHostIP),
  617. }),
  618. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  619. Address: net.NewIPOrDomain(dest.Address),
  620. Port: uint32(dest.Port),
  621. NetworkList: &net.NetworkList{
  622. Network: []net.Network{net.Network_TCP},
  623. },
  624. }),
  625. },
  626. },
  627. Outbound: []*core.OutboundHandlerConfig{
  628. {
  629. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  630. Receiver: []*protocol.ServerEndpoint{
  631. {
  632. Address: net.NewIPOrDomain(net.LocalHostIP),
  633. Port: uint32(serverPort),
  634. User: []*protocol.User{
  635. {
  636. Account: serial.ToTypedMessage(&vmess.Account{
  637. Id: userID.String(),
  638. }),
  639. },
  640. },
  641. },
  642. },
  643. }),
  644. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  645. StreamSettings: &internet.StreamConfig{
  646. ProtocolName: "grpc",
  647. TransportSettings: []*internet.TransportConfig{
  648. {
  649. ProtocolName: "grpc",
  650. Settings: serial.ToTypedMessage(&grpc.Config{ServiceName: "🍉"}),
  651. },
  652. },
  653. SecurityType: serial.GetMessageType(&tls.Config{}),
  654. SecuritySettings: []*serial.TypedMessage{
  655. serial.ToTypedMessage(&tls.Config{
  656. AllowInsecure: true,
  657. }),
  658. },
  659. },
  660. }),
  661. },
  662. },
  663. }
  664. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  665. common.Must(err)
  666. defer CloseAllServers(servers)
  667. var errg errgroup.Group
  668. for i := 0; i < 10; i++ {
  669. errg.Go(testTCPConn(clientPort, 1024*10240, time.Second*40))
  670. }
  671. if err := errg.Wait(); err != nil {
  672. t.Error(err)
  673. }
  674. }
  675. func TestGRPCMultiMode(t *testing.T) {
  676. tcpServer := tcp.Server{
  677. MsgProcessor: xor,
  678. }
  679. dest, err := tcpServer.Start()
  680. common.Must(err)
  681. defer tcpServer.Close()
  682. userID := protocol.NewID(uuid.New())
  683. serverPort := tcp.PickPort()
  684. serverConfig := &core.Config{
  685. Inbound: []*core.InboundHandlerConfig{
  686. {
  687. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  688. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  689. Listen: net.NewIPOrDomain(net.LocalHostIP),
  690. StreamSettings: &internet.StreamConfig{
  691. ProtocolName: "grpc",
  692. TransportSettings: []*internet.TransportConfig{
  693. {
  694. ProtocolName: "grpc",
  695. Settings: serial.ToTypedMessage(&grpc.Config{ServiceName: "🍉"}),
  696. },
  697. },
  698. SecurityType: serial.GetMessageType(&tls.Config{}),
  699. SecuritySettings: []*serial.TypedMessage{
  700. serial.ToTypedMessage(&tls.Config{
  701. Certificate: []*tls.Certificate{tls.ParseCertificate(cert.MustGenerate(nil))},
  702. }),
  703. },
  704. },
  705. }),
  706. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  707. User: []*protocol.User{
  708. {
  709. Account: serial.ToTypedMessage(&vmess.Account{
  710. Id: userID.String(),
  711. }),
  712. },
  713. },
  714. }),
  715. },
  716. },
  717. Outbound: []*core.OutboundHandlerConfig{
  718. {
  719. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  720. },
  721. },
  722. }
  723. clientPort := tcp.PickPort()
  724. clientConfig := &core.Config{
  725. Inbound: []*core.InboundHandlerConfig{
  726. {
  727. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  728. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  729. Listen: net.NewIPOrDomain(net.LocalHostIP),
  730. }),
  731. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  732. Address: net.NewIPOrDomain(dest.Address),
  733. Port: uint32(dest.Port),
  734. NetworkList: &net.NetworkList{
  735. Network: []net.Network{net.Network_TCP},
  736. },
  737. }),
  738. },
  739. },
  740. Outbound: []*core.OutboundHandlerConfig{
  741. {
  742. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  743. Receiver: []*protocol.ServerEndpoint{
  744. {
  745. Address: net.NewIPOrDomain(net.LocalHostIP),
  746. Port: uint32(serverPort),
  747. User: []*protocol.User{
  748. {
  749. Account: serial.ToTypedMessage(&vmess.Account{
  750. Id: userID.String(),
  751. }),
  752. },
  753. },
  754. },
  755. },
  756. }),
  757. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  758. StreamSettings: &internet.StreamConfig{
  759. ProtocolName: "grpc",
  760. TransportSettings: []*internet.TransportConfig{
  761. {
  762. ProtocolName: "grpc",
  763. Settings: serial.ToTypedMessage(&grpc.Config{ServiceName: "🍉", MultiMode: true}),
  764. },
  765. },
  766. SecurityType: serial.GetMessageType(&tls.Config{}),
  767. SecuritySettings: []*serial.TypedMessage{
  768. serial.ToTypedMessage(&tls.Config{
  769. AllowInsecure: true,
  770. }),
  771. },
  772. },
  773. }),
  774. },
  775. },
  776. }
  777. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  778. common.Must(err)
  779. defer CloseAllServers(servers)
  780. var errg errgroup.Group
  781. for i := 0; i < 10; i++ {
  782. errg.Go(testTCPConn(clientPort, 1024*10240, time.Second*40))
  783. }
  784. if err := errg.Wait(); err != nil {
  785. t.Error(err)
  786. }
  787. }
  788. func TestSimpleTLSConnectionPinned(t *testing.T) {
  789. tcpServer := tcp.Server{
  790. MsgProcessor: xor,
  791. }
  792. dest, err := tcpServer.Start()
  793. common.Must(err)
  794. defer tcpServer.Close()
  795. certificateDer := cert.MustGenerate(nil)
  796. certificate := tls.ParseCertificate(certificateDer)
  797. certHash := tls.GenerateCertChainHash([][]byte{certificateDer.Certificate})
  798. userID := protocol.NewID(uuid.New())
  799. serverPort := tcp.PickPort()
  800. serverConfig := &core.Config{
  801. Inbound: []*core.InboundHandlerConfig{
  802. {
  803. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  804. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  805. Listen: net.NewIPOrDomain(net.LocalHostIP),
  806. StreamSettings: &internet.StreamConfig{
  807. SecurityType: serial.GetMessageType(&tls.Config{}),
  808. SecuritySettings: []*serial.TypedMessage{
  809. serial.ToTypedMessage(&tls.Config{
  810. Certificate: []*tls.Certificate{certificate},
  811. }),
  812. },
  813. },
  814. }),
  815. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  816. User: []*protocol.User{
  817. {
  818. Account: serial.ToTypedMessage(&vmess.Account{
  819. Id: userID.String(),
  820. }),
  821. },
  822. },
  823. }),
  824. },
  825. },
  826. Outbound: []*core.OutboundHandlerConfig{
  827. {
  828. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  829. },
  830. },
  831. }
  832. clientPort := tcp.PickPort()
  833. clientConfig := &core.Config{
  834. Inbound: []*core.InboundHandlerConfig{
  835. {
  836. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  837. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  838. Listen: net.NewIPOrDomain(net.LocalHostIP),
  839. }),
  840. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  841. Address: net.NewIPOrDomain(dest.Address),
  842. Port: uint32(dest.Port),
  843. NetworkList: &net.NetworkList{
  844. Network: []net.Network{net.Network_TCP},
  845. },
  846. }),
  847. },
  848. },
  849. Outbound: []*core.OutboundHandlerConfig{
  850. {
  851. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  852. Receiver: []*protocol.ServerEndpoint{
  853. {
  854. Address: net.NewIPOrDomain(net.LocalHostIP),
  855. Port: uint32(serverPort),
  856. User: []*protocol.User{
  857. {
  858. Account: serial.ToTypedMessage(&vmess.Account{
  859. Id: userID.String(),
  860. }),
  861. },
  862. },
  863. },
  864. },
  865. }),
  866. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  867. StreamSettings: &internet.StreamConfig{
  868. SecurityType: serial.GetMessageType(&tls.Config{}),
  869. SecuritySettings: []*serial.TypedMessage{
  870. serial.ToTypedMessage(&tls.Config{
  871. AllowInsecure: true,
  872. PinnedPeerCertificateChainSha256: [][]byte{certHash},
  873. }),
  874. },
  875. },
  876. }),
  877. },
  878. },
  879. }
  880. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  881. common.Must(err)
  882. defer CloseAllServers(servers)
  883. if err := testTCPConn(clientPort, 1024, time.Second*2)(); err != nil {
  884. t.Fatal(err)
  885. }
  886. }