tls_test.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. package scenarios
  2. import (
  3. "net"
  4. "testing"
  5. "time"
  6. "v2ray.com/core"
  7. "v2ray.com/core/app/proxyman"
  8. v2net "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/assert"
  18. "v2ray.com/core/testing/servers/tcp"
  19. tlsgen "v2ray.com/core/testing/tls"
  20. "v2ray.com/core/transport/internet"
  21. "v2ray.com/core/transport/internet/tls"
  22. )
  23. func TestSimpleTLSConnection(t *testing.T) {
  24. assert := assert.On(t)
  25. tcpServer := tcp.Server{
  26. MsgProcessor: xor,
  27. }
  28. dest, err := tcpServer.Start()
  29. assert.Error(err).IsNil()
  30. defer tcpServer.Close()
  31. userID := protocol.NewID(uuid.New())
  32. serverPort := pickPort()
  33. serverConfig := &core.Config{
  34. Inbound: []*proxyman.InboundHandlerConfig{
  35. {
  36. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  37. PortRange: v2net.SinglePortRange(serverPort),
  38. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  39. StreamSettings: &internet.StreamConfig{
  40. SecurityType: serial.GetMessageType(&tls.Config{}),
  41. SecuritySettings: []*serial.TypedMessage{
  42. serial.ToTypedMessage(&tls.Config{
  43. Certificate: []*tls.Certificate{tlsgen.GenerateCertificateForTest()},
  44. }),
  45. },
  46. },
  47. }),
  48. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  49. User: []*protocol.User{
  50. {
  51. Account: serial.ToTypedMessage(&vmess.Account{
  52. Id: userID.String(),
  53. }),
  54. },
  55. },
  56. }),
  57. },
  58. },
  59. Outbound: []*proxyman.OutboundHandlerConfig{
  60. {
  61. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  62. },
  63. },
  64. }
  65. clientPort := pickPort()
  66. clientConfig := &core.Config{
  67. Inbound: []*proxyman.InboundHandlerConfig{
  68. {
  69. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  70. PortRange: v2net.SinglePortRange(clientPort),
  71. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  72. }),
  73. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  74. Address: v2net.NewIPOrDomain(dest.Address),
  75. Port: uint32(dest.Port),
  76. NetworkList: &v2net.NetworkList{
  77. Network: []v2net.Network{v2net.Network_TCP},
  78. },
  79. }),
  80. },
  81. },
  82. Outbound: []*proxyman.OutboundHandlerConfig{
  83. {
  84. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  85. Receiver: []*protocol.ServerEndpoint{
  86. {
  87. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  88. Port: uint32(serverPort),
  89. User: []*protocol.User{
  90. {
  91. Account: serial.ToTypedMessage(&vmess.Account{
  92. Id: userID.String(),
  93. }),
  94. },
  95. },
  96. },
  97. },
  98. }),
  99. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  100. StreamSettings: &internet.StreamConfig{
  101. SecurityType: serial.GetMessageType(&tls.Config{}),
  102. SecuritySettings: []*serial.TypedMessage{
  103. serial.ToTypedMessage(&tls.Config{
  104. AllowInsecure: true,
  105. }),
  106. },
  107. },
  108. }),
  109. },
  110. },
  111. }
  112. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  113. assert.Error(InitializeServerConfig(clientConfig)).IsNil()
  114. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  115. IP: []byte{127, 0, 0, 1},
  116. Port: int(clientPort),
  117. })
  118. assert.Error(err).IsNil()
  119. payload := "dokodemo request."
  120. nBytes, err := conn.Write([]byte(payload))
  121. assert.Error(err).IsNil()
  122. assert.Int(nBytes).Equals(len(payload))
  123. response := readFrom(conn, time.Second*2, len(payload))
  124. assert.Bytes(response).Equals(xor([]byte(payload)))
  125. assert.Error(conn.Close()).IsNil()
  126. CloseAllServers()
  127. }
  128. func TestTLSOverKCP(t *testing.T) {
  129. assert := assert.On(t)
  130. tcpServer := tcp.Server{
  131. MsgProcessor: xor,
  132. }
  133. dest, err := tcpServer.Start()
  134. assert.Error(err).IsNil()
  135. defer tcpServer.Close()
  136. userID := protocol.NewID(uuid.New())
  137. serverPort := pickPort()
  138. serverConfig := &core.Config{
  139. Inbound: []*proxyman.InboundHandlerConfig{
  140. {
  141. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  142. PortRange: v2net.SinglePortRange(serverPort),
  143. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  144. StreamSettings: &internet.StreamConfig{
  145. Protocol: internet.TransportProtocol_MKCP,
  146. SecurityType: serial.GetMessageType(&tls.Config{}),
  147. SecuritySettings: []*serial.TypedMessage{
  148. serial.ToTypedMessage(&tls.Config{
  149. Certificate: []*tls.Certificate{tlsgen.GenerateCertificateForTest()},
  150. }),
  151. },
  152. },
  153. }),
  154. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  155. User: []*protocol.User{
  156. {
  157. Account: serial.ToTypedMessage(&vmess.Account{
  158. Id: userID.String(),
  159. }),
  160. },
  161. },
  162. }),
  163. },
  164. },
  165. Outbound: []*proxyman.OutboundHandlerConfig{
  166. {
  167. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  168. },
  169. },
  170. }
  171. clientPort := pickPort()
  172. clientConfig := &core.Config{
  173. Inbound: []*proxyman.InboundHandlerConfig{
  174. {
  175. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  176. PortRange: v2net.SinglePortRange(clientPort),
  177. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  178. }),
  179. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  180. Address: v2net.NewIPOrDomain(dest.Address),
  181. Port: uint32(dest.Port),
  182. NetworkList: &v2net.NetworkList{
  183. Network: []v2net.Network{v2net.Network_TCP},
  184. },
  185. }),
  186. },
  187. },
  188. Outbound: []*proxyman.OutboundHandlerConfig{
  189. {
  190. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  191. Receiver: []*protocol.ServerEndpoint{
  192. {
  193. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  194. Port: uint32(serverPort),
  195. User: []*protocol.User{
  196. {
  197. Account: serial.ToTypedMessage(&vmess.Account{
  198. Id: userID.String(),
  199. }),
  200. },
  201. },
  202. },
  203. },
  204. }),
  205. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  206. StreamSettings: &internet.StreamConfig{
  207. Protocol: internet.TransportProtocol_MKCP,
  208. SecurityType: serial.GetMessageType(&tls.Config{}),
  209. SecuritySettings: []*serial.TypedMessage{
  210. serial.ToTypedMessage(&tls.Config{
  211. AllowInsecure: true,
  212. }),
  213. },
  214. },
  215. }),
  216. },
  217. },
  218. }
  219. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  220. assert.Error(InitializeServerConfig(clientConfig)).IsNil()
  221. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  222. IP: []byte{127, 0, 0, 1},
  223. Port: int(clientPort),
  224. })
  225. assert.Error(err).IsNil()
  226. payload := "dokodemo request."
  227. nBytes, err := conn.Write([]byte(payload))
  228. assert.Error(err).IsNil()
  229. assert.Int(nBytes).Equals(len(payload))
  230. response := readFrom(conn, time.Second*2, len(payload))
  231. assert.Bytes(response).Equals(xor([]byte(payload)))
  232. assert.Error(conn.Close()).IsNil()
  233. CloseAllServers()
  234. }
  235. func TestTLSConnectionReuse(t *testing.T) {
  236. assert := assert.On(t)
  237. tcpServer := tcp.Server{
  238. MsgProcessor: xor,
  239. }
  240. dest, err := tcpServer.Start()
  241. assert.Error(err).IsNil()
  242. defer tcpServer.Close()
  243. userID := protocol.NewID(uuid.New())
  244. serverPort := pickPort()
  245. serverConfig := &core.Config{
  246. Inbound: []*proxyman.InboundHandlerConfig{
  247. {
  248. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  249. PortRange: v2net.SinglePortRange(serverPort),
  250. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  251. StreamSettings: &internet.StreamConfig{
  252. SecurityType: serial.GetMessageType(&tls.Config{}),
  253. SecuritySettings: []*serial.TypedMessage{
  254. serial.ToTypedMessage(&tls.Config{
  255. Certificate: []*tls.Certificate{tlsgen.GenerateCertificateForTest()},
  256. }),
  257. },
  258. },
  259. }),
  260. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  261. User: []*protocol.User{
  262. {
  263. Account: serial.ToTypedMessage(&vmess.Account{
  264. Id: userID.String(),
  265. }),
  266. },
  267. },
  268. }),
  269. },
  270. },
  271. Outbound: []*proxyman.OutboundHandlerConfig{
  272. {
  273. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  274. },
  275. },
  276. }
  277. clientPort := pickPort()
  278. clientConfig := &core.Config{
  279. Inbound: []*proxyman.InboundHandlerConfig{
  280. {
  281. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  282. PortRange: v2net.SinglePortRange(clientPort),
  283. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  284. }),
  285. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  286. Address: v2net.NewIPOrDomain(dest.Address),
  287. Port: uint32(dest.Port),
  288. NetworkList: &v2net.NetworkList{
  289. Network: []v2net.Network{v2net.Network_TCP},
  290. },
  291. }),
  292. },
  293. },
  294. Outbound: []*proxyman.OutboundHandlerConfig{
  295. {
  296. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  297. Receiver: []*protocol.ServerEndpoint{
  298. {
  299. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  300. Port: uint32(serverPort),
  301. User: []*protocol.User{
  302. {
  303. Account: serial.ToTypedMessage(&vmess.Account{
  304. Id: userID.String(),
  305. }),
  306. },
  307. },
  308. },
  309. },
  310. }),
  311. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  312. StreamSettings: &internet.StreamConfig{
  313. SecurityType: serial.GetMessageType(&tls.Config{}),
  314. SecuritySettings: []*serial.TypedMessage{
  315. serial.ToTypedMessage(&tls.Config{
  316. AllowInsecure: true,
  317. }),
  318. },
  319. },
  320. }),
  321. },
  322. },
  323. }
  324. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  325. assert.Error(InitializeServerConfig(clientConfig)).IsNil()
  326. for i := 0; i < 5; i++ {
  327. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  328. IP: []byte{127, 0, 0, 1},
  329. Port: int(clientPort),
  330. })
  331. assert.Error(err).IsNil()
  332. payload := "dokodemo request."
  333. nBytes, err := conn.Write([]byte(payload))
  334. assert.Error(err).IsNil()
  335. assert.Int(nBytes).Equals(len(payload))
  336. response := readFrom(conn, time.Second*2, len(payload))
  337. assert.Bytes(response).Equals(xor([]byte(payload)))
  338. assert.Error(conn.Close()).IsNil()
  339. }
  340. time.Sleep(time.Second * 10)
  341. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  342. IP: []byte{127, 0, 0, 1},
  343. Port: int(clientPort),
  344. })
  345. assert.Error(err).IsNil()
  346. payload := "dokodemo request."
  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*2, len(payload))
  351. assert.Bytes(response).Equals(xor([]byte(payload)))
  352. assert.Error(conn.Close()).IsNil()
  353. CloseAllServers()
  354. }