diff --git a/infra/conf/dokodemo.go b/infra/conf/dokodemo.go index 2086cb5a..a88ef4cd 100644 --- a/infra/conf/dokodemo.go +++ b/infra/conf/dokodemo.go @@ -6,21 +6,21 @@ import ( ) type DokodemoConfig struct { - Host *Address `json:"address"` - PortValue uint16 `json:"port"` - NetworkList *NetworkList `json:"network"` - Redirect bool `json:"followRedirect"` - UserLevel uint32 `json:"userLevel"` + Address *Address `json:"address"` + Port uint16 `json:"port"` + Network *NetworkList `json:"network"` + FollowRedirect bool `json:"followRedirect"` + UserLevel uint32 `json:"userLevel"` } func (v *DokodemoConfig) Build() (proto.Message, error) { config := new(dokodemo.Config) - if v.Host != nil { - config.Address = v.Host.Build() + if v.Address != nil { + config.Address = v.Address.Build() } - config.Port = uint32(v.PortValue) - config.Networks = v.NetworkList.Build() - config.FollowRedirect = v.Redirect + config.Port = uint32(v.Port) + config.Networks = v.Network.Build() + config.FollowRedirect = v.FollowRedirect config.UserLevel = v.UserLevel return config, nil } diff --git a/infra/conf/xray.go b/infra/conf/xray.go index f1d9fb08..0e9ec3eb 100644 --- a/infra/conf/xray.go +++ b/infra/conf/xray.go @@ -21,6 +21,7 @@ import ( var ( inboundConfigLoader = NewJSONConfigLoader(ConfigCreatorCache{ + "tunnel": func() interface{} { return new(DokodemoConfig) }, "dokodemo-door": func() interface{} { return new(DokodemoConfig) }, "http": func() interface{} { return new(HTTPServerConfig) }, "shadowsocks": func() interface{} { return new(ShadowsocksServerConfig) }, @@ -33,8 +34,10 @@ var ( }, "protocol", "settings") outboundConfigLoader = NewJSONConfigLoader(ConfigCreatorCache{ + "block": func() interface{} { return new(BlackholeConfig) }, "blackhole": func() interface{} { return new(BlackholeConfig) }, "loopback": func() interface{} { return new(LoopbackConfig) }, + "direct": func() interface{} { return new(FreedomConfig) }, "freedom": func() interface{} { return new(FreedomConfig) }, "http": func() interface{} { return new(HTTPClientConfig) }, "shadowsocks": func() interface{} { return new(ShadowsocksClientConfig) }, @@ -242,7 +245,7 @@ func (c *InboundDetourConfig) Build() (*core.InboundHandlerConfig, error) { return nil, errors.New("failed to load inbound detour config for protocol ", c.Protocol).Base(err) } if dokodemoConfig, ok := rawConfig.(*DokodemoConfig); ok { - receiverSettings.ReceiveOriginalDestination = dokodemoConfig.Redirect + receiverSettings.ReceiveOriginalDestination = dokodemoConfig.FollowRedirect } ts, err := rawConfig.(Buildable).Build() if err != nil { diff --git a/proxy/dokodemo/dokodemo.go b/proxy/dokodemo/dokodemo.go index 4fb431f4..70658898 100644 --- a/proxy/dokodemo/dokodemo.go +++ b/proxy/dokodemo/dokodemo.go @@ -3,6 +3,8 @@ package dokodemo import ( "context" "runtime" + "strconv" + "strings" "sync/atomic" "github.com/xtls/xray-core/common" @@ -73,6 +75,25 @@ func (d *DokodemoDoor) Process(ctx context.Context, network net.Network, conn st Port: d.port, } + if !d.config.FollowRedirect { + host, port, err := net.SplitHostPort(conn.LocalAddr().String()) + if dest.Address == nil { + if err != nil { + dest.Address = net.DomainAddress("localhost") + } else { + if strings.Contains(host, ".") { + dest.Address = net.LocalHostIP + } else { + dest.Address = net.LocalHostIPv6 + } + } + } + if dest.Port == 0 { + dest.Port = net.Port(common.Must2(strconv.Atoi(port)).(int)) + } + + } + destinationOverridden := false if d.config.FollowRedirect { outbounds := session.OutboundsFromContext(ctx)