123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- package reverse
- //go:generate go run github.com/xtls/xray-core/common/errors/errorgen
- import (
- "context"
- "github.com/xtls/xray-core/common"
- "github.com/xtls/xray-core/common/errors"
- "github.com/xtls/xray-core/common/net"
- core "github.com/xtls/xray-core/core"
- "github.com/xtls/xray-core/features/outbound"
- "github.com/xtls/xray-core/features/routing"
- )
- const (
- internalDomain = "reverse.internal.example.com"
- )
- func isDomain(dest net.Destination, domain string) bool {
- return dest.Address.Family().IsDomain() && dest.Address.Domain() == domain
- }
- func isInternalDomain(dest net.Destination) bool {
- return isDomain(dest, internalDomain)
- }
- func init() {
- common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, config interface{}) (interface{}, error) {
- r := new(Reverse)
- if err := core.RequireFeatures(ctx, func(d routing.Dispatcher, om outbound.Manager) error {
- return r.Init(config.(*Config), d, om)
- }); err != nil {
- return nil, err
- }
- return r, nil
- }))
- }
- type Reverse struct {
- bridges []*Bridge
- portals []*Portal
- }
- func (r *Reverse) Init(config *Config, d routing.Dispatcher, ohm outbound.Manager) error {
- for _, bConfig := range config.BridgeConfig {
- b, err := NewBridge(bConfig, d)
- if err != nil {
- return err
- }
- r.bridges = append(r.bridges, b)
- }
- for _, pConfig := range config.PortalConfig {
- p, err := NewPortal(pConfig, ohm)
- if err != nil {
- return err
- }
- r.portals = append(r.portals, p)
- }
- return nil
- }
- func (r *Reverse) Type() interface{} {
- return (*Reverse)(nil)
- }
- func (r *Reverse) Start() error {
- for _, b := range r.bridges {
- if err := b.Start(); err != nil {
- return err
- }
- }
- for _, p := range r.portals {
- if err := p.Start(); err != nil {
- return err
- }
- }
- return nil
- }
- func (r *Reverse) Close() error {
- var errs []error
- for _, b := range r.bridges {
- errs = append(errs, b.Close())
- }
- for _, p := range r.portals {
- errs = append(errs, p.Close())
- }
- return errors.Combine(errs...)
- }
|