v2ray.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. package core
  2. import (
  3. "context"
  4. "v2ray.com/core/app"
  5. "v2ray.com/core/app/dispatcher"
  6. "v2ray.com/core/app/dns"
  7. proxydialer "v2ray.com/core/app/proxy"
  8. "v2ray.com/core/app/proxyman"
  9. "v2ray.com/core/common"
  10. "v2ray.com/core/common/log"
  11. v2net "v2ray.com/core/common/net"
  12. "v2ray.com/core/common/serial"
  13. "v2ray.com/core/proxy"
  14. )
  15. // Point shell of V2Ray.
  16. type Point struct {
  17. inboundHandlers []InboundDetourHandler
  18. taggedInboundHandlers map[string]InboundDetourHandler
  19. outboundHandlers []proxy.OutboundHandler
  20. taggedOutboundHandlers map[string]proxy.OutboundHandler
  21. space app.Space
  22. }
  23. // NewPoint returns a new Point server based on given configuration.
  24. // The server is not started at this point.
  25. func NewPoint(pConfig *Config) (*Point, error) {
  26. var vpoint = new(Point)
  27. if err := pConfig.Transport.Apply(); err != nil {
  28. return nil, err
  29. }
  30. if err := pConfig.Log.Apply(); err != nil {
  31. return nil, err
  32. }
  33. space := app.NewSpace()
  34. ctx := app.ContextWithSpace(context.Background(), space)
  35. vpoint.space = space
  36. vpoint.space.AddAppLegacy(serial.GetMessageType((*proxyman.InboundConfig)(nil)), vpoint)
  37. outboundHandlerManager := proxyman.OutboundHandlerManagerFromSpace(space)
  38. if outboundHandlerManager == nil {
  39. if err := space.AddApp(new(proxyman.OutboundConfig)); err != nil {
  40. return nil, err
  41. }
  42. outboundHandlerManager = proxyman.OutboundHandlerManagerFromSpace(space)
  43. }
  44. proxyDialer := proxydialer.OutboundProxyFromSpace(space)
  45. if proxyDialer == nil {
  46. space.AddApp(new(proxydialer.Config))
  47. proxyDialer = proxydialer.OutboundProxyFromSpace(space)
  48. }
  49. proxyDialer.RegisterDialer()
  50. for _, app := range pConfig.App {
  51. settings, err := app.GetInstance()
  52. if err != nil {
  53. return nil, err
  54. }
  55. if err := space.AddApp(settings); err != nil {
  56. return nil, err
  57. }
  58. }
  59. dnsServer := dns.FromSpace(space)
  60. if dnsServer == nil {
  61. dnsConfig := &dns.Config{
  62. NameServers: []*v2net.Endpoint{{
  63. Address: v2net.NewIPOrDomain(v2net.LocalHostDomain),
  64. }},
  65. }
  66. if err := space.AddApp(dnsConfig); err != nil {
  67. return nil, err
  68. }
  69. }
  70. disp := dispatcher.FromSpace(space)
  71. if disp == nil {
  72. dispatcherConfig := new(dispatcher.Config)
  73. if err := vpoint.space.AddApp(dispatcherConfig); err != nil {
  74. return nil, err
  75. }
  76. disp = dispatcher.FromSpace(space)
  77. }
  78. vpoint.inboundHandlers = make([]InboundDetourHandler, 0, 8)
  79. vpoint.taggedInboundHandlers = make(map[string]InboundDetourHandler)
  80. for _, inbound := range pConfig.Inbound {
  81. allocConfig := inbound.GetAllocationStrategyValue()
  82. var inboundHandler InboundDetourHandler
  83. switch allocConfig.Type {
  84. case AllocationStrategy_Always:
  85. dh, err := NewInboundDetourHandlerAlways(ctx, inbound)
  86. if err != nil {
  87. log.Error("V2Ray: Failed to create detour handler: ", err)
  88. return nil, common.ErrBadConfiguration
  89. }
  90. inboundHandler = dh
  91. case AllocationStrategy_Random:
  92. dh, err := NewInboundDetourHandlerDynamic(ctx, inbound)
  93. if err != nil {
  94. log.Error("V2Ray: Failed to create detour handler: ", err)
  95. return nil, common.ErrBadConfiguration
  96. }
  97. inboundHandler = dh
  98. default:
  99. log.Error("V2Ray: Unknown allocation strategy: ", allocConfig.Type)
  100. return nil, common.ErrBadConfiguration
  101. }
  102. vpoint.inboundHandlers = append(vpoint.inboundHandlers, inboundHandler)
  103. if len(inbound.Tag) > 0 {
  104. vpoint.taggedInboundHandlers[inbound.Tag] = inboundHandler
  105. }
  106. }
  107. vpoint.outboundHandlers = make([]proxy.OutboundHandler, 0, 8)
  108. vpoint.taggedOutboundHandlers = make(map[string]proxy.OutboundHandler)
  109. for idx, outbound := range pConfig.Outbound {
  110. outboundSettings, err := outbound.GetTypedSettings()
  111. if err != nil {
  112. return nil, err
  113. }
  114. outboundHandler, err := proxy.CreateOutboundHandler(proxy.ContextWithOutboundMeta(ctx, &proxy.OutboundHandlerMeta{
  115. Tag: outbound.Tag,
  116. Address: outbound.GetSendThroughValue(),
  117. StreamSettings: outbound.StreamSettings,
  118. ProxySettings: outbound.ProxySettings,
  119. }), outboundSettings)
  120. if err != nil {
  121. log.Error("V2Ray: Failed to create detour outbound connection handler: ", err)
  122. return nil, err
  123. }
  124. if idx == 0 {
  125. outboundHandlerManager.SetDefaultHandler(outboundHandler)
  126. }
  127. if len(outbound.Tag) > 0 {
  128. outboundHandlerManager.SetHandler(outbound.Tag, outboundHandler)
  129. vpoint.taggedOutboundHandlers[outbound.Tag] = outboundHandler
  130. }
  131. vpoint.outboundHandlers = append(vpoint.outboundHandlers, outboundHandler)
  132. }
  133. if err := vpoint.space.Initialize(); err != nil {
  134. return nil, err
  135. }
  136. return vpoint, nil
  137. }
  138. func (v *Point) Close() {
  139. for _, inbound := range v.inboundHandlers {
  140. inbound.Close()
  141. }
  142. }
  143. // Start starts the Point server, and return any error during the process.
  144. // In the case of any errors, the state of the server is unpredicatable.
  145. func (v *Point) Start() error {
  146. for _, inbound := range v.inboundHandlers {
  147. err := inbound.Start()
  148. if err != nil {
  149. return err
  150. }
  151. }
  152. log.Warning("V2Ray started.")
  153. return nil
  154. }
  155. func (v *Point) GetHandler(tag string) (proxy.InboundHandler, int) {
  156. handler, found := v.taggedInboundHandlers[tag]
  157. if !found {
  158. log.Warning("V2Ray: Unable to find an inbound handler with tag: ", tag)
  159. return nil, 0
  160. }
  161. return handler.GetConnectionHandler()
  162. }
  163. func (v *Point) Release() {
  164. }