tls_test.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525
  1. package scenarios
  2. import (
  3. "crypto/rand"
  4. "sync"
  5. "testing"
  6. "time"
  7. "v2ray.com/core"
  8. "v2ray.com/core/app/proxyman"
  9. "v2ray.com/core/common/net"
  10. "v2ray.com/core/common/protocol"
  11. "v2ray.com/core/common/serial"
  12. "v2ray.com/core/common/uuid"
  13. "v2ray.com/core/proxy/dokodemo"
  14. "v2ray.com/core/proxy/freedom"
  15. "v2ray.com/core/proxy/vmess"
  16. "v2ray.com/core/proxy/vmess/inbound"
  17. "v2ray.com/core/proxy/vmess/outbound"
  18. "v2ray.com/core/testing/servers/tcp"
  19. "v2ray.com/core/testing/servers/udp"
  20. tlsgen "v2ray.com/core/testing/tls"
  21. "v2ray.com/core/transport/internet"
  22. "v2ray.com/core/transport/internet/http"
  23. "v2ray.com/core/transport/internet/tls"
  24. "v2ray.com/core/transport/internet/websocket"
  25. . "v2ray.com/ext/assert"
  26. )
  27. func TestSimpleTLSConnection(t *testing.T) {
  28. assert := With(t)
  29. tcpServer := tcp.Server{
  30. MsgProcessor: xor,
  31. }
  32. dest, err := tcpServer.Start()
  33. assert(err, IsNil)
  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. 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{tlsgen.GenerateCertificateForTest()},
  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. 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. NetworkList: &net.NetworkList{
  81. Network: []net.Network{net.Network_TCP},
  82. },
  83. }),
  84. },
  85. },
  86. Outbound: []*core.OutboundHandlerConfig{
  87. {
  88. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  89. Receiver: []*protocol.ServerEndpoint{
  90. {
  91. Address: net.NewIPOrDomain(net.LocalHostIP),
  92. Port: uint32(serverPort),
  93. User: []*protocol.User{
  94. {
  95. Account: serial.ToTypedMessage(&vmess.Account{
  96. Id: userID.String(),
  97. }),
  98. },
  99. },
  100. },
  101. },
  102. }),
  103. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  104. StreamSettings: &internet.StreamConfig{
  105. SecurityType: serial.GetMessageType(&tls.Config{}),
  106. SecuritySettings: []*serial.TypedMessage{
  107. serial.ToTypedMessage(&tls.Config{
  108. AllowInsecure: true,
  109. }),
  110. },
  111. },
  112. }),
  113. },
  114. },
  115. }
  116. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  117. assert(err, IsNil)
  118. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  119. IP: []byte{127, 0, 0, 1},
  120. Port: int(clientPort),
  121. })
  122. assert(err, IsNil)
  123. payload := "dokodemo request."
  124. nBytes, err := conn.Write([]byte(payload))
  125. assert(err, IsNil)
  126. assert(nBytes, Equals, len(payload))
  127. response := readFrom(conn, time.Second*2, len(payload))
  128. assert(response, Equals, xor([]byte(payload)))
  129. assert(conn.Close(), IsNil)
  130. CloseAllServers(servers)
  131. }
  132. func TestTLSOverKCP(t *testing.T) {
  133. assert := With(t)
  134. tcpServer := tcp.Server{
  135. MsgProcessor: xor,
  136. }
  137. dest, err := tcpServer.Start()
  138. assert(err, IsNil)
  139. defer tcpServer.Close()
  140. userID := protocol.NewID(uuid.New())
  141. serverPort := udp.PickPort()
  142. serverConfig := &core.Config{
  143. Inbound: []*core.InboundHandlerConfig{
  144. {
  145. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  146. PortRange: net.SinglePortRange(serverPort),
  147. Listen: net.NewIPOrDomain(net.LocalHostIP),
  148. StreamSettings: &internet.StreamConfig{
  149. Protocol: internet.TransportProtocol_MKCP,
  150. SecurityType: serial.GetMessageType(&tls.Config{}),
  151. SecuritySettings: []*serial.TypedMessage{
  152. serial.ToTypedMessage(&tls.Config{
  153. Certificate: []*tls.Certificate{tlsgen.GenerateCertificateForTest()},
  154. }),
  155. },
  156. },
  157. }),
  158. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  159. User: []*protocol.User{
  160. {
  161. Account: serial.ToTypedMessage(&vmess.Account{
  162. Id: userID.String(),
  163. }),
  164. },
  165. },
  166. }),
  167. },
  168. },
  169. Outbound: []*core.OutboundHandlerConfig{
  170. {
  171. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  172. },
  173. },
  174. }
  175. clientPort := tcp.PickPort()
  176. clientConfig := &core.Config{
  177. Inbound: []*core.InboundHandlerConfig{
  178. {
  179. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  180. PortRange: net.SinglePortRange(clientPort),
  181. Listen: net.NewIPOrDomain(net.LocalHostIP),
  182. }),
  183. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  184. Address: net.NewIPOrDomain(dest.Address),
  185. Port: uint32(dest.Port),
  186. NetworkList: &net.NetworkList{
  187. Network: []net.Network{net.Network_TCP},
  188. },
  189. }),
  190. },
  191. },
  192. Outbound: []*core.OutboundHandlerConfig{
  193. {
  194. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  195. Receiver: []*protocol.ServerEndpoint{
  196. {
  197. Address: net.NewIPOrDomain(net.LocalHostIP),
  198. Port: uint32(serverPort),
  199. User: []*protocol.User{
  200. {
  201. Account: serial.ToTypedMessage(&vmess.Account{
  202. Id: userID.String(),
  203. }),
  204. },
  205. },
  206. },
  207. },
  208. }),
  209. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  210. StreamSettings: &internet.StreamConfig{
  211. Protocol: internet.TransportProtocol_MKCP,
  212. SecurityType: serial.GetMessageType(&tls.Config{}),
  213. SecuritySettings: []*serial.TypedMessage{
  214. serial.ToTypedMessage(&tls.Config{
  215. AllowInsecure: true,
  216. }),
  217. },
  218. },
  219. }),
  220. },
  221. },
  222. }
  223. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  224. assert(err, IsNil)
  225. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  226. IP: []byte{127, 0, 0, 1},
  227. Port: int(clientPort),
  228. })
  229. assert(err, IsNil)
  230. payload := "dokodemo request."
  231. nBytes, err := conn.Write([]byte(payload))
  232. assert(err, IsNil)
  233. assert(nBytes, Equals, len(payload))
  234. response := readFrom(conn, time.Second*2, len(payload))
  235. assert(response, Equals, xor([]byte(payload)))
  236. assert(conn.Close(), IsNil)
  237. CloseAllServers(servers)
  238. }
  239. func TestTLSOverWebSocket(t *testing.T) {
  240. assert := With(t)
  241. tcpServer := tcp.Server{
  242. MsgProcessor: xor,
  243. }
  244. dest, err := tcpServer.Start()
  245. assert(err, IsNil)
  246. defer tcpServer.Close()
  247. userID := protocol.NewID(uuid.New())
  248. serverPort := tcp.PickPort()
  249. serverConfig := &core.Config{
  250. Inbound: []*core.InboundHandlerConfig{
  251. {
  252. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  253. PortRange: net.SinglePortRange(serverPort),
  254. Listen: net.NewIPOrDomain(net.LocalHostIP),
  255. StreamSettings: &internet.StreamConfig{
  256. Protocol: internet.TransportProtocol_WebSocket,
  257. SecurityType: serial.GetMessageType(&tls.Config{}),
  258. SecuritySettings: []*serial.TypedMessage{
  259. serial.ToTypedMessage(&tls.Config{
  260. Certificate: []*tls.Certificate{tlsgen.GenerateCertificateForTest()},
  261. }),
  262. },
  263. },
  264. }),
  265. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  266. User: []*protocol.User{
  267. {
  268. Account: serial.ToTypedMessage(&vmess.Account{
  269. Id: userID.String(),
  270. }),
  271. },
  272. },
  273. }),
  274. },
  275. },
  276. Outbound: []*core.OutboundHandlerConfig{
  277. {
  278. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  279. },
  280. },
  281. }
  282. clientPort := tcp.PickPort()
  283. clientConfig := &core.Config{
  284. Inbound: []*core.InboundHandlerConfig{
  285. {
  286. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  287. PortRange: net.SinglePortRange(clientPort),
  288. Listen: net.NewIPOrDomain(net.LocalHostIP),
  289. }),
  290. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  291. Address: net.NewIPOrDomain(dest.Address),
  292. Port: uint32(dest.Port),
  293. NetworkList: &net.NetworkList{
  294. Network: []net.Network{net.Network_TCP},
  295. },
  296. }),
  297. },
  298. },
  299. Outbound: []*core.OutboundHandlerConfig{
  300. {
  301. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  302. Receiver: []*protocol.ServerEndpoint{
  303. {
  304. Address: net.NewIPOrDomain(net.LocalHostIP),
  305. Port: uint32(serverPort),
  306. User: []*protocol.User{
  307. {
  308. Account: serial.ToTypedMessage(&vmess.Account{
  309. Id: userID.String(),
  310. }),
  311. },
  312. },
  313. },
  314. },
  315. }),
  316. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  317. StreamSettings: &internet.StreamConfig{
  318. Protocol: internet.TransportProtocol_WebSocket,
  319. TransportSettings: []*internet.TransportConfig{
  320. {
  321. Protocol: internet.TransportProtocol_WebSocket,
  322. Settings: serial.ToTypedMessage(&websocket.Config{}),
  323. },
  324. },
  325. SecurityType: serial.GetMessageType(&tls.Config{}),
  326. SecuritySettings: []*serial.TypedMessage{
  327. serial.ToTypedMessage(&tls.Config{
  328. AllowInsecure: true,
  329. }),
  330. },
  331. },
  332. }),
  333. },
  334. },
  335. }
  336. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  337. assert(err, IsNil)
  338. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  339. IP: []byte{127, 0, 0, 1},
  340. Port: int(clientPort),
  341. })
  342. assert(err, IsNil)
  343. payload := make([]byte, 10240*1024)
  344. rand.Read(payload)
  345. nBytes, err := conn.Write([]byte(payload))
  346. assert(err, IsNil)
  347. assert(nBytes, Equals, len(payload))
  348. response := readFrom(conn, time.Second*20, len(payload))
  349. assert(response, Equals, xor([]byte(payload)))
  350. assert(conn.Close(), IsNil)
  351. CloseAllServers(servers)
  352. }
  353. func TestHTTP2(t *testing.T) {
  354. assert := With(t)
  355. tcpServer := tcp.Server{
  356. MsgProcessor: xor,
  357. }
  358. dest, err := tcpServer.Start()
  359. assert(err, IsNil)
  360. defer tcpServer.Close()
  361. userID := protocol.NewID(uuid.New())
  362. serverPort := tcp.PickPort()
  363. serverConfig := &core.Config{
  364. Inbound: []*core.InboundHandlerConfig{
  365. {
  366. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  367. PortRange: net.SinglePortRange(serverPort),
  368. Listen: net.NewIPOrDomain(net.LocalHostIP),
  369. StreamSettings: &internet.StreamConfig{
  370. Protocol: internet.TransportProtocol_HTTP,
  371. TransportSettings: []*internet.TransportConfig{
  372. {
  373. Protocol: internet.TransportProtocol_HTTP,
  374. Settings: serial.ToTypedMessage(&http.Config{
  375. Host: []string{"v2ray.com"},
  376. Path: "/testpath",
  377. }),
  378. },
  379. },
  380. SecurityType: serial.GetMessageType(&tls.Config{}),
  381. SecuritySettings: []*serial.TypedMessage{
  382. serial.ToTypedMessage(&tls.Config{
  383. Certificate: []*tls.Certificate{tlsgen.GenerateCertificateForTest()},
  384. }),
  385. },
  386. },
  387. }),
  388. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  389. User: []*protocol.User{
  390. {
  391. Account: serial.ToTypedMessage(&vmess.Account{
  392. Id: userID.String(),
  393. }),
  394. },
  395. },
  396. }),
  397. },
  398. },
  399. Outbound: []*core.OutboundHandlerConfig{
  400. {
  401. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  402. },
  403. },
  404. }
  405. clientPort := tcp.PickPort()
  406. clientConfig := &core.Config{
  407. Inbound: []*core.InboundHandlerConfig{
  408. {
  409. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  410. PortRange: net.SinglePortRange(clientPort),
  411. Listen: net.NewIPOrDomain(net.LocalHostIP),
  412. }),
  413. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  414. Address: net.NewIPOrDomain(dest.Address),
  415. Port: uint32(dest.Port),
  416. NetworkList: &net.NetworkList{
  417. Network: []net.Network{net.Network_TCP},
  418. },
  419. }),
  420. },
  421. },
  422. Outbound: []*core.OutboundHandlerConfig{
  423. {
  424. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  425. Receiver: []*protocol.ServerEndpoint{
  426. {
  427. Address: net.NewIPOrDomain(net.LocalHostIP),
  428. Port: uint32(serverPort),
  429. User: []*protocol.User{
  430. {
  431. Account: serial.ToTypedMessage(&vmess.Account{
  432. Id: userID.String(),
  433. }),
  434. },
  435. },
  436. },
  437. },
  438. }),
  439. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  440. StreamSettings: &internet.StreamConfig{
  441. Protocol: internet.TransportProtocol_HTTP,
  442. TransportSettings: []*internet.TransportConfig{
  443. {
  444. Protocol: internet.TransportProtocol_HTTP,
  445. Settings: serial.ToTypedMessage(&http.Config{
  446. Host: []string{"v2ray.com"},
  447. Path: "/testpath",
  448. }),
  449. },
  450. },
  451. SecurityType: serial.GetMessageType(&tls.Config{}),
  452. SecuritySettings: []*serial.TypedMessage{
  453. serial.ToTypedMessage(&tls.Config{
  454. AllowInsecure: true,
  455. }),
  456. },
  457. },
  458. }),
  459. },
  460. },
  461. }
  462. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  463. assert(err, IsNil)
  464. var wg sync.WaitGroup
  465. for i := 0; i < 10; i++ {
  466. wg.Add(1)
  467. go func() {
  468. defer wg.Done()
  469. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  470. IP: []byte{127, 0, 0, 1},
  471. Port: int(clientPort),
  472. })
  473. assert(err, IsNil)
  474. payload := make([]byte, 10240*1024)
  475. rand.Read(payload)
  476. nBytes, err := conn.Write([]byte(payload))
  477. assert(err, IsNil)
  478. assert(nBytes, Equals, len(payload))
  479. response := readFrom(conn, time.Second*20, len(payload))
  480. assert(response, Equals, xor([]byte(payload)))
  481. assert(conn.Close(), IsNil)
  482. }()
  483. }
  484. wg.Wait()
  485. CloseAllServers(servers)
  486. }