tls_test.go 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  1. package scenarios
  2. import (
  3. "crypto/rand"
  4. "testing"
  5. "time"
  6. "v2ray.com/core"
  7. "v2ray.com/core/app/proxyman"
  8. "v2ray.com/core/common/net"
  9. "v2ray.com/core/common/protocol"
  10. "v2ray.com/core/common/serial"
  11. "v2ray.com/core/common/uuid"
  12. "v2ray.com/core/proxy/dokodemo"
  13. "v2ray.com/core/proxy/freedom"
  14. "v2ray.com/core/proxy/vmess"
  15. "v2ray.com/core/proxy/vmess/inbound"
  16. "v2ray.com/core/proxy/vmess/outbound"
  17. "v2ray.com/core/testing/servers/tcp"
  18. "v2ray.com/core/testing/servers/udp"
  19. tlsgen "v2ray.com/core/testing/tls"
  20. "v2ray.com/core/transport/internet"
  21. "v2ray.com/core/transport/internet/tls"
  22. "v2ray.com/core/transport/internet/websocket"
  23. . "v2ray.com/ext/assert"
  24. )
  25. func TestSimpleTLSConnection(t *testing.T) {
  26. assert := With(t)
  27. tcpServer := tcp.Server{
  28. MsgProcessor: xor,
  29. }
  30. dest, err := tcpServer.Start()
  31. assert(err, IsNil)
  32. defer tcpServer.Close()
  33. userID := protocol.NewID(uuid.New())
  34. serverPort := tcp.PickPort()
  35. serverConfig := &core.Config{
  36. Inbound: []*core.InboundHandlerConfig{
  37. {
  38. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  39. PortRange: net.SinglePortRange(serverPort),
  40. Listen: net.NewIPOrDomain(net.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: []*core.OutboundHandlerConfig{
  62. {
  63. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  64. },
  65. },
  66. }
  67. clientPort := tcp.PickPort()
  68. clientConfig := &core.Config{
  69. Inbound: []*core.InboundHandlerConfig{
  70. {
  71. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  72. PortRange: net.SinglePortRange(clientPort),
  73. Listen: net.NewIPOrDomain(net.LocalHostIP),
  74. }),
  75. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  76. Address: net.NewIPOrDomain(dest.Address),
  77. Port: uint32(dest.Port),
  78. NetworkList: &net.NetworkList{
  79. Network: []net.Network{net.Network_TCP},
  80. },
  81. }),
  82. },
  83. },
  84. Outbound: []*core.OutboundHandlerConfig{
  85. {
  86. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  87. Receiver: []*protocol.ServerEndpoint{
  88. {
  89. Address: net.NewIPOrDomain(net.LocalHostIP),
  90. Port: uint32(serverPort),
  91. User: []*protocol.User{
  92. {
  93. Account: serial.ToTypedMessage(&vmess.Account{
  94. Id: userID.String(),
  95. }),
  96. },
  97. },
  98. },
  99. },
  100. }),
  101. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  102. StreamSettings: &internet.StreamConfig{
  103. SecurityType: serial.GetMessageType(&tls.Config{}),
  104. SecuritySettings: []*serial.TypedMessage{
  105. serial.ToTypedMessage(&tls.Config{
  106. AllowInsecure: true,
  107. }),
  108. },
  109. },
  110. }),
  111. },
  112. },
  113. }
  114. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  115. assert(err, IsNil)
  116. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  117. IP: []byte{127, 0, 0, 1},
  118. Port: int(clientPort),
  119. })
  120. assert(err, IsNil)
  121. payload := "dokodemo request."
  122. nBytes, err := conn.Write([]byte(payload))
  123. assert(err, IsNil)
  124. assert(nBytes, Equals, len(payload))
  125. response := readFrom(conn, time.Second*2, len(payload))
  126. assert(response, Equals, xor([]byte(payload)))
  127. assert(conn.Close(), IsNil)
  128. CloseAllServers(servers)
  129. }
  130. func TestTLSOverKCP(t *testing.T) {
  131. assert := With(t)
  132. tcpServer := tcp.Server{
  133. MsgProcessor: xor,
  134. }
  135. dest, err := tcpServer.Start()
  136. assert(err, IsNil)
  137. defer tcpServer.Close()
  138. userID := protocol.NewID(uuid.New())
  139. serverPort := udp.PickPort()
  140. serverConfig := &core.Config{
  141. Inbound: []*core.InboundHandlerConfig{
  142. {
  143. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  144. PortRange: net.SinglePortRange(serverPort),
  145. Listen: net.NewIPOrDomain(net.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: []*core.OutboundHandlerConfig{
  168. {
  169. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  170. },
  171. },
  172. }
  173. clientPort := tcp.PickPort()
  174. clientConfig := &core.Config{
  175. Inbound: []*core.InboundHandlerConfig{
  176. {
  177. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  178. PortRange: net.SinglePortRange(clientPort),
  179. Listen: net.NewIPOrDomain(net.LocalHostIP),
  180. }),
  181. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  182. Address: net.NewIPOrDomain(dest.Address),
  183. Port: uint32(dest.Port),
  184. NetworkList: &net.NetworkList{
  185. Network: []net.Network{net.Network_TCP},
  186. },
  187. }),
  188. },
  189. },
  190. Outbound: []*core.OutboundHandlerConfig{
  191. {
  192. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  193. Receiver: []*protocol.ServerEndpoint{
  194. {
  195. Address: net.NewIPOrDomain(net.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. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  222. assert(err, IsNil)
  223. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  224. IP: []byte{127, 0, 0, 1},
  225. Port: int(clientPort),
  226. })
  227. assert(err, IsNil)
  228. payload := "dokodemo request."
  229. nBytes, err := conn.Write([]byte(payload))
  230. assert(err, IsNil)
  231. assert(nBytes, Equals, len(payload))
  232. response := readFrom(conn, time.Second*2, len(payload))
  233. assert(response, Equals, xor([]byte(payload)))
  234. assert(conn.Close(), IsNil)
  235. CloseAllServers(servers)
  236. }
  237. func TestTLSOverWebSocket(t *testing.T) {
  238. assert := With(t)
  239. tcpServer := tcp.Server{
  240. MsgProcessor: xor,
  241. }
  242. dest, err := tcpServer.Start()
  243. assert(err, IsNil)
  244. defer tcpServer.Close()
  245. userID := protocol.NewID(uuid.New())
  246. serverPort := tcp.PickPort()
  247. serverConfig := &core.Config{
  248. Inbound: []*core.InboundHandlerConfig{
  249. {
  250. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  251. PortRange: net.SinglePortRange(serverPort),
  252. Listen: net.NewIPOrDomain(net.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: []*core.OutboundHandlerConfig{
  275. {
  276. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  277. },
  278. },
  279. }
  280. clientPort := tcp.PickPort()
  281. clientConfig := &core.Config{
  282. Inbound: []*core.InboundHandlerConfig{
  283. {
  284. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  285. PortRange: net.SinglePortRange(clientPort),
  286. Listen: net.NewIPOrDomain(net.LocalHostIP),
  287. }),
  288. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  289. Address: net.NewIPOrDomain(dest.Address),
  290. Port: uint32(dest.Port),
  291. NetworkList: &net.NetworkList{
  292. Network: []net.Network{net.Network_TCP},
  293. },
  294. }),
  295. },
  296. },
  297. Outbound: []*core.OutboundHandlerConfig{
  298. {
  299. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  300. Receiver: []*protocol.ServerEndpoint{
  301. {
  302. Address: net.NewIPOrDomain(net.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. },
  322. },
  323. SecurityType: serial.GetMessageType(&tls.Config{}),
  324. SecuritySettings: []*serial.TypedMessage{
  325. serial.ToTypedMessage(&tls.Config{
  326. AllowInsecure: true,
  327. }),
  328. },
  329. },
  330. }),
  331. },
  332. },
  333. }
  334. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  335. assert(err, IsNil)
  336. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  337. IP: []byte{127, 0, 0, 1},
  338. Port: int(clientPort),
  339. })
  340. assert(err, IsNil)
  341. payload := make([]byte, 10240*1024)
  342. rand.Read(payload)
  343. nBytes, err := conn.Write([]byte(payload))
  344. assert(err, IsNil)
  345. assert(nBytes, Equals, len(payload))
  346. response := readFrom(conn, time.Second*20, len(payload))
  347. assert(response, Equals, xor([]byte(payload)))
  348. assert(conn.Close(), IsNil)
  349. CloseAllServers(servers)
  350. }