reverse.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. // +build !confonly
  2. package reverse
  3. //go:generate errorgen
  4. import (
  5. "context"
  6. "v2ray.com/core"
  7. "v2ray.com/core/common"
  8. "v2ray.com/core/common/errors"
  9. "v2ray.com/core/common/net"
  10. "v2ray.com/core/features/outbound"
  11. "v2ray.com/core/features/routing"
  12. )
  13. const (
  14. internalDomain = "reverse.internal.v2ray.com"
  15. )
  16. func isDomain(dest net.Destination, domain string) bool {
  17. return dest.Address.Family().IsDomain() && dest.Address.Domain() == domain
  18. }
  19. func isInternalDomain(dest net.Destination) bool {
  20. return isDomain(dest, internalDomain)
  21. }
  22. func init() {
  23. common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, config interface{}) (interface{}, error) {
  24. r := new(Reverse)
  25. if err := core.RequireFeatures(ctx, func(d routing.Dispatcher, om outbound.Manager) error {
  26. return r.Init(config.(*Config), d, om)
  27. }); err != nil {
  28. return nil, err
  29. }
  30. return r, nil
  31. }))
  32. }
  33. type Reverse struct {
  34. bridges []*Bridge
  35. portals []*Portal
  36. }
  37. func (r *Reverse) Init(config *Config, d routing.Dispatcher, ohm outbound.Manager) error {
  38. for _, bConfig := range config.BridgeConfig {
  39. b, err := NewBridge(bConfig, d)
  40. if err != nil {
  41. return err
  42. }
  43. r.bridges = append(r.bridges, b)
  44. }
  45. for _, pConfig := range config.PortalConfig {
  46. p, err := NewPortal(pConfig, ohm)
  47. if err != nil {
  48. return err
  49. }
  50. r.portals = append(r.portals, p)
  51. }
  52. return nil
  53. }
  54. func (r *Reverse) Type() interface{} {
  55. return (*Reverse)(nil)
  56. }
  57. func (r *Reverse) Start() error {
  58. for _, b := range r.bridges {
  59. if err := b.Start(); err != nil {
  60. return err
  61. }
  62. }
  63. for _, p := range r.portals {
  64. if err := p.Start(); err != nil {
  65. return err
  66. }
  67. }
  68. return nil
  69. }
  70. func (r *Reverse) Close() error {
  71. var errs []error
  72. for _, b := range r.bridges {
  73. errs = append(errs, b.Close())
  74. }
  75. for _, p := range r.portals {
  76. errs = append(errs, p.Close())
  77. }
  78. return errors.Combine(errs...)
  79. }