tls_test.go 30 KB

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