tls_test.go 14 KB

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