feature_test.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475
  1. package scenarios
  2. import (
  3. "net"
  4. "testing"
  5. "v2ray.com/core"
  6. "v2ray.com/core/app/router"
  7. v2net "v2ray.com/core/common/net"
  8. "v2ray.com/core/common/protocol"
  9. "v2ray.com/core/common/serial"
  10. "v2ray.com/core/common/uuid"
  11. "v2ray.com/core/proxy/blackhole"
  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. "v2ray.com/core/transport/internet"
  20. )
  21. func TestPassiveConnection(t *testing.T) {
  22. assert := assert.On(t)
  23. tcpServer := tcp.Server{
  24. MsgProcessor: xor,
  25. SendFirst: []byte("send first"),
  26. }
  27. dest, err := tcpServer.Start()
  28. assert.Error(err).IsNil()
  29. defer tcpServer.Close()
  30. serverPort := pickPort()
  31. serverConfig := &core.Config{
  32. Inbound: []*core.InboundConnectionConfig{
  33. {
  34. PortRange: v2net.SinglePortRange(serverPort),
  35. ListenOn: v2net.NewIPOrDomain(v2net.LocalHostIP),
  36. AllowPassiveConnection: true,
  37. Settings: serial.ToTypedMessage(&dokodemo.Config{
  38. Address: v2net.NewIPOrDomain(dest.Address),
  39. Port: uint32(dest.Port),
  40. NetworkList: &v2net.NetworkList{
  41. Network: []v2net.Network{v2net.Network_TCP},
  42. },
  43. }),
  44. },
  45. },
  46. Outbound: []*core.OutboundConnectionConfig{
  47. {
  48. Settings: serial.ToTypedMessage(&freedom.Config{}),
  49. },
  50. },
  51. }
  52. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  53. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  54. IP: []byte{127, 0, 0, 1},
  55. Port: int(serverPort),
  56. })
  57. assert.Error(err).IsNil()
  58. {
  59. response := make([]byte, 1024)
  60. nBytes, err := conn.Read(response)
  61. assert.Error(err).IsNil()
  62. assert.String(string(response[:nBytes])).Equals("send first")
  63. }
  64. payload := "dokodemo request."
  65. {
  66. nBytes, err := conn.Write([]byte(payload))
  67. assert.Error(err).IsNil()
  68. assert.Int(nBytes).Equals(len(payload))
  69. }
  70. {
  71. response := make([]byte, 1024)
  72. nBytes, err := conn.Read(response)
  73. assert.Error(err).IsNil()
  74. assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload)))
  75. }
  76. assert.Error(conn.Close()).IsNil()
  77. CloseAllServers()
  78. }
  79. func TestProxy(t *testing.T) {
  80. assert := assert.On(t)
  81. tcpServer := tcp.Server{
  82. MsgProcessor: xor,
  83. }
  84. dest, err := tcpServer.Start()
  85. assert.Error(err).IsNil()
  86. defer tcpServer.Close()
  87. serverUserID := protocol.NewID(uuid.New())
  88. serverPort := pickPort()
  89. serverConfig := &core.Config{
  90. Inbound: []*core.InboundConnectionConfig{
  91. {
  92. PortRange: v2net.SinglePortRange(serverPort),
  93. ListenOn: v2net.NewIPOrDomain(v2net.LocalHostIP),
  94. Settings: serial.ToTypedMessage(&inbound.Config{
  95. User: []*protocol.User{
  96. {
  97. Account: serial.ToTypedMessage(&vmess.Account{
  98. Id: serverUserID.String(),
  99. }),
  100. },
  101. },
  102. }),
  103. },
  104. },
  105. Outbound: []*core.OutboundConnectionConfig{
  106. {
  107. Settings: serial.ToTypedMessage(&freedom.Config{}),
  108. },
  109. },
  110. }
  111. proxyUserID := protocol.NewID(uuid.New())
  112. proxyPort := pickPort()
  113. proxyConfig := &core.Config{
  114. Inbound: []*core.InboundConnectionConfig{
  115. {
  116. PortRange: v2net.SinglePortRange(proxyPort),
  117. ListenOn: v2net.NewIPOrDomain(v2net.LocalHostIP),
  118. Settings: serial.ToTypedMessage(&inbound.Config{
  119. User: []*protocol.User{
  120. {
  121. Account: serial.ToTypedMessage(&vmess.Account{
  122. Id: proxyUserID.String(),
  123. }),
  124. },
  125. },
  126. }),
  127. },
  128. },
  129. Outbound: []*core.OutboundConnectionConfig{
  130. {
  131. Settings: serial.ToTypedMessage(&freedom.Config{}),
  132. },
  133. },
  134. }
  135. clientPort := pickPort()
  136. clientConfig := &core.Config{
  137. Inbound: []*core.InboundConnectionConfig{
  138. {
  139. PortRange: v2net.SinglePortRange(clientPort),
  140. ListenOn: v2net.NewIPOrDomain(v2net.LocalHostIP),
  141. Settings: serial.ToTypedMessage(&dokodemo.Config{
  142. Address: v2net.NewIPOrDomain(dest.Address),
  143. Port: uint32(dest.Port),
  144. NetworkList: &v2net.NetworkList{
  145. Network: []v2net.Network{v2net.Network_TCP},
  146. },
  147. }),
  148. },
  149. },
  150. Outbound: []*core.OutboundConnectionConfig{
  151. {
  152. Settings: serial.ToTypedMessage(&outbound.Config{
  153. Receiver: []*protocol.ServerEndpoint{
  154. {
  155. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  156. Port: uint32(serverPort),
  157. User: []*protocol.User{
  158. {
  159. Account: serial.ToTypedMessage(&vmess.Account{
  160. Id: serverUserID.String(),
  161. }),
  162. },
  163. },
  164. },
  165. },
  166. }),
  167. ProxySettings: &internet.ProxyConfig{
  168. Tag: "proxy",
  169. },
  170. },
  171. {
  172. Tag: "proxy",
  173. Settings: serial.ToTypedMessage(&outbound.Config{
  174. Receiver: []*protocol.ServerEndpoint{
  175. {
  176. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  177. Port: uint32(proxyPort),
  178. User: []*protocol.User{
  179. {
  180. Account: serial.ToTypedMessage(&vmess.Account{
  181. Id: proxyUserID.String(),
  182. }),
  183. },
  184. },
  185. },
  186. },
  187. }),
  188. },
  189. },
  190. }
  191. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  192. assert.Error(InitializeServerConfig(proxyConfig)).IsNil()
  193. assert.Error(InitializeServerConfig(clientConfig)).IsNil()
  194. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  195. IP: []byte{127, 0, 0, 1},
  196. Port: int(clientPort),
  197. })
  198. assert.Error(err).IsNil()
  199. payload := "dokodemo request."
  200. nBytes, err := conn.Write([]byte(payload))
  201. assert.Error(err).IsNil()
  202. assert.Int(nBytes).Equals(len(payload))
  203. response := make([]byte, 1024)
  204. nBytes, err = conn.Read(response)
  205. assert.Error(err).IsNil()
  206. assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload)))
  207. assert.Error(conn.Close()).IsNil()
  208. CloseAllServers()
  209. }
  210. func TestProxyOverKCP(t *testing.T) {
  211. assert := assert.On(t)
  212. tcpServer := tcp.Server{
  213. MsgProcessor: xor,
  214. }
  215. dest, err := tcpServer.Start()
  216. assert.Error(err).IsNil()
  217. defer tcpServer.Close()
  218. serverUserID := protocol.NewID(uuid.New())
  219. serverPort := pickPort()
  220. serverConfig := &core.Config{
  221. Inbound: []*core.InboundConnectionConfig{
  222. {
  223. PortRange: v2net.SinglePortRange(serverPort),
  224. ListenOn: v2net.NewIPOrDomain(v2net.LocalHostIP),
  225. Settings: serial.ToTypedMessage(&inbound.Config{
  226. User: []*protocol.User{
  227. {
  228. Account: serial.ToTypedMessage(&vmess.Account{
  229. Id: serverUserID.String(),
  230. }),
  231. },
  232. },
  233. }),
  234. StreamSettings: &internet.StreamConfig{
  235. Protocol: internet.TransportProtocol_MKCP,
  236. },
  237. },
  238. },
  239. Outbound: []*core.OutboundConnectionConfig{
  240. {
  241. Settings: serial.ToTypedMessage(&freedom.Config{}),
  242. },
  243. },
  244. }
  245. proxyUserID := protocol.NewID(uuid.New())
  246. proxyPort := pickPort()
  247. proxyConfig := &core.Config{
  248. Inbound: []*core.InboundConnectionConfig{
  249. {
  250. PortRange: v2net.SinglePortRange(proxyPort),
  251. ListenOn: v2net.NewIPOrDomain(v2net.LocalHostIP),
  252. Settings: serial.ToTypedMessage(&inbound.Config{
  253. User: []*protocol.User{
  254. {
  255. Account: serial.ToTypedMessage(&vmess.Account{
  256. Id: proxyUserID.String(),
  257. }),
  258. },
  259. },
  260. }),
  261. },
  262. },
  263. Outbound: []*core.OutboundConnectionConfig{
  264. {
  265. Settings: serial.ToTypedMessage(&freedom.Config{}),
  266. StreamSettings: &internet.StreamConfig{
  267. Protocol: internet.TransportProtocol_MKCP,
  268. },
  269. },
  270. },
  271. }
  272. clientPort := pickPort()
  273. clientConfig := &core.Config{
  274. Inbound: []*core.InboundConnectionConfig{
  275. {
  276. PortRange: v2net.SinglePortRange(clientPort),
  277. ListenOn: v2net.NewIPOrDomain(v2net.LocalHostIP),
  278. Settings: serial.ToTypedMessage(&dokodemo.Config{
  279. Address: v2net.NewIPOrDomain(dest.Address),
  280. Port: uint32(dest.Port),
  281. NetworkList: &v2net.NetworkList{
  282. Network: []v2net.Network{v2net.Network_TCP},
  283. },
  284. }),
  285. },
  286. },
  287. Outbound: []*core.OutboundConnectionConfig{
  288. {
  289. Settings: serial.ToTypedMessage(&outbound.Config{
  290. Receiver: []*protocol.ServerEndpoint{
  291. {
  292. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  293. Port: uint32(serverPort),
  294. User: []*protocol.User{
  295. {
  296. Account: serial.ToTypedMessage(&vmess.Account{
  297. Id: serverUserID.String(),
  298. }),
  299. },
  300. },
  301. },
  302. },
  303. }),
  304. ProxySettings: &internet.ProxyConfig{
  305. Tag: "proxy",
  306. },
  307. StreamSettings: &internet.StreamConfig{
  308. Protocol: internet.TransportProtocol_MKCP,
  309. },
  310. },
  311. {
  312. Tag: "proxy",
  313. Settings: serial.ToTypedMessage(&outbound.Config{
  314. Receiver: []*protocol.ServerEndpoint{
  315. {
  316. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  317. Port: uint32(proxyPort),
  318. User: []*protocol.User{
  319. {
  320. Account: serial.ToTypedMessage(&vmess.Account{
  321. Id: proxyUserID.String(),
  322. }),
  323. },
  324. },
  325. },
  326. },
  327. }),
  328. },
  329. },
  330. }
  331. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  332. assert.Error(InitializeServerConfig(proxyConfig)).IsNil()
  333. assert.Error(InitializeServerConfig(clientConfig)).IsNil()
  334. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  335. IP: []byte{127, 0, 0, 1},
  336. Port: int(clientPort),
  337. })
  338. assert.Error(err).IsNil()
  339. payload := "dokodemo request."
  340. nBytes, err := conn.Write([]byte(payload))
  341. assert.Error(err).IsNil()
  342. assert.Int(nBytes).Equals(len(payload))
  343. response := make([]byte, 1024)
  344. nBytes, err = conn.Read(response)
  345. assert.Error(err).IsNil()
  346. assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload)))
  347. assert.Error(conn.Close()).IsNil()
  348. CloseAllServers()
  349. }
  350. func TestBlackhole(t *testing.T) {
  351. assert := assert.On(t)
  352. tcpServer := tcp.Server{
  353. MsgProcessor: xor,
  354. }
  355. dest, err := tcpServer.Start()
  356. assert.Error(err).IsNil()
  357. defer tcpServer.Close()
  358. tcpServer2 := tcp.Server{
  359. MsgProcessor: xor,
  360. }
  361. dest2, err := tcpServer2.Start()
  362. assert.Error(err).IsNil()
  363. defer tcpServer2.Close()
  364. serverPort := pickPort()
  365. serverPort2 := pickPort()
  366. serverConfig := &core.Config{
  367. Inbound: []*core.InboundConnectionConfig{
  368. {
  369. PortRange: v2net.SinglePortRange(serverPort),
  370. ListenOn: v2net.NewIPOrDomain(v2net.LocalHostIP),
  371. Settings: serial.ToTypedMessage(&dokodemo.Config{
  372. Address: v2net.NewIPOrDomain(dest.Address),
  373. Port: uint32(dest.Port),
  374. NetworkList: &v2net.NetworkList{
  375. Network: []v2net.Network{v2net.Network_TCP},
  376. },
  377. }),
  378. },
  379. {
  380. PortRange: v2net.SinglePortRange(serverPort2),
  381. ListenOn: v2net.NewIPOrDomain(v2net.LocalHostIP),
  382. Settings: serial.ToTypedMessage(&dokodemo.Config{
  383. Address: v2net.NewIPOrDomain(dest2.Address),
  384. Port: uint32(dest2.Port),
  385. NetworkList: &v2net.NetworkList{
  386. Network: []v2net.Network{v2net.Network_TCP},
  387. },
  388. }),
  389. },
  390. },
  391. Outbound: []*core.OutboundConnectionConfig{
  392. {
  393. Tag: "direct",
  394. Settings: serial.ToTypedMessage(&freedom.Config{}),
  395. },
  396. {
  397. Tag: "blocked",
  398. Settings: serial.ToTypedMessage(&blackhole.Config{}),
  399. },
  400. },
  401. App: []*serial.TypedMessage{
  402. serial.ToTypedMessage(&router.Config{
  403. Rule: []*router.RoutingRule{
  404. {
  405. Tag: "blocked",
  406. PortRange: v2net.SinglePortRange(dest2.Port),
  407. },
  408. },
  409. }),
  410. },
  411. }
  412. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  413. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  414. IP: []byte{127, 0, 0, 1},
  415. Port: int(serverPort2),
  416. })
  417. assert.Error(err).IsNil()
  418. payload := "dokodemo request."
  419. {
  420. nBytes, err := conn.Write([]byte(payload))
  421. assert.Error(err).IsNil()
  422. assert.Int(nBytes).Equals(len(payload))
  423. }
  424. {
  425. response := make([]byte, 1024)
  426. _, err := conn.Read(response)
  427. assert.Error(err).IsNotNil()
  428. }
  429. assert.Error(conn.Close()).IsNil()
  430. CloseAllServers()
  431. }