tls_test.go 25 KB

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