feature_test.go 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  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 TestBlackhole(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. tcpServer2 := tcp.Server{
  219. MsgProcessor: xor,
  220. }
  221. dest2, err := tcpServer2.Start()
  222. assert.Error(err).IsNil()
  223. defer tcpServer2.Close()
  224. serverPort := pickPort()
  225. serverPort2 := pickPort()
  226. serverConfig := &core.Config{
  227. Inbound: []*core.InboundConnectionConfig{
  228. {
  229. PortRange: v2net.SinglePortRange(serverPort),
  230. ListenOn: v2net.NewIPOrDomain(v2net.LocalHostIP),
  231. Settings: serial.ToTypedMessage(&dokodemo.Config{
  232. Address: v2net.NewIPOrDomain(dest.Address),
  233. Port: uint32(dest.Port),
  234. NetworkList: &v2net.NetworkList{
  235. Network: []v2net.Network{v2net.Network_TCP},
  236. },
  237. }),
  238. },
  239. {
  240. PortRange: v2net.SinglePortRange(serverPort2),
  241. ListenOn: v2net.NewIPOrDomain(v2net.LocalHostIP),
  242. Settings: serial.ToTypedMessage(&dokodemo.Config{
  243. Address: v2net.NewIPOrDomain(dest2.Address),
  244. Port: uint32(dest2.Port),
  245. NetworkList: &v2net.NetworkList{
  246. Network: []v2net.Network{v2net.Network_TCP},
  247. },
  248. }),
  249. },
  250. },
  251. Outbound: []*core.OutboundConnectionConfig{
  252. {
  253. Tag: "direct",
  254. Settings: serial.ToTypedMessage(&freedom.Config{}),
  255. },
  256. {
  257. Tag: "blocked",
  258. Settings: serial.ToTypedMessage(&blackhole.Config{}),
  259. },
  260. },
  261. App: []*serial.TypedMessage{
  262. serial.ToTypedMessage(&router.Config{
  263. Rule: []*router.RoutingRule{
  264. {
  265. Tag: "blocked",
  266. PortRange: v2net.SinglePortRange(dest2.Port),
  267. },
  268. },
  269. }),
  270. },
  271. }
  272. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  273. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  274. IP: []byte{127, 0, 0, 1},
  275. Port: int(serverPort2),
  276. })
  277. assert.Error(err).IsNil()
  278. payload := "dokodemo request."
  279. {
  280. nBytes, err := conn.Write([]byte(payload))
  281. assert.Error(err).IsNil()
  282. assert.Int(nBytes).Equals(len(payload))
  283. }
  284. {
  285. response := make([]byte, 1024)
  286. _, err := conn.Read(response)
  287. assert.Error(err).IsNotNil()
  288. }
  289. assert.Error(conn.Close()).IsNil()
  290. CloseAllServers()
  291. }