tls_test.go 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221
  1. package scenarios
  2. import (
  3. "crypto/x509"
  4. "runtime"
  5. "testing"
  6. "time"
  7. "github.com/xtls/xray-core/app/proxyman"
  8. "github.com/xtls/xray-core/common"
  9. "github.com/xtls/xray-core/common/net"
  10. "github.com/xtls/xray-core/common/protocol"
  11. "github.com/xtls/xray-core/common/protocol/tls/cert"
  12. "github.com/xtls/xray-core/common/serial"
  13. "github.com/xtls/xray-core/common/uuid"
  14. core "github.com/xtls/xray-core/core"
  15. "github.com/xtls/xray-core/proxy/dokodemo"
  16. "github.com/xtls/xray-core/proxy/freedom"
  17. "github.com/xtls/xray-core/proxy/vmess"
  18. "github.com/xtls/xray-core/proxy/vmess/inbound"
  19. "github.com/xtls/xray-core/proxy/vmess/outbound"
  20. "github.com/xtls/xray-core/testing/servers/tcp"
  21. "github.com/xtls/xray-core/testing/servers/udp"
  22. "github.com/xtls/xray-core/transport/internet"
  23. "github.com/xtls/xray-core/transport/internet/grpc"
  24. "github.com/xtls/xray-core/transport/internet/http"
  25. "github.com/xtls/xray-core/transport/internet/tls"
  26. "github.com/xtls/xray-core/transport/internet/websocket"
  27. "golang.org/x/sync/errgroup"
  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. Networks: []net.Network{net.Network_TCP},
  82. }),
  83. },
  84. },
  85. Outbound: []*core.OutboundHandlerConfig{
  86. {
  87. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  88. Receiver: []*protocol.ServerEndpoint{
  89. {
  90. Address: net.NewIPOrDomain(net.LocalHostIP),
  91. Port: uint32(serverPort),
  92. User: []*protocol.User{
  93. {
  94. Account: serial.ToTypedMessage(&vmess.Account{
  95. Id: userID.String(),
  96. }),
  97. },
  98. },
  99. },
  100. },
  101. }),
  102. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  103. StreamSettings: &internet.StreamConfig{
  104. SecurityType: serial.GetMessageType(&tls.Config{}),
  105. SecuritySettings: []*serial.TypedMessage{
  106. serial.ToTypedMessage(&tls.Config{
  107. AllowInsecure: true,
  108. }),
  109. },
  110. },
  111. }),
  112. },
  113. },
  114. }
  115. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  116. common.Must(err)
  117. defer CloseAllServers(servers)
  118. if err := testTCPConn(clientPort, 1024, time.Second*20)(); err != nil {
  119. t.Fatal(err)
  120. }
  121. }
  122. func TestAutoIssuingCertificate(t *testing.T) {
  123. if runtime.GOOS == "windows" {
  124. // Not supported on Windows yet.
  125. return
  126. }
  127. if runtime.GOARCH == "arm64" {
  128. return
  129. }
  130. tcpServer := tcp.Server{
  131. MsgProcessor: xor,
  132. }
  133. dest, err := tcpServer.Start()
  134. common.Must(err)
  135. defer tcpServer.Close()
  136. caCert, err := cert.Generate(nil, cert.Authority(true), cert.KeyUsage(x509.KeyUsageDigitalSignature|x509.KeyUsageKeyEncipherment|x509.KeyUsageCertSign))
  137. common.Must(err)
  138. certPEM, keyPEM := caCert.ToPEM()
  139. userID := protocol.NewID(uuid.New())
  140. serverPort := tcp.PickPort()
  141. serverConfig := &core.Config{
  142. Inbound: []*core.InboundHandlerConfig{
  143. {
  144. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  145. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  146. Listen: net.NewIPOrDomain(net.LocalHostIP),
  147. StreamSettings: &internet.StreamConfig{
  148. SecurityType: serial.GetMessageType(&tls.Config{}),
  149. SecuritySettings: []*serial.TypedMessage{
  150. serial.ToTypedMessage(&tls.Config{
  151. Certificate: []*tls.Certificate{{
  152. Certificate: certPEM,
  153. Key: keyPEM,
  154. Usage: tls.Certificate_AUTHORITY_ISSUE,
  155. }},
  156. }),
  157. },
  158. },
  159. }),
  160. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  161. User: []*protocol.User{
  162. {
  163. Account: serial.ToTypedMessage(&vmess.Account{
  164. Id: userID.String(),
  165. }),
  166. },
  167. },
  168. }),
  169. },
  170. },
  171. Outbound: []*core.OutboundHandlerConfig{
  172. {
  173. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  174. },
  175. },
  176. }
  177. clientPort := tcp.PickPort()
  178. clientConfig := &core.Config{
  179. Inbound: []*core.InboundHandlerConfig{
  180. {
  181. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  182. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  183. Listen: net.NewIPOrDomain(net.LocalHostIP),
  184. }),
  185. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  186. Address: net.NewIPOrDomain(dest.Address),
  187. Port: uint32(dest.Port),
  188. Networks: []net.Network{net.Network_TCP},
  189. }),
  190. },
  191. },
  192. Outbound: []*core.OutboundHandlerConfig{
  193. {
  194. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  195. Receiver: []*protocol.ServerEndpoint{
  196. {
  197. Address: net.NewIPOrDomain(net.LocalHostIP),
  198. Port: uint32(serverPort),
  199. User: []*protocol.User{
  200. {
  201. Account: serial.ToTypedMessage(&vmess.Account{
  202. Id: userID.String(),
  203. }),
  204. },
  205. },
  206. },
  207. },
  208. }),
  209. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  210. StreamSettings: &internet.StreamConfig{
  211. SecurityType: serial.GetMessageType(&tls.Config{}),
  212. SecuritySettings: []*serial.TypedMessage{
  213. serial.ToTypedMessage(&tls.Config{
  214. ServerName: "example.com",
  215. Certificate: []*tls.Certificate{{
  216. Certificate: certPEM,
  217. Usage: tls.Certificate_AUTHORITY_VERIFY,
  218. }},
  219. }),
  220. },
  221. },
  222. }),
  223. },
  224. },
  225. }
  226. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  227. common.Must(err)
  228. defer CloseAllServers(servers)
  229. for i := 0; i < 10; i++ {
  230. if err := testTCPConn(clientPort, 1024, time.Second*20)(); err != nil {
  231. t.Error(err)
  232. }
  233. }
  234. }
  235. func TestTLSOverKCP(t *testing.T) {
  236. tcpServer := tcp.Server{
  237. MsgProcessor: xor,
  238. }
  239. dest, err := tcpServer.Start()
  240. common.Must(err)
  241. defer tcpServer.Close()
  242. userID := protocol.NewID(uuid.New())
  243. serverPort := udp.PickPort()
  244. serverConfig := &core.Config{
  245. Inbound: []*core.InboundHandlerConfig{
  246. {
  247. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  248. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  249. Listen: net.NewIPOrDomain(net.LocalHostIP),
  250. StreamSettings: &internet.StreamConfig{
  251. Protocol: internet.TransportProtocol_MKCP,
  252. SecurityType: serial.GetMessageType(&tls.Config{}),
  253. SecuritySettings: []*serial.TypedMessage{
  254. serial.ToTypedMessage(&tls.Config{
  255. Certificate: []*tls.Certificate{tls.ParseCertificate(cert.MustGenerate(nil))},
  256. }),
  257. },
  258. },
  259. }),
  260. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  261. User: []*protocol.User{
  262. {
  263. Account: serial.ToTypedMessage(&vmess.Account{
  264. Id: userID.String(),
  265. }),
  266. },
  267. },
  268. }),
  269. },
  270. },
  271. Outbound: []*core.OutboundHandlerConfig{
  272. {
  273. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  274. },
  275. },
  276. }
  277. clientPort := tcp.PickPort()
  278. clientConfig := &core.Config{
  279. Inbound: []*core.InboundHandlerConfig{
  280. {
  281. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  282. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  283. Listen: net.NewIPOrDomain(net.LocalHostIP),
  284. }),
  285. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  286. Address: net.NewIPOrDomain(dest.Address),
  287. Port: uint32(dest.Port),
  288. Networks: []net.Network{net.Network_TCP},
  289. }),
  290. },
  291. },
  292. Outbound: []*core.OutboundHandlerConfig{
  293. {
  294. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  295. Receiver: []*protocol.ServerEndpoint{
  296. {
  297. Address: net.NewIPOrDomain(net.LocalHostIP),
  298. Port: uint32(serverPort),
  299. User: []*protocol.User{
  300. {
  301. Account: serial.ToTypedMessage(&vmess.Account{
  302. Id: userID.String(),
  303. }),
  304. },
  305. },
  306. },
  307. },
  308. }),
  309. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  310. StreamSettings: &internet.StreamConfig{
  311. Protocol: internet.TransportProtocol_MKCP,
  312. SecurityType: serial.GetMessageType(&tls.Config{}),
  313. SecuritySettings: []*serial.TypedMessage{
  314. serial.ToTypedMessage(&tls.Config{
  315. AllowInsecure: true,
  316. }),
  317. },
  318. },
  319. }),
  320. },
  321. },
  322. }
  323. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  324. common.Must(err)
  325. defer CloseAllServers(servers)
  326. if err := testTCPConn(clientPort, 1024, time.Second*20)(); err != nil {
  327. t.Error(err)
  328. }
  329. }
  330. func TestTLSOverWebSocket(t *testing.T) {
  331. tcpServer := tcp.Server{
  332. MsgProcessor: xor,
  333. }
  334. dest, err := tcpServer.Start()
  335. common.Must(err)
  336. defer tcpServer.Close()
  337. userID := protocol.NewID(uuid.New())
  338. serverPort := tcp.PickPort()
  339. serverConfig := &core.Config{
  340. Inbound: []*core.InboundHandlerConfig{
  341. {
  342. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  343. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  344. Listen: net.NewIPOrDomain(net.LocalHostIP),
  345. StreamSettings: &internet.StreamConfig{
  346. Protocol: internet.TransportProtocol_WebSocket,
  347. SecurityType: serial.GetMessageType(&tls.Config{}),
  348. SecuritySettings: []*serial.TypedMessage{
  349. serial.ToTypedMessage(&tls.Config{
  350. Certificate: []*tls.Certificate{tls.ParseCertificate(cert.MustGenerate(nil))},
  351. }),
  352. },
  353. },
  354. }),
  355. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  356. User: []*protocol.User{
  357. {
  358. Account: serial.ToTypedMessage(&vmess.Account{
  359. Id: userID.String(),
  360. }),
  361. },
  362. },
  363. }),
  364. },
  365. },
  366. Outbound: []*core.OutboundHandlerConfig{
  367. {
  368. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  369. },
  370. },
  371. }
  372. clientPort := tcp.PickPort()
  373. clientConfig := &core.Config{
  374. Inbound: []*core.InboundHandlerConfig{
  375. {
  376. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  377. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  378. Listen: net.NewIPOrDomain(net.LocalHostIP),
  379. }),
  380. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  381. Address: net.NewIPOrDomain(dest.Address),
  382. Port: uint32(dest.Port),
  383. Networks: []net.Network{net.Network_TCP},
  384. }),
  385. },
  386. },
  387. Outbound: []*core.OutboundHandlerConfig{
  388. {
  389. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  390. Receiver: []*protocol.ServerEndpoint{
  391. {
  392. Address: net.NewIPOrDomain(net.LocalHostIP),
  393. Port: uint32(serverPort),
  394. User: []*protocol.User{
  395. {
  396. Account: serial.ToTypedMessage(&vmess.Account{
  397. Id: userID.String(),
  398. }),
  399. },
  400. },
  401. },
  402. },
  403. }),
  404. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  405. StreamSettings: &internet.StreamConfig{
  406. Protocol: internet.TransportProtocol_WebSocket,
  407. TransportSettings: []*internet.TransportConfig{
  408. {
  409. Protocol: internet.TransportProtocol_WebSocket,
  410. Settings: serial.ToTypedMessage(&websocket.Config{}),
  411. },
  412. },
  413. SecurityType: serial.GetMessageType(&tls.Config{}),
  414. SecuritySettings: []*serial.TypedMessage{
  415. serial.ToTypedMessage(&tls.Config{
  416. AllowInsecure: true,
  417. }),
  418. },
  419. },
  420. }),
  421. },
  422. },
  423. }
  424. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  425. common.Must(err)
  426. defer CloseAllServers(servers)
  427. var errg errgroup.Group
  428. for i := 0; i < 10; i++ {
  429. errg.Go(testTCPConn(clientPort, 10240*1024, time.Second*20))
  430. }
  431. if err := errg.Wait(); err != nil {
  432. t.Error(err)
  433. }
  434. }
  435. func TestHTTP2(t *testing.T) {
  436. tcpServer := tcp.Server{
  437. MsgProcessor: xor,
  438. }
  439. dest, err := tcpServer.Start()
  440. common.Must(err)
  441. defer tcpServer.Close()
  442. userID := protocol.NewID(uuid.New())
  443. serverPort := tcp.PickPort()
  444. serverConfig := &core.Config{
  445. Inbound: []*core.InboundHandlerConfig{
  446. {
  447. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  448. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  449. Listen: net.NewIPOrDomain(net.LocalHostIP),
  450. StreamSettings: &internet.StreamConfig{
  451. Protocol: internet.TransportProtocol_HTTP,
  452. TransportSettings: []*internet.TransportConfig{
  453. {
  454. Protocol: internet.TransportProtocol_HTTP,
  455. Settings: serial.ToTypedMessage(&http.Config{
  456. Host: []string{"example.com"},
  457. Path: "/testpath",
  458. }),
  459. },
  460. },
  461. SecurityType: serial.GetMessageType(&tls.Config{}),
  462. SecuritySettings: []*serial.TypedMessage{
  463. serial.ToTypedMessage(&tls.Config{
  464. Certificate: []*tls.Certificate{tls.ParseCertificate(cert.MustGenerate(nil))},
  465. }),
  466. },
  467. },
  468. }),
  469. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  470. User: []*protocol.User{
  471. {
  472. Account: serial.ToTypedMessage(&vmess.Account{
  473. Id: userID.String(),
  474. }),
  475. },
  476. },
  477. }),
  478. },
  479. },
  480. Outbound: []*core.OutboundHandlerConfig{
  481. {
  482. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  483. },
  484. },
  485. }
  486. clientPort := tcp.PickPort()
  487. clientConfig := &core.Config{
  488. Inbound: []*core.InboundHandlerConfig{
  489. {
  490. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  491. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  492. Listen: net.NewIPOrDomain(net.LocalHostIP),
  493. }),
  494. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  495. Address: net.NewIPOrDomain(dest.Address),
  496. Port: uint32(dest.Port),
  497. Networks: []net.Network{net.Network_TCP},
  498. }),
  499. },
  500. },
  501. Outbound: []*core.OutboundHandlerConfig{
  502. {
  503. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  504. Receiver: []*protocol.ServerEndpoint{
  505. {
  506. Address: net.NewIPOrDomain(net.LocalHostIP),
  507. Port: uint32(serverPort),
  508. User: []*protocol.User{
  509. {
  510. Account: serial.ToTypedMessage(&vmess.Account{
  511. Id: userID.String(),
  512. }),
  513. },
  514. },
  515. },
  516. },
  517. }),
  518. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  519. StreamSettings: &internet.StreamConfig{
  520. Protocol: internet.TransportProtocol_HTTP,
  521. TransportSettings: []*internet.TransportConfig{
  522. {
  523. Protocol: internet.TransportProtocol_HTTP,
  524. Settings: serial.ToTypedMessage(&http.Config{
  525. Host: []string{"example.com"},
  526. Path: "/testpath",
  527. }),
  528. },
  529. },
  530. SecurityType: serial.GetMessageType(&tls.Config{}),
  531. SecuritySettings: []*serial.TypedMessage{
  532. serial.ToTypedMessage(&tls.Config{
  533. AllowInsecure: true,
  534. }),
  535. },
  536. },
  537. }),
  538. },
  539. },
  540. }
  541. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  542. common.Must(err)
  543. defer CloseAllServers(servers)
  544. var errg errgroup.Group
  545. for i := 0; i < 10; i++ {
  546. errg.Go(testTCPConn(clientPort, 1024*1024, time.Second*40))
  547. }
  548. if err := errg.Wait(); err != nil {
  549. t.Error(err)
  550. }
  551. }
  552. func TestGRPC(t *testing.T) {
  553. tcpServer := tcp.Server{
  554. MsgProcessor: xor,
  555. }
  556. dest, err := tcpServer.Start()
  557. common.Must(err)
  558. defer tcpServer.Close()
  559. userID := protocol.NewID(uuid.New())
  560. serverPort := tcp.PickPort()
  561. serverConfig := &core.Config{
  562. Inbound: []*core.InboundHandlerConfig{
  563. {
  564. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  565. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  566. Listen: net.NewIPOrDomain(net.LocalHostIP),
  567. StreamSettings: &internet.StreamConfig{
  568. ProtocolName: "grpc",
  569. TransportSettings: []*internet.TransportConfig{
  570. {
  571. ProtocolName: "grpc",
  572. Settings: serial.ToTypedMessage(&grpc.Config{ServiceName: "🍉"}),
  573. },
  574. },
  575. SecurityType: serial.GetMessageType(&tls.Config{}),
  576. SecuritySettings: []*serial.TypedMessage{
  577. serial.ToTypedMessage(&tls.Config{
  578. Certificate: []*tls.Certificate{tls.ParseCertificate(cert.MustGenerate(nil))},
  579. }),
  580. },
  581. },
  582. }),
  583. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  584. User: []*protocol.User{
  585. {
  586. Account: serial.ToTypedMessage(&vmess.Account{
  587. Id: userID.String(),
  588. }),
  589. },
  590. },
  591. }),
  592. },
  593. },
  594. Outbound: []*core.OutboundHandlerConfig{
  595. {
  596. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  597. },
  598. },
  599. }
  600. clientPort := tcp.PickPort()
  601. clientConfig := &core.Config{
  602. Inbound: []*core.InboundHandlerConfig{
  603. {
  604. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  605. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  606. Listen: net.NewIPOrDomain(net.LocalHostIP),
  607. }),
  608. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  609. Address: net.NewIPOrDomain(dest.Address),
  610. Port: uint32(dest.Port),
  611. Networks: []net.Network{net.Network_TCP},
  612. }),
  613. },
  614. },
  615. Outbound: []*core.OutboundHandlerConfig{
  616. {
  617. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  618. Receiver: []*protocol.ServerEndpoint{
  619. {
  620. Address: net.NewIPOrDomain(net.LocalHostIP),
  621. Port: uint32(serverPort),
  622. User: []*protocol.User{
  623. {
  624. Account: serial.ToTypedMessage(&vmess.Account{
  625. Id: userID.String(),
  626. }),
  627. },
  628. },
  629. },
  630. },
  631. }),
  632. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  633. StreamSettings: &internet.StreamConfig{
  634. ProtocolName: "grpc",
  635. TransportSettings: []*internet.TransportConfig{
  636. {
  637. ProtocolName: "grpc",
  638. Settings: serial.ToTypedMessage(&grpc.Config{ServiceName: "🍉"}),
  639. },
  640. },
  641. SecurityType: serial.GetMessageType(&tls.Config{}),
  642. SecuritySettings: []*serial.TypedMessage{
  643. serial.ToTypedMessage(&tls.Config{
  644. AllowInsecure: true,
  645. }),
  646. },
  647. },
  648. }),
  649. },
  650. },
  651. }
  652. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  653. common.Must(err)
  654. defer CloseAllServers(servers)
  655. var errg errgroup.Group
  656. for i := 0; i < 10; i++ {
  657. errg.Go(testTCPConn(clientPort, 1024*10240, time.Second*40))
  658. }
  659. if err := errg.Wait(); err != nil {
  660. t.Error(err)
  661. }
  662. }
  663. func TestGRPCMultiMode(t *testing.T) {
  664. tcpServer := tcp.Server{
  665. MsgProcessor: xor,
  666. }
  667. dest, err := tcpServer.Start()
  668. common.Must(err)
  669. defer tcpServer.Close()
  670. userID := protocol.NewID(uuid.New())
  671. serverPort := tcp.PickPort()
  672. serverConfig := &core.Config{
  673. Inbound: []*core.InboundHandlerConfig{
  674. {
  675. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  676. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  677. Listen: net.NewIPOrDomain(net.LocalHostIP),
  678. StreamSettings: &internet.StreamConfig{
  679. ProtocolName: "grpc",
  680. TransportSettings: []*internet.TransportConfig{
  681. {
  682. ProtocolName: "grpc",
  683. Settings: serial.ToTypedMessage(&grpc.Config{ServiceName: "🍉"}),
  684. },
  685. },
  686. SecurityType: serial.GetMessageType(&tls.Config{}),
  687. SecuritySettings: []*serial.TypedMessage{
  688. serial.ToTypedMessage(&tls.Config{
  689. Certificate: []*tls.Certificate{tls.ParseCertificate(cert.MustGenerate(nil))},
  690. }),
  691. },
  692. },
  693. }),
  694. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  695. User: []*protocol.User{
  696. {
  697. Account: serial.ToTypedMessage(&vmess.Account{
  698. Id: userID.String(),
  699. }),
  700. },
  701. },
  702. }),
  703. },
  704. },
  705. Outbound: []*core.OutboundHandlerConfig{
  706. {
  707. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  708. },
  709. },
  710. }
  711. clientPort := tcp.PickPort()
  712. clientConfig := &core.Config{
  713. Inbound: []*core.InboundHandlerConfig{
  714. {
  715. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  716. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  717. Listen: net.NewIPOrDomain(net.LocalHostIP),
  718. }),
  719. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  720. Address: net.NewIPOrDomain(dest.Address),
  721. Port: uint32(dest.Port),
  722. Networks: []net.Network{net.Network_TCP},
  723. }),
  724. },
  725. },
  726. Outbound: []*core.OutboundHandlerConfig{
  727. {
  728. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  729. Receiver: []*protocol.ServerEndpoint{
  730. {
  731. Address: net.NewIPOrDomain(net.LocalHostIP),
  732. Port: uint32(serverPort),
  733. User: []*protocol.User{
  734. {
  735. Account: serial.ToTypedMessage(&vmess.Account{
  736. Id: userID.String(),
  737. }),
  738. },
  739. },
  740. },
  741. },
  742. }),
  743. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  744. StreamSettings: &internet.StreamConfig{
  745. ProtocolName: "grpc",
  746. TransportSettings: []*internet.TransportConfig{
  747. {
  748. ProtocolName: "grpc",
  749. Settings: serial.ToTypedMessage(&grpc.Config{ServiceName: "🍉", MultiMode: true}),
  750. },
  751. },
  752. SecurityType: serial.GetMessageType(&tls.Config{}),
  753. SecuritySettings: []*serial.TypedMessage{
  754. serial.ToTypedMessage(&tls.Config{
  755. AllowInsecure: true,
  756. }),
  757. },
  758. },
  759. }),
  760. },
  761. },
  762. }
  763. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  764. common.Must(err)
  765. defer CloseAllServers(servers)
  766. var errg errgroup.Group
  767. for i := 0; i < 10; i++ {
  768. errg.Go(testTCPConn(clientPort, 1024*10240, time.Second*40))
  769. }
  770. if err := errg.Wait(); err != nil {
  771. t.Error(err)
  772. }
  773. }
  774. func TestSimpleTLSConnectionPinned(t *testing.T) {
  775. tcpServer := tcp.Server{
  776. MsgProcessor: xor,
  777. }
  778. dest, err := tcpServer.Start()
  779. common.Must(err)
  780. defer tcpServer.Close()
  781. certificateDer := cert.MustGenerate(nil)
  782. certificate := tls.ParseCertificate(certificateDer)
  783. certHash := tls.GenerateCertChainHash([][]byte{certificateDer.Certificate})
  784. userID := protocol.NewID(uuid.New())
  785. serverPort := tcp.PickPort()
  786. serverConfig := &core.Config{
  787. Inbound: []*core.InboundHandlerConfig{
  788. {
  789. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  790. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  791. Listen: net.NewIPOrDomain(net.LocalHostIP),
  792. StreamSettings: &internet.StreamConfig{
  793. SecurityType: serial.GetMessageType(&tls.Config{}),
  794. SecuritySettings: []*serial.TypedMessage{
  795. serial.ToTypedMessage(&tls.Config{
  796. Certificate: []*tls.Certificate{certificate},
  797. }),
  798. },
  799. },
  800. }),
  801. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  802. User: []*protocol.User{
  803. {
  804. Account: serial.ToTypedMessage(&vmess.Account{
  805. Id: userID.String(),
  806. }),
  807. },
  808. },
  809. }),
  810. },
  811. },
  812. Outbound: []*core.OutboundHandlerConfig{
  813. {
  814. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  815. },
  816. },
  817. }
  818. clientPort := tcp.PickPort()
  819. clientConfig := &core.Config{
  820. Inbound: []*core.InboundHandlerConfig{
  821. {
  822. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  823. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  824. Listen: net.NewIPOrDomain(net.LocalHostIP),
  825. }),
  826. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  827. Address: net.NewIPOrDomain(dest.Address),
  828. Port: uint32(dest.Port),
  829. Networks: []net.Network{net.Network_TCP},
  830. }),
  831. },
  832. },
  833. Outbound: []*core.OutboundHandlerConfig{
  834. {
  835. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  836. Receiver: []*protocol.ServerEndpoint{
  837. {
  838. Address: net.NewIPOrDomain(net.LocalHostIP),
  839. Port: uint32(serverPort),
  840. User: []*protocol.User{
  841. {
  842. Account: serial.ToTypedMessage(&vmess.Account{
  843. Id: userID.String(),
  844. }),
  845. },
  846. },
  847. },
  848. },
  849. }),
  850. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  851. StreamSettings: &internet.StreamConfig{
  852. SecurityType: serial.GetMessageType(&tls.Config{}),
  853. SecuritySettings: []*serial.TypedMessage{
  854. serial.ToTypedMessage(&tls.Config{
  855. AllowInsecure: true,
  856. PinnedPeerCertificateChainSha256: [][]byte{certHash},
  857. }),
  858. },
  859. },
  860. }),
  861. },
  862. },
  863. }
  864. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  865. common.Must(err)
  866. defer CloseAllServers(servers)
  867. if err := testTCPConn(clientPort, 1024, time.Second*20)(); err != nil {
  868. t.Fatal(err)
  869. }
  870. }
  871. func TestSimpleTLSConnectionPinnedWrongCert(t *testing.T) {
  872. tcpServer := tcp.Server{
  873. MsgProcessor: xor,
  874. }
  875. dest, err := tcpServer.Start()
  876. common.Must(err)
  877. defer tcpServer.Close()
  878. certificateDer := cert.MustGenerate(nil)
  879. certificate := tls.ParseCertificate(certificateDer)
  880. certHash := tls.GenerateCertChainHash([][]byte{certificateDer.Certificate})
  881. certHash[1] += 1
  882. userID := protocol.NewID(uuid.New())
  883. serverPort := tcp.PickPort()
  884. serverConfig := &core.Config{
  885. Inbound: []*core.InboundHandlerConfig{
  886. {
  887. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  888. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  889. Listen: net.NewIPOrDomain(net.LocalHostIP),
  890. StreamSettings: &internet.StreamConfig{
  891. SecurityType: serial.GetMessageType(&tls.Config{}),
  892. SecuritySettings: []*serial.TypedMessage{
  893. serial.ToTypedMessage(&tls.Config{
  894. Certificate: []*tls.Certificate{certificate},
  895. }),
  896. },
  897. },
  898. }),
  899. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  900. User: []*protocol.User{
  901. {
  902. Account: serial.ToTypedMessage(&vmess.Account{
  903. Id: userID.String(),
  904. }),
  905. },
  906. },
  907. }),
  908. },
  909. },
  910. Outbound: []*core.OutboundHandlerConfig{
  911. {
  912. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  913. },
  914. },
  915. }
  916. clientPort := tcp.PickPort()
  917. clientConfig := &core.Config{
  918. Inbound: []*core.InboundHandlerConfig{
  919. {
  920. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  921. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  922. Listen: net.NewIPOrDomain(net.LocalHostIP),
  923. }),
  924. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  925. Address: net.NewIPOrDomain(dest.Address),
  926. Port: uint32(dest.Port),
  927. Networks: []net.Network{net.Network_TCP},
  928. }),
  929. },
  930. },
  931. Outbound: []*core.OutboundHandlerConfig{
  932. {
  933. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  934. Receiver: []*protocol.ServerEndpoint{
  935. {
  936. Address: net.NewIPOrDomain(net.LocalHostIP),
  937. Port: uint32(serverPort),
  938. User: []*protocol.User{
  939. {
  940. Account: serial.ToTypedMessage(&vmess.Account{
  941. Id: userID.String(),
  942. }),
  943. },
  944. },
  945. },
  946. },
  947. }),
  948. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  949. StreamSettings: &internet.StreamConfig{
  950. SecurityType: serial.GetMessageType(&tls.Config{}),
  951. SecuritySettings: []*serial.TypedMessage{
  952. serial.ToTypedMessage(&tls.Config{
  953. AllowInsecure: true,
  954. PinnedPeerCertificateChainSha256: [][]byte{certHash},
  955. }),
  956. },
  957. },
  958. }),
  959. },
  960. },
  961. }
  962. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  963. common.Must(err)
  964. defer CloseAllServers(servers)
  965. if err := testTCPConn(clientPort, 1024, time.Second*20)(); err == nil {
  966. t.Fatal(err)
  967. }
  968. }
  969. func TestUTLSConnectionPinned(t *testing.T) {
  970. tcpServer := tcp.Server{
  971. MsgProcessor: xor,
  972. }
  973. dest, err := tcpServer.Start()
  974. common.Must(err)
  975. defer tcpServer.Close()
  976. certificateDer := cert.MustGenerate(nil)
  977. certificate := tls.ParseCertificate(certificateDer)
  978. certHash := tls.GenerateCertChainHash([][]byte{certificateDer.Certificate})
  979. userID := protocol.NewID(uuid.New())
  980. serverPort := tcp.PickPort()
  981. serverConfig := &core.Config{
  982. Inbound: []*core.InboundHandlerConfig{
  983. {
  984. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  985. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  986. Listen: net.NewIPOrDomain(net.LocalHostIP),
  987. StreamSettings: &internet.StreamConfig{
  988. SecurityType: serial.GetMessageType(&tls.Config{}),
  989. SecuritySettings: []*serial.TypedMessage{
  990. serial.ToTypedMessage(&tls.Config{
  991. Certificate: []*tls.Certificate{certificate},
  992. }),
  993. },
  994. },
  995. }),
  996. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  997. User: []*protocol.User{
  998. {
  999. Account: serial.ToTypedMessage(&vmess.Account{
  1000. Id: userID.String(),
  1001. }),
  1002. },
  1003. },
  1004. }),
  1005. },
  1006. },
  1007. Outbound: []*core.OutboundHandlerConfig{
  1008. {
  1009. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  1010. },
  1011. },
  1012. }
  1013. clientPort := tcp.PickPort()
  1014. clientConfig := &core.Config{
  1015. Inbound: []*core.InboundHandlerConfig{
  1016. {
  1017. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  1018. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  1019. Listen: net.NewIPOrDomain(net.LocalHostIP),
  1020. }),
  1021. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  1022. Address: net.NewIPOrDomain(dest.Address),
  1023. Port: uint32(dest.Port),
  1024. Networks: []net.Network{net.Network_TCP},
  1025. }),
  1026. },
  1027. },
  1028. Outbound: []*core.OutboundHandlerConfig{
  1029. {
  1030. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  1031. Receiver: []*protocol.ServerEndpoint{
  1032. {
  1033. Address: net.NewIPOrDomain(net.LocalHostIP),
  1034. Port: uint32(serverPort),
  1035. User: []*protocol.User{
  1036. {
  1037. Account: serial.ToTypedMessage(&vmess.Account{
  1038. Id: userID.String(),
  1039. }),
  1040. },
  1041. },
  1042. },
  1043. },
  1044. }),
  1045. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  1046. StreamSettings: &internet.StreamConfig{
  1047. SecurityType: serial.GetMessageType(&tls.Config{}),
  1048. SecuritySettings: []*serial.TypedMessage{
  1049. serial.ToTypedMessage(&tls.Config{
  1050. Fingerprint: "random",
  1051. AllowInsecure: true,
  1052. PinnedPeerCertificateChainSha256: [][]byte{certHash},
  1053. }),
  1054. },
  1055. },
  1056. }),
  1057. },
  1058. },
  1059. }
  1060. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  1061. common.Must(err)
  1062. defer CloseAllServers(servers)
  1063. if err := testTCPConn(clientPort, 1024, time.Second*20)(); err != nil {
  1064. t.Fatal(err)
  1065. }
  1066. }
  1067. func TestUTLSConnectionPinnedWrongCert(t *testing.T) {
  1068. tcpServer := tcp.Server{
  1069. MsgProcessor: xor,
  1070. }
  1071. dest, err := tcpServer.Start()
  1072. common.Must(err)
  1073. defer tcpServer.Close()
  1074. certificateDer := cert.MustGenerate(nil)
  1075. certificate := tls.ParseCertificate(certificateDer)
  1076. certHash := tls.GenerateCertChainHash([][]byte{certificateDer.Certificate})
  1077. certHash[1] += 1
  1078. userID := protocol.NewID(uuid.New())
  1079. serverPort := tcp.PickPort()
  1080. serverConfig := &core.Config{
  1081. Inbound: []*core.InboundHandlerConfig{
  1082. {
  1083. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  1084. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  1085. Listen: net.NewIPOrDomain(net.LocalHostIP),
  1086. StreamSettings: &internet.StreamConfig{
  1087. SecurityType: serial.GetMessageType(&tls.Config{}),
  1088. SecuritySettings: []*serial.TypedMessage{
  1089. serial.ToTypedMessage(&tls.Config{
  1090. Certificate: []*tls.Certificate{certificate},
  1091. }),
  1092. },
  1093. },
  1094. }),
  1095. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  1096. User: []*protocol.User{
  1097. {
  1098. Account: serial.ToTypedMessage(&vmess.Account{
  1099. Id: userID.String(),
  1100. }),
  1101. },
  1102. },
  1103. }),
  1104. },
  1105. },
  1106. Outbound: []*core.OutboundHandlerConfig{
  1107. {
  1108. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  1109. },
  1110. },
  1111. }
  1112. clientPort := tcp.PickPort()
  1113. clientConfig := &core.Config{
  1114. Inbound: []*core.InboundHandlerConfig{
  1115. {
  1116. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  1117. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  1118. Listen: net.NewIPOrDomain(net.LocalHostIP),
  1119. }),
  1120. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  1121. Address: net.NewIPOrDomain(dest.Address),
  1122. Port: uint32(dest.Port),
  1123. Networks: []net.Network{net.Network_TCP},
  1124. }),
  1125. },
  1126. },
  1127. Outbound: []*core.OutboundHandlerConfig{
  1128. {
  1129. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  1130. Receiver: []*protocol.ServerEndpoint{
  1131. {
  1132. Address: net.NewIPOrDomain(net.LocalHostIP),
  1133. Port: uint32(serverPort),
  1134. User: []*protocol.User{
  1135. {
  1136. Account: serial.ToTypedMessage(&vmess.Account{
  1137. Id: userID.String(),
  1138. }),
  1139. },
  1140. },
  1141. },
  1142. },
  1143. }),
  1144. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  1145. StreamSettings: &internet.StreamConfig{
  1146. SecurityType: serial.GetMessageType(&tls.Config{}),
  1147. SecuritySettings: []*serial.TypedMessage{
  1148. serial.ToTypedMessage(&tls.Config{
  1149. Fingerprint: "random",
  1150. AllowInsecure: true,
  1151. PinnedPeerCertificateChainSha256: [][]byte{certHash},
  1152. }),
  1153. },
  1154. },
  1155. }),
  1156. },
  1157. },
  1158. }
  1159. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  1160. common.Must(err)
  1161. defer CloseAllServers(servers)
  1162. if err := testTCPConn(clientPort, 1024, time.Second*20)(); err == nil {
  1163. t.Fatal(err)
  1164. }
  1165. }