inbound.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package v5cfg
  2. import (
  3. "context"
  4. "github.com/golang/protobuf/proto"
  5. core "github.com/v2fly/v2ray-core/v4"
  6. "github.com/v2fly/v2ray-core/v4/app/proxyman"
  7. "github.com/v2fly/v2ray-core/v4/common/serial"
  8. "github.com/v2fly/v2ray-core/v4/proxy/dokodemo"
  9. "github.com/v2fly/v2ray-core/v4/transport/internet"
  10. )
  11. func (c InboundConfig) BuildV5(ctx context.Context) (proto.Message, error) {
  12. receiverSettings := &proxyman.ReceiverConfig{}
  13. if c.ListenOn == nil {
  14. // Listen on anyip, must set PortRange
  15. if c.PortRange == nil {
  16. return nil, newError("Listen on AnyIP but no Port(s) set in InboundDetour.")
  17. }
  18. receiverSettings.PortRange = c.PortRange.Build()
  19. } else {
  20. // Listen on specific IP or Unix Domain Socket
  21. receiverSettings.Listen = c.ListenOn.Build()
  22. listenDS := c.ListenOn.Family().IsDomain() && (c.ListenOn.Domain()[0] == '/' || c.ListenOn.Domain()[0] == '@')
  23. listenIP := c.ListenOn.Family().IsIP() || (c.ListenOn.Family().IsDomain() && c.ListenOn.Domain() == "localhost")
  24. switch {
  25. case listenIP:
  26. // Listen on specific IP, must set PortRange
  27. if c.PortRange == nil {
  28. return nil, newError("Listen on specific ip without port in InboundDetour.")
  29. }
  30. // Listen on IP:Port
  31. receiverSettings.PortRange = c.PortRange.Build()
  32. case listenDS:
  33. if c.PortRange != nil {
  34. // Listen on Unix Domain Socket, PortRange should be nil
  35. receiverSettings.PortRange = nil
  36. }
  37. default:
  38. return nil, newError("unable to listen on domain address: ", c.ListenOn.Domain())
  39. }
  40. }
  41. if c.StreamSetting != nil {
  42. ss, err := c.StreamSetting.BuildV5(ctx)
  43. if err != nil {
  44. return nil, err
  45. }
  46. receiverSettings.StreamSettings = ss.(*internet.StreamConfig)
  47. }
  48. if c.SniffingConfig != nil {
  49. s, err := c.SniffingConfig.Build()
  50. if err != nil {
  51. return nil, newError("failed to build sniffing config").Base(err)
  52. }
  53. receiverSettings.SniffingSettings = s
  54. }
  55. if c.Settings == nil {
  56. c.Settings = []byte("{}")
  57. }
  58. inboundConfigPack, err := loadHeterogeneousConfigFromRawJson("inbound", c.Protocol, c.Settings)
  59. if err != nil {
  60. return nil, newError("unable to load inbound protocol config").Base(err)
  61. }
  62. if content, ok := inboundConfigPack.(*dokodemo.Config); ok {
  63. receiverSettings.ReceiveOriginalDestination = content.FollowRedirect
  64. }
  65. return &core.InboundHandlerConfig{
  66. Tag: c.Tag,
  67. ReceiverSettings: serial.ToTypedMessage(receiverSettings),
  68. ProxySettings: serial.ToTypedMessage(inboundConfigPack),
  69. }, nil
  70. }