added proxy protocol
This commit is contained in:
@ -250,9 +250,11 @@ type SockOptsConfig struct {
|
||||
}
|
||||
|
||||
type ServiceConfig struct {
|
||||
Name string `json:"name"`
|
||||
Addr string `yaml:",omitempty" json:"addr,omitempty"`
|
||||
Interface string `yaml:",omitempty" json:"interface,omitempty"`
|
||||
Name string `json:"name"`
|
||||
Addr string `yaml:",omitempty" json:"addr,omitempty"`
|
||||
// DEPRECATED by metadata.interface since beta.5
|
||||
Interface string `yaml:",omitempty" json:"interface,omitempty"`
|
||||
// DEPRECATED by metadata.so_mark since beta.5
|
||||
SockOpts *SockOptsConfig `yaml:"sockopts,omitempty" json:"sockopts,omitempty"`
|
||||
Admission string `yaml:",omitempty" json:"admission,omitempty"`
|
||||
Admissions []string `yaml:",omitempty" json:"admissions,omitempty"`
|
||||
@ -260,11 +262,11 @@ type ServiceConfig struct {
|
||||
Bypasses []string `yaml:",omitempty" json:"bypasses,omitempty"`
|
||||
Resolver string `yaml:",omitempty" json:"resolver,omitempty"`
|
||||
Hosts string `yaml:",omitempty" json:"hosts,omitempty"`
|
||||
Limiter string `yaml:",omitempty" json:"limiter,omitempty"`
|
||||
Recorders []*RecorderObject `yaml:",omitempty" json:"recorders,omitempty"`
|
||||
Handler *HandlerConfig `yaml:",omitempty" json:"handler,omitempty"`
|
||||
Listener *ListenerConfig `yaml:",omitempty" json:"listener,omitempty"`
|
||||
Forwarder *ForwarderConfig `yaml:",omitempty" json:"forwarder,omitempty"`
|
||||
Limiter string `yaml:",omitempty" json:"limiter,omitempty"`
|
||||
Metadata map[string]any `yaml:",omitempty" json:"metadata,omitempty"`
|
||||
}
|
||||
|
||||
|
@ -6,9 +6,11 @@ import (
|
||||
"github.com/go-gost/core/connector"
|
||||
"github.com/go-gost/core/dialer"
|
||||
"github.com/go-gost/core/logger"
|
||||
"github.com/go-gost/core/metadata"
|
||||
mdutil "github.com/go-gost/core/metadata/util"
|
||||
"github.com/go-gost/x/config"
|
||||
tls_util "github.com/go-gost/x/internal/util/tls"
|
||||
"github.com/go-gost/x/metadata"
|
||||
mdx "github.com/go-gost/x/metadata"
|
||||
"github.com/go-gost/x/registry"
|
||||
)
|
||||
|
||||
@ -24,7 +26,7 @@ func ParseChain(cfg *config.ChainConfig) (chain.Chainer, error) {
|
||||
|
||||
c := chain.NewChain(cfg.Name)
|
||||
if cfg.Metadata != nil {
|
||||
c.WithMetadata(metadata.NewMetadata(cfg.Metadata))
|
||||
c.WithMetadata(mdx.NewMetadata(cfg.Metadata))
|
||||
}
|
||||
|
||||
selector := parseNodeSelector(cfg.Selector)
|
||||
@ -54,6 +56,11 @@ func ParseChain(cfg *config.ChainConfig) (chain.Chainer, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var nm metadata.Metadata
|
||||
if v.Metadata != nil {
|
||||
nm = mdx.NewMetadata(v.Metadata)
|
||||
}
|
||||
|
||||
cr := registry.ConnectorRegistry().Get(v.Connector.Type)(
|
||||
connector.AuthOption(parseAuth(v.Connector.Auth)),
|
||||
connector.TLSConfigOption(tlsConfig),
|
||||
@ -63,7 +70,7 @@ func ParseChain(cfg *config.ChainConfig) (chain.Chainer, error) {
|
||||
if v.Connector.Metadata == nil {
|
||||
v.Connector.Metadata = make(map[string]any)
|
||||
}
|
||||
if err := cr.Init(metadata.NewMetadata(v.Connector.Metadata)); err != nil {
|
||||
if err := cr.Init(mdx.NewMetadata(v.Connector.Metadata)); err != nil {
|
||||
connectorLogger.Error("init: ", err)
|
||||
return nil, err
|
||||
}
|
||||
@ -84,16 +91,21 @@ func ParseChain(cfg *config.ChainConfig) (chain.Chainer, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var ppv int
|
||||
if nm != nil {
|
||||
ppv = mdutil.GetInt(nm, mdKeyProxyProtocol)
|
||||
}
|
||||
d := registry.DialerRegistry().Get(v.Dialer.Type)(
|
||||
dialer.AuthOption(parseAuth(v.Dialer.Auth)),
|
||||
dialer.TLSConfigOption(tlsConfig),
|
||||
dialer.LoggerOption(dialerLogger),
|
||||
dialer.ProxyProtocolOption(ppv),
|
||||
)
|
||||
|
||||
if v.Dialer.Metadata == nil {
|
||||
v.Dialer.Metadata = make(map[string]any)
|
||||
}
|
||||
if err := d.Init(metadata.NewMetadata(v.Dialer.Metadata)); err != nil {
|
||||
if err := d.Init(mdx.NewMetadata(v.Dialer.Metadata)); err != nil {
|
||||
dialerLogger.Error("init: ", err)
|
||||
return nil, err
|
||||
}
|
||||
@ -129,10 +141,9 @@ func ParseChain(cfg *config.ChainConfig) (chain.Chainer, error) {
|
||||
WithTransport(tr).
|
||||
WithBypass(bypass.BypassGroup(bypassList(v.Bypass, v.Bypasses...)...)).
|
||||
WithResolver(registry.ResolverRegistry().Get(v.Resolver)).
|
||||
WithHostMapper(registry.HostsRegistry().Get(v.Hosts))
|
||||
if v.Metadata != nil {
|
||||
node.WithMetadata(metadata.NewMetadata(v.Metadata))
|
||||
}
|
||||
WithHostMapper(registry.HostsRegistry().Get(v.Hosts)).
|
||||
WithMetadata(nm)
|
||||
|
||||
group.AddNode(node)
|
||||
}
|
||||
|
||||
|
@ -27,6 +27,12 @@ import (
|
||||
xs "github.com/go-gost/x/selector"
|
||||
)
|
||||
|
||||
const (
|
||||
mdKeyProxyProtocol = "proxyProtocol"
|
||||
mdKeyInterface = "interface"
|
||||
mdKeySoMark = "so_mark"
|
||||
)
|
||||
|
||||
func ParseAuther(cfg *config.AutherConfig) auth.Authenticator {
|
||||
if cfg == nil {
|
||||
return nil
|
||||
|
@ -10,6 +10,7 @@ import (
|
||||
"github.com/go-gost/core/handler"
|
||||
"github.com/go-gost/core/listener"
|
||||
"github.com/go-gost/core/logger"
|
||||
mdutil "github.com/go-gost/core/metadata/util"
|
||||
"github.com/go-gost/core/recorder"
|
||||
"github.com/go-gost/core/selector"
|
||||
"github.com/go-gost/core/service"
|
||||
@ -68,6 +69,28 @@ func ParseService(cfg *config.ServiceConfig) (service.Service, error) {
|
||||
|
||||
admissions := admissionList(cfg.Admission, cfg.Admissions...)
|
||||
|
||||
var sockOpts *chain.SockOpts
|
||||
if cfg.SockOpts != nil {
|
||||
sockOpts = &chain.SockOpts{
|
||||
Mark: cfg.SockOpts.Mark,
|
||||
}
|
||||
}
|
||||
|
||||
var ppv int
|
||||
ifce := cfg.Interface
|
||||
if cfg.Metadata != nil {
|
||||
md := metadata.NewMetadata(cfg.Metadata)
|
||||
ppv = mdutil.GetInt(md, mdKeyProxyProtocol)
|
||||
if v := mdutil.GetString(md, mdKeyInterface); v != "" {
|
||||
ifce = v
|
||||
}
|
||||
if v := mdutil.GetInt(md, mdKeySoMark); v > 0 {
|
||||
sockOpts = &chain.SockOpts{
|
||||
Mark: v,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ln := registry.ListenerRegistry().Get(cfg.Listener.Type)(
|
||||
listener.AddrOption(cfg.Addr),
|
||||
listener.AutherOption(auther),
|
||||
@ -78,6 +101,7 @@ func ParseService(cfg *config.ServiceConfig) (service.Service, error) {
|
||||
listener.RateLimiterOption(registry.RateLimiterRegistry().Get(cfg.Limiter)),
|
||||
listener.LoggerOption(listenerLogger),
|
||||
listener.ServiceOption(cfg.Name),
|
||||
listener.ProxyProtocolOption(ppv),
|
||||
)
|
||||
|
||||
if cfg.Listener.Metadata == nil {
|
||||
@ -118,13 +142,6 @@ func ParseService(cfg *config.ServiceConfig) (service.Service, error) {
|
||||
auther = auth.AuthenticatorGroup(authers...)
|
||||
}
|
||||
|
||||
var sockOpts *chain.SockOpts
|
||||
if cfg.SockOpts != nil {
|
||||
sockOpts = &chain.SockOpts{
|
||||
Mark: cfg.SockOpts.Mark,
|
||||
}
|
||||
}
|
||||
|
||||
var recorders []recorder.RecorderObject
|
||||
for _, r := range cfg.Recorders {
|
||||
recorders = append(recorders, recorder.RecorderObject{
|
||||
@ -135,7 +152,7 @@ func ParseService(cfg *config.ServiceConfig) (service.Service, error) {
|
||||
router := (&chain.Router{}).
|
||||
WithRetries(cfg.Handler.Retries).
|
||||
// WithTimeout(timeout time.Duration).
|
||||
WithInterface(cfg.Interface).
|
||||
WithInterface(ifce).
|
||||
WithSockOpts(sockOpts).
|
||||
WithChain(chainGroup(cfg.Handler.Chain, cfg.Handler.ChainGroup)).
|
||||
WithResolver(registry.ResolverRegistry().Get(cfg.Resolver)).
|
||||
|
Reference in New Issue
Block a user