reverse_test.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. package scenarios
  2. import (
  3. "crypto/rand"
  4. "testing"
  5. "time"
  6. "v2ray.com/core/app/reverse"
  7. "v2ray.com/core/app/router"
  8. "v2ray.com/core"
  9. "v2ray.com/core/app/proxyman"
  10. "v2ray.com/core/common"
  11. "v2ray.com/core/common/compare"
  12. "v2ray.com/core/common/net"
  13. "v2ray.com/core/common/protocol"
  14. "v2ray.com/core/common/serial"
  15. "v2ray.com/core/common/uuid"
  16. "v2ray.com/core/proxy/blackhole"
  17. "v2ray.com/core/proxy/dokodemo"
  18. "v2ray.com/core/proxy/freedom"
  19. "v2ray.com/core/proxy/vmess"
  20. "v2ray.com/core/proxy/vmess/inbound"
  21. "v2ray.com/core/proxy/vmess/outbound"
  22. "v2ray.com/core/testing/servers/tcp"
  23. )
  24. func TestReverseProxy(t *testing.T) {
  25. tcpServer := tcp.Server{
  26. MsgProcessor: xor,
  27. }
  28. dest, err := tcpServer.Start()
  29. common.Must(err)
  30. defer tcpServer.Close()
  31. userID := protocol.NewID(uuid.New())
  32. externalPort := tcp.PickPort()
  33. reversePort := tcp.PickPort()
  34. serverConfig := &core.Config{
  35. App: []*serial.TypedMessage{
  36. serial.ToTypedMessage(&reverse.Config{
  37. PortalConfig: []*reverse.PortalConfig{
  38. {
  39. Tag: "portal",
  40. Domain: "test.v2ray.com",
  41. },
  42. },
  43. }),
  44. serial.ToTypedMessage(&router.Config{
  45. Rule: []*router.RoutingRule{
  46. {
  47. Domain: []*router.Domain{
  48. {Type: router.Domain_Full, Value: "test.v2ray.com"},
  49. },
  50. Tag: "portal",
  51. },
  52. {
  53. InboundTag: []string{"external"},
  54. Tag: "portal",
  55. },
  56. },
  57. }),
  58. },
  59. Inbound: []*core.InboundHandlerConfig{
  60. {
  61. Tag: "external",
  62. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  63. PortRange: net.SinglePortRange(externalPort),
  64. Listen: net.NewIPOrDomain(net.LocalHostIP),
  65. }),
  66. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  67. Address: net.NewIPOrDomain(dest.Address),
  68. Port: uint32(dest.Port),
  69. NetworkList: &net.NetworkList{
  70. Network: []net.Network{net.Network_TCP},
  71. },
  72. }),
  73. },
  74. {
  75. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  76. PortRange: net.SinglePortRange(reversePort),
  77. Listen: net.NewIPOrDomain(net.LocalHostIP),
  78. }),
  79. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  80. User: []*protocol.User{
  81. {
  82. Account: serial.ToTypedMessage(&vmess.Account{
  83. Id: userID.String(),
  84. AlterId: 64,
  85. }),
  86. },
  87. },
  88. }),
  89. },
  90. },
  91. Outbound: []*core.OutboundHandlerConfig{
  92. {
  93. ProxySettings: serial.ToTypedMessage(&blackhole.Config{}),
  94. },
  95. },
  96. }
  97. clientPort := tcp.PickPort()
  98. clientConfig := &core.Config{
  99. App: []*serial.TypedMessage{
  100. serial.ToTypedMessage(&reverse.Config{
  101. BridgeConfig: []*reverse.BridgeConfig{
  102. {
  103. Tag: "bridge",
  104. Domain: "test.v2ray.com",
  105. },
  106. },
  107. }),
  108. serial.ToTypedMessage(&router.Config{
  109. Rule: []*router.RoutingRule{
  110. {
  111. Domain: []*router.Domain{
  112. {Type: router.Domain_Full, Value: "test.v2ray.com"},
  113. },
  114. Tag: "reverse",
  115. },
  116. {
  117. InboundTag: []string{"bridge"},
  118. Tag: "freedom",
  119. },
  120. },
  121. }),
  122. },
  123. Inbound: []*core.InboundHandlerConfig{
  124. {
  125. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  126. PortRange: net.SinglePortRange(clientPort),
  127. Listen: net.NewIPOrDomain(net.LocalHostIP),
  128. }),
  129. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  130. Address: net.NewIPOrDomain(dest.Address),
  131. Port: uint32(dest.Port),
  132. NetworkList: &net.NetworkList{
  133. Network: []net.Network{net.Network_TCP},
  134. },
  135. }),
  136. },
  137. },
  138. Outbound: []*core.OutboundHandlerConfig{
  139. {
  140. Tag: "freedom",
  141. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  142. },
  143. {
  144. Tag: "reverse",
  145. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  146. Receiver: []*protocol.ServerEndpoint{
  147. {
  148. Address: net.NewIPOrDomain(net.LocalHostIP),
  149. Port: uint32(reversePort),
  150. User: []*protocol.User{
  151. {
  152. Account: serial.ToTypedMessage(&vmess.Account{
  153. Id: userID.String(),
  154. AlterId: 64,
  155. SecuritySettings: &protocol.SecurityConfig{
  156. Type: protocol.SecurityType_AES128_GCM,
  157. },
  158. }),
  159. },
  160. },
  161. },
  162. },
  163. }),
  164. },
  165. },
  166. }
  167. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  168. common.Must(err)
  169. defer CloseAllServers(servers)
  170. //var wg sync.WaitGroup
  171. //wg.Add(10)
  172. //for i := 0; i < 10; i++ {
  173. //go func() {
  174. //defer wg.Done()
  175. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  176. IP: []byte{127, 0, 0, 1},
  177. Port: int(externalPort),
  178. })
  179. common.Must(err)
  180. defer conn.Close()
  181. payload := make([]byte, 10240*1024)
  182. rand.Read(payload)
  183. nBytes, err := conn.Write([]byte(payload))
  184. common.Must(err)
  185. if nBytes != len(payload) {
  186. t.Error("only part of payload is written: ", nBytes)
  187. }
  188. response := readFrom(conn, time.Second*20, 10240*1024)
  189. if err := compare.BytesEqualWithDetail(response, xor([]byte(payload))); err != nil {
  190. t.Error(err)
  191. }
  192. //}()
  193. //}
  194. //wg.Wait()
  195. }