tls_test.go 30 KB

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