From ece51cb0b824ba6372d3a60a88347d07af7dfa1f Mon Sep 17 00:00:00 2001 From: ginuerzh Date: Mon, 22 Nov 2021 23:57:07 +0800 Subject: [PATCH] update cmd --- cmd/gost/config.go | 5 ++- cmd/gost/norm.go | 49 ++++++++++++++++++++++++++---- go.mod | 2 +- go.sum | 4 +++ pkg/connector/http/metadata.go | 4 +-- pkg/connector/relay/connector.go | 26 +++------------- pkg/connector/relay/metadata.go | 4 +-- pkg/connector/socks/v4/metadata.go | 4 +-- pkg/connector/socks/v5/metadata.go | 4 +-- pkg/connector/ss/metadata.go | 19 +++++++----- pkg/connector/ss/udp/metadata.go | 19 +++++++----- pkg/handler/http/metadata.go | 12 ++++---- pkg/handler/relay/handler.go | 4 +-- pkg/handler/relay/metadata.go | 4 +-- pkg/handler/socks/v4/metadata.go | 4 +-- pkg/handler/socks/v5/metadata.go | 4 +-- pkg/handler/ss/metadata.go | 24 ++++++++++----- pkg/handler/ss/udp/metadata.go | 23 +++++++++----- 18 files changed, 135 insertions(+), 80 deletions(-) diff --git a/cmd/gost/config.go b/cmd/gost/config.go index f5f5190..dc1cb0b 100644 --- a/cmd/gost/config.go +++ b/cmd/gost/config.go @@ -38,7 +38,10 @@ func buildService(cfg *config.Config) (services []*service.Service) { for _, svc := range cfg.Services { serviceLogger := log.WithFields(map[string]interface{}{ - "service": svc.Name, + "kind": "service", + "service": svc.Name, + "listener": svc.Listener.Type, + "handler": svc.Handler.Type, }) listenerLogger := serviceLogger.WithFields(map[string]interface{}{ diff --git a/cmd/gost/norm.go b/cmd/gost/norm.go index 29af6ec..49d1d72 100644 --- a/cmd/gost/norm.go +++ b/cmd/gost/norm.go @@ -5,6 +5,7 @@ import ( "strings" "github.com/go-gost/gost/pkg/config" + "github.com/go-gost/gost/pkg/registry" ) // normConfig normalizes the config. @@ -41,8 +42,36 @@ func normService(svc *config.ServiceConfig) { md[k] = v[0] } } + if u.User != nil { + md["users"] = []interface{}{u.User.String()} + } svc.Addr = u.Host + + if h := registry.GetHandler(handler); h == nil { + handler = "auto" + } + if ln := registry.GetListener(listener); ln == nil { + listener = "tcp" + if handler == "ssu" { + listener = "udp" + } + } + + if remotes := strings.Trim(u.EscapedPath(), "/"); remotes != "" { + svc.Forwarder = &config.ForwarderConfig{ + Targets: strings.Split(remotes, ","), + } + if handler != "relay" { + if listener == "tcp" || listener == "udp" || + listener == "rtcp" || listener == "rudp" { + handler = listener + } else { + handler = "tcp" + } + } + } + svc.Handler = &config.HandlerConfig{ Type: handler, Metadata: md, @@ -51,12 +80,6 @@ func normService(svc *config.ServiceConfig) { Type: listener, Metadata: md, } - - if remotes := strings.Trim(u.EscapedPath(), "/"); remotes != "" { - svc.Forwarder = &config.ForwarderConfig{ - Targets: strings.Split(remotes, ","), - } - } } func normChain(chain *config.ChainConfig) { @@ -85,8 +108,22 @@ func normChain(chain *config.ChainConfig) { md[k] = v[0] } } + if u.User != nil { + md["user"] = []interface{}{u.User.String()} + } node.Addr = u.Host + + if c := registry.GetConnector(connector); c == nil { + connector = "http" + } + if d := registry.GetDialer(dialer); d == nil { + dialer = "tcp" + if connector == "ssu" { + dialer = "udp" + } + } + node.Connector = &config.ConnectorConfig{ Type: connector, Metadata: md, diff --git a/go.mod b/go.mod index 7d16411..546e320 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/ginuerzh/tls-dissector v0.0.2-0.20201202075250-98fa925912da github.com/go-gost/gosocks4 v0.0.1 github.com/go-gost/gosocks5 v0.3.1-0.20211109033403-d894d75b7f09 - github.com/go-gost/relay v0.1.1-0.20211117133957-4b109438dc89 + github.com/go-gost/relay v0.1.1-0.20211122150329-54ee406ea49d github.com/gobwas/glob v0.2.3 github.com/golang/snappy v0.0.3 github.com/google/gopacket v1.1.19 // indirect diff --git a/go.sum b/go.sum index 6e39a29..7b7ae41 100644 --- a/go.sum +++ b/go.sum @@ -119,6 +119,10 @@ github.com/go-gost/relay v0.1.1-0.20211028021513-03c783f893bc h1:F8wBeQYP8JvzIG/ github.com/go-gost/relay v0.1.1-0.20211028021513-03c783f893bc/go.mod h1:lcX+23LCQ3khIeASBo+tJ/WbwXFO32/N5YN6ucuYTG8= github.com/go-gost/relay v0.1.1-0.20211117133957-4b109438dc89 h1:1EtXLpAYeGVcptB0Jt8AeRe+GQnbTjbqeYA3L02pCIY= github.com/go-gost/relay v0.1.1-0.20211117133957-4b109438dc89/go.mod h1:lcX+23LCQ3khIeASBo+tJ/WbwXFO32/N5YN6ucuYTG8= +github.com/go-gost/relay v0.1.1-0.20211122140942-99db08018413 h1:vF0HQWLlwu2GTZQgS9HJlOWUhnEZy8np/fCbWizI/08= +github.com/go-gost/relay v0.1.1-0.20211122140942-99db08018413/go.mod h1:lcX+23LCQ3khIeASBo+tJ/WbwXFO32/N5YN6ucuYTG8= +github.com/go-gost/relay v0.1.1-0.20211122150329-54ee406ea49d h1:rzGVzkSvxuDZg8PoYmOR+tvcAg9Dr8whgV19kzuO4YA= +github.com/go-gost/relay v0.1.1-0.20211122150329-54ee406ea49d/go.mod h1:lcX+23LCQ3khIeASBo+tJ/WbwXFO32/N5YN6ucuYTG8= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= diff --git a/pkg/connector/http/metadata.go b/pkg/connector/http/metadata.go index 5033fcb..3b86cb2 100644 --- a/pkg/connector/http/metadata.go +++ b/pkg/connector/http/metadata.go @@ -22,7 +22,7 @@ func (c *httpConnector) parseMetadata(md md.Metadata) (err error) { const ( connectTimeout = "timeout" userAgent = "userAgent" - auth = "auth" + user = "user" ) c.md.connectTimeout = md.GetDuration(connectTimeout) @@ -31,7 +31,7 @@ func (c *httpConnector) parseMetadata(md md.Metadata) (err error) { c.md.UserAgent = defaultUserAgent } - if v := md.GetString(auth); v != "" { + if v := md.GetString(user); v != "" { ss := strings.SplitN(v, ":", 2) if len(ss) == 1 { c.md.User = url.User(ss[0]) diff --git a/pkg/connector/relay/connector.go b/pkg/connector/relay/connector.go index bbdeae2..7f9788d 100644 --- a/pkg/connector/relay/connector.go +++ b/pkg/connector/relay/connector.go @@ -3,7 +3,6 @@ package relay import ( "context" "net" - "strconv" "time" "github.com/go-gost/gost/pkg/connector" @@ -72,29 +71,12 @@ func (c *relayConnector) Connect(ctx context.Context, conn net.Conn, network, ad } if address != "" { - host, port, _ := net.SplitHostPort(address) - nport, _ := strconv.ParseUint(port, 10, 16) - if host == "" { - host = net.IPv4zero.String() + af := &relay.AddrFeature{} + if err := af.ParseFrom(address); err != nil { + return nil, err } - if nport > 0 { - var atype uint8 - ip := net.ParseIP(host) - if ip == nil { - atype = relay.AddrDomain - } else if ip.To4() == nil { - atype = relay.AddrIPv6 - } else { - atype = relay.AddrIPv4 - } - - req.Features = append(req.Features, &relay.TargetAddrFeature{ - AType: atype, - Host: host, - Port: uint16(nport), - }) - } + req.Features = append(req.Features, af) } return conn, nil diff --git a/pkg/connector/relay/metadata.go b/pkg/connector/relay/metadata.go index 0fecfee..58e0a8b 100644 --- a/pkg/connector/relay/metadata.go +++ b/pkg/connector/relay/metadata.go @@ -16,12 +16,12 @@ type metadata struct { func (c *relayConnector) parseMetadata(md md.Metadata) (err error) { const ( - auth = "auth" + user = "user" connectTimeout = "connectTimeout" nodelay = "nodelay" ) - if v := md.GetString(auth); v != "" { + if v := md.GetString(user); v != "" { ss := strings.SplitN(v, ":", 2) if len(ss) == 1 { c.md.user = url.User(ss[0]) diff --git a/pkg/connector/socks/v4/metadata.go b/pkg/connector/socks/v4/metadata.go index 41361c9..08f8184 100644 --- a/pkg/connector/socks/v4/metadata.go +++ b/pkg/connector/socks/v4/metadata.go @@ -16,11 +16,11 @@ type metadata struct { func (c *socks4Connector) parseMetadata(md md.Metadata) (err error) { const ( connectTimeout = "timeout" - auth = "auth" + user = "user" disable4a = "disable4a" ) - if v := md.GetString(auth); v != "" { + if v := md.GetString(user); v != "" { c.md.User = url.User(v) } c.md.connectTimeout = md.GetDuration(connectTimeout) diff --git a/pkg/connector/socks/v5/metadata.go b/pkg/connector/socks/v5/metadata.go index 336130f..a3ae9cc 100644 --- a/pkg/connector/socks/v5/metadata.go +++ b/pkg/connector/socks/v5/metadata.go @@ -19,11 +19,11 @@ type metadata struct { func (c *socks5Connector) parseMetadata(md md.Metadata) (err error) { const ( connectTimeout = "timeout" - auth = "auth" + user = "user" noTLS = "notls" ) - if v := md.GetString(auth); v != "" { + if v := md.GetString(user); v != "" { ss := strings.SplitN(v, ":", 2) if len(ss) == 1 { c.md.User = url.User(ss[0]) diff --git a/pkg/connector/ss/metadata.go b/pkg/connector/ss/metadata.go index 9d583bc..4e8575e 100644 --- a/pkg/connector/ss/metadata.go +++ b/pkg/connector/ss/metadata.go @@ -1,6 +1,7 @@ package ss import ( + "strings" "time" "github.com/go-gost/gost/pkg/common/util/ss" @@ -16,18 +17,22 @@ type metadata struct { func (c *ssConnector) parseMetadata(md md.Metadata) (err error) { const ( - method = "method" - password = "password" + user = "user" key = "key" connectTimeout = "timeout" noDelay = "nodelay" ) - c.md.cipher, err = ss.ShadowCipher( - md.GetString(method), - md.GetString(password), - md.GetString(key), - ) + var method, password string + if v := md.GetString(user); v != "" { + ss := strings.SplitN(v, ":", 2) + if len(ss) == 1 { + method = ss[0] + } else { + method, password = ss[0], ss[1] + } + } + c.md.cipher, err = ss.ShadowCipher(method, password, md.GetString(key)) if err != nil { return } diff --git a/pkg/connector/ss/udp/metadata.go b/pkg/connector/ss/udp/metadata.go index ae69291..16e70e5 100644 --- a/pkg/connector/ss/udp/metadata.go +++ b/pkg/connector/ss/udp/metadata.go @@ -1,6 +1,7 @@ package ss import ( + "strings" "time" "github.com/go-gost/gost/pkg/common/util/ss" @@ -16,18 +17,22 @@ type metadata struct { func (c *ssuConnector) parseMetadata(md md.Metadata) (err error) { const ( - method = "method" - password = "password" + user = "user" key = "key" connectTimeout = "timeout" udpBufferSize = "udpBufferSize" // udp buffer size ) - c.md.cipher, err = ss.ShadowCipher( - md.GetString(method), - md.GetString(password), - md.GetString(key), - ) + var method, password string + if v := md.GetString(user); v != "" { + ss := strings.SplitN(v, ":", 2) + if len(ss) == 1 { + method = ss[0] + } else { + method, password = ss[0], ss[1] + } + } + c.md.cipher, err = ss.ShadowCipher(method, password, md.GetString(key)) if err != nil { return } diff --git a/pkg/handler/http/metadata.go b/pkg/handler/http/metadata.go index f7ad9c3..5371561 100644 --- a/pkg/handler/http/metadata.go +++ b/pkg/handler/http/metadata.go @@ -16,16 +16,16 @@ type metadata struct { func (h *httpHandler) parseMetadata(md md.Metadata) error { const ( - proxyAgentKey = "proxyAgent" - authsKey = "auths" + proxyAgent = "proxyAgent" + users = "users" probeResistKey = "probeResist" - knockKey = "knock" + knock = "knock" retryCount = "retry" ) - h.md.proxyAgent = md.GetString(proxyAgentKey) + h.md.proxyAgent = md.GetString(proxyAgent) - if v, _ := md.Get(authsKey).([]interface{}); len(v) > 0 { + if v, _ := md.Get(users).([]interface{}); len(v) > 0 { authenticator := auth.NewLocalAuthenticator(nil) for _, auth := range v { if s, _ := auth.(string); s != "" { @@ -45,7 +45,7 @@ func (h *httpHandler) parseMetadata(md md.Metadata) error { h.md.probeResist = &probeResist{ Type: ss[0], Value: ss[1], - Knock: md.GetString(knockKey), + Knock: md.GetString(knock), } } } diff --git a/pkg/handler/relay/handler.go b/pkg/handler/relay/handler.go index 9bc4af4..ac6e30f 100644 --- a/pkg/handler/relay/handler.go +++ b/pkg/handler/relay/handler.go @@ -89,8 +89,8 @@ func (h *relayHandler) Handle(ctx context.Context, conn net.Conn) { feature := f.(*relay.UserAuthFeature) user, pass = feature.Username, feature.Password } - if f.Type() == relay.FeatureTargetAddr { - feature := f.(*relay.TargetAddrFeature) + if f.Type() == relay.FeatureAddr { + feature := f.(*relay.AddrFeature) target = net.JoinHostPort(feature.Host, strconv.Itoa(int(feature.Port))) } } diff --git a/pkg/handler/relay/metadata.go b/pkg/handler/relay/metadata.go index f2070db..4a7b5e0 100644 --- a/pkg/handler/relay/metadata.go +++ b/pkg/handler/relay/metadata.go @@ -16,12 +16,12 @@ type metadata struct { func (h *relayHandler) parseMetadata(md md.Metadata) (err error) { const ( - authsKey = "auths" + users = "users" readTimeout = "readTimeout" retryCount = "retry" ) - if v, _ := md.Get(authsKey).([]interface{}); len(v) > 0 { + if v, _ := md.Get(users).([]interface{}); len(v) > 0 { authenticator := auth.NewLocalAuthenticator(nil) for _, auth := range v { if s, _ := auth.(string); s != "" { diff --git a/pkg/handler/socks/v4/metadata.go b/pkg/handler/socks/v4/metadata.go index 8b38166..8382e70 100644 --- a/pkg/handler/socks/v4/metadata.go +++ b/pkg/handler/socks/v4/metadata.go @@ -15,12 +15,12 @@ type metadata struct { func (h *socks4Handler) parseMetadata(md md.Metadata) (err error) { const ( - authsKey = "auths" + users = "users" readTimeout = "readTimeout" retryCount = "retry" ) - if v, _ := md.Get(authsKey).([]interface{}); len(v) > 0 { + if v, _ := md.Get(users).([]interface{}); len(v) > 0 { authenticator := auth.NewLocalAuthenticator(nil) for _, auth := range v { if v, _ := auth.(string); v != "" { diff --git a/pkg/handler/socks/v5/metadata.go b/pkg/handler/socks/v5/metadata.go index 6c2a03c..bc04dbe 100644 --- a/pkg/handler/socks/v5/metadata.go +++ b/pkg/handler/socks/v5/metadata.go @@ -28,7 +28,7 @@ func (h *socks5Handler) parseMetadata(md md.Metadata) error { certFile = "certFile" keyFile = "keyFile" caFile = "caFile" - authsKey = "auths" + users = "users" readTimeout = "readTimeout" timeout = "timeout" retryCount = "retry" @@ -49,7 +49,7 @@ func (h *socks5Handler) parseMetadata(md md.Metadata) error { h.logger.Warn("parse tls config: ", err) } - if v, _ := md.Get(authsKey).([]interface{}); len(v) > 0 { + if v, _ := md.Get(users).([]interface{}); len(v) > 0 { authenticator := auth.NewLocalAuthenticator(nil) for _, auth := range v { if s, _ := auth.(string); s != "" { diff --git a/pkg/handler/ss/metadata.go b/pkg/handler/ss/metadata.go index f00fd96..4943c3d 100644 --- a/pkg/handler/ss/metadata.go +++ b/pkg/handler/ss/metadata.go @@ -1,6 +1,7 @@ package ss import ( + "strings" "time" "github.com/go-gost/gost/pkg/common/util/ss" @@ -16,18 +17,27 @@ type metadata struct { func (h *ssHandler) parseMetadata(md md.Metadata) (err error) { const ( - method = "method" - password = "password" + users = "users" key = "key" readTimeout = "readTimeout" retryCount = "retry" ) - h.md.cipher, err = ss.ShadowCipher( - md.GetString(method), - md.GetString(password), - md.GetString(key), - ) + var method, password string + if v, _ := md.Get(users).([]interface{}); len(v) > 0 { + h.logger.Info(v) + for _, auth := range v { + if s, _ := auth.(string); s != "" { + ss := strings.SplitN(s, ":", 2) + if len(ss) == 1 { + method = ss[0] + } else { + method, password = ss[0], ss[1] + } + } + } + } + h.md.cipher, err = ss.ShadowCipher(method, password, md.GetString(key)) if err != nil { return } diff --git a/pkg/handler/ss/udp/metadata.go b/pkg/handler/ss/udp/metadata.go index f1842f6..e08ef40 100644 --- a/pkg/handler/ss/udp/metadata.go +++ b/pkg/handler/ss/udp/metadata.go @@ -1,6 +1,7 @@ package ss import ( + "strings" "time" "github.com/go-gost/gost/pkg/common/util/ss" @@ -17,19 +18,27 @@ type metadata struct { func (h *ssuHandler) parseMetadata(md md.Metadata) (err error) { const ( - method = "method" - password = "password" + users = "users" key = "key" readTimeout = "readTimeout" retryCount = "retry" bufferSize = "bufferSize" ) - h.md.cipher, err = ss.ShadowCipher( - md.GetString(method), - md.GetString(password), - md.GetString(key), - ) + var method, password string + if v, _ := md.Get(users).([]interface{}); len(v) > 0 { + for _, auth := range v { + if s, _ := auth.(string); s != "" { + ss := strings.SplitN(s, ":", 2) + if len(ss) == 1 { + method = ss[0] + } else { + method, password = ss[0], ss[1] + } + } + } + } + h.md.cipher, err = ss.ShadowCipher(method, password, md.GetString(key)) if err != nil { return }