update cmd

This commit is contained in:
ginuerzh 2021-11-22 23:57:07 +08:00
parent fa8375f763
commit ece51cb0b8
18 changed files with 135 additions and 80 deletions

View File

@ -38,7 +38,10 @@ func buildService(cfg *config.Config) (services []*service.Service) {
for _, svc := range cfg.Services { for _, svc := range cfg.Services {
serviceLogger := log.WithFields(map[string]interface{}{ 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{}{ listenerLogger := serviceLogger.WithFields(map[string]interface{}{

View File

@ -5,6 +5,7 @@ import (
"strings" "strings"
"github.com/go-gost/gost/pkg/config" "github.com/go-gost/gost/pkg/config"
"github.com/go-gost/gost/pkg/registry"
) )
// normConfig normalizes the config. // normConfig normalizes the config.
@ -41,8 +42,36 @@ func normService(svc *config.ServiceConfig) {
md[k] = v[0] md[k] = v[0]
} }
} }
if u.User != nil {
md["users"] = []interface{}{u.User.String()}
}
svc.Addr = u.Host 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{ svc.Handler = &config.HandlerConfig{
Type: handler, Type: handler,
Metadata: md, Metadata: md,
@ -51,12 +80,6 @@ func normService(svc *config.ServiceConfig) {
Type: listener, Type: listener,
Metadata: md, Metadata: md,
} }
if remotes := strings.Trim(u.EscapedPath(), "/"); remotes != "" {
svc.Forwarder = &config.ForwarderConfig{
Targets: strings.Split(remotes, ","),
}
}
} }
func normChain(chain *config.ChainConfig) { func normChain(chain *config.ChainConfig) {
@ -85,8 +108,22 @@ func normChain(chain *config.ChainConfig) {
md[k] = v[0] md[k] = v[0]
} }
} }
if u.User != nil {
md["user"] = []interface{}{u.User.String()}
}
node.Addr = u.Host 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{ node.Connector = &config.ConnectorConfig{
Type: connector, Type: connector,
Metadata: md, Metadata: md,

2
go.mod
View File

@ -8,7 +8,7 @@ require (
github.com/ginuerzh/tls-dissector v0.0.2-0.20201202075250-98fa925912da github.com/ginuerzh/tls-dissector v0.0.2-0.20201202075250-98fa925912da
github.com/go-gost/gosocks4 v0.0.1 github.com/go-gost/gosocks4 v0.0.1
github.com/go-gost/gosocks5 v0.3.1-0.20211109033403-d894d75b7f09 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/gobwas/glob v0.2.3
github.com/golang/snappy v0.0.3 github.com/golang/snappy v0.0.3
github.com/google/gopacket v1.1.19 // indirect github.com/google/gopacket v1.1.19 // indirect

4
go.sum
View File

@ -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.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 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.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 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I=
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= 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= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=

View File

@ -22,7 +22,7 @@ func (c *httpConnector) parseMetadata(md md.Metadata) (err error) {
const ( const (
connectTimeout = "timeout" connectTimeout = "timeout"
userAgent = "userAgent" userAgent = "userAgent"
auth = "auth" user = "user"
) )
c.md.connectTimeout = md.GetDuration(connectTimeout) c.md.connectTimeout = md.GetDuration(connectTimeout)
@ -31,7 +31,7 @@ func (c *httpConnector) parseMetadata(md md.Metadata) (err error) {
c.md.UserAgent = defaultUserAgent c.md.UserAgent = defaultUserAgent
} }
if v := md.GetString(auth); v != "" { if v := md.GetString(user); v != "" {
ss := strings.SplitN(v, ":", 2) ss := strings.SplitN(v, ":", 2)
if len(ss) == 1 { if len(ss) == 1 {
c.md.User = url.User(ss[0]) c.md.User = url.User(ss[0])

View File

@ -3,7 +3,6 @@ package relay
import ( import (
"context" "context"
"net" "net"
"strconv"
"time" "time"
"github.com/go-gost/gost/pkg/connector" "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 != "" { if address != "" {
host, port, _ := net.SplitHostPort(address) af := &relay.AddrFeature{}
nport, _ := strconv.ParseUint(port, 10, 16) if err := af.ParseFrom(address); err != nil {
if host == "" { return nil, err
host = net.IPv4zero.String()
} }
if nport > 0 { req.Features = append(req.Features, af)
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),
})
}
} }
return conn, nil return conn, nil

View File

@ -16,12 +16,12 @@ type metadata struct {
func (c *relayConnector) parseMetadata(md md.Metadata) (err error) { func (c *relayConnector) parseMetadata(md md.Metadata) (err error) {
const ( const (
auth = "auth" user = "user"
connectTimeout = "connectTimeout" connectTimeout = "connectTimeout"
nodelay = "nodelay" nodelay = "nodelay"
) )
if v := md.GetString(auth); v != "" { if v := md.GetString(user); v != "" {
ss := strings.SplitN(v, ":", 2) ss := strings.SplitN(v, ":", 2)
if len(ss) == 1 { if len(ss) == 1 {
c.md.user = url.User(ss[0]) c.md.user = url.User(ss[0])

View File

@ -16,11 +16,11 @@ type metadata struct {
func (c *socks4Connector) parseMetadata(md md.Metadata) (err error) { func (c *socks4Connector) parseMetadata(md md.Metadata) (err error) {
const ( const (
connectTimeout = "timeout" connectTimeout = "timeout"
auth = "auth" user = "user"
disable4a = "disable4a" disable4a = "disable4a"
) )
if v := md.GetString(auth); v != "" { if v := md.GetString(user); v != "" {
c.md.User = url.User(v) c.md.User = url.User(v)
} }
c.md.connectTimeout = md.GetDuration(connectTimeout) c.md.connectTimeout = md.GetDuration(connectTimeout)

View File

@ -19,11 +19,11 @@ type metadata struct {
func (c *socks5Connector) parseMetadata(md md.Metadata) (err error) { func (c *socks5Connector) parseMetadata(md md.Metadata) (err error) {
const ( const (
connectTimeout = "timeout" connectTimeout = "timeout"
auth = "auth" user = "user"
noTLS = "notls" noTLS = "notls"
) )
if v := md.GetString(auth); v != "" { if v := md.GetString(user); v != "" {
ss := strings.SplitN(v, ":", 2) ss := strings.SplitN(v, ":", 2)
if len(ss) == 1 { if len(ss) == 1 {
c.md.User = url.User(ss[0]) c.md.User = url.User(ss[0])

View File

@ -1,6 +1,7 @@
package ss package ss
import ( import (
"strings"
"time" "time"
"github.com/go-gost/gost/pkg/common/util/ss" "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) { func (c *ssConnector) parseMetadata(md md.Metadata) (err error) {
const ( const (
method = "method" user = "user"
password = "password"
key = "key" key = "key"
connectTimeout = "timeout" connectTimeout = "timeout"
noDelay = "nodelay" noDelay = "nodelay"
) )
c.md.cipher, err = ss.ShadowCipher( var method, password string
md.GetString(method), if v := md.GetString(user); v != "" {
md.GetString(password), ss := strings.SplitN(v, ":", 2)
md.GetString(key), 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 { if err != nil {
return return
} }

View File

@ -1,6 +1,7 @@
package ss package ss
import ( import (
"strings"
"time" "time"
"github.com/go-gost/gost/pkg/common/util/ss" "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) { func (c *ssuConnector) parseMetadata(md md.Metadata) (err error) {
const ( const (
method = "method" user = "user"
password = "password"
key = "key" key = "key"
connectTimeout = "timeout" connectTimeout = "timeout"
udpBufferSize = "udpBufferSize" // udp buffer size udpBufferSize = "udpBufferSize" // udp buffer size
) )
c.md.cipher, err = ss.ShadowCipher( var method, password string
md.GetString(method), if v := md.GetString(user); v != "" {
md.GetString(password), ss := strings.SplitN(v, ":", 2)
md.GetString(key), 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 { if err != nil {
return return
} }

View File

@ -16,16 +16,16 @@ type metadata struct {
func (h *httpHandler) parseMetadata(md md.Metadata) error { func (h *httpHandler) parseMetadata(md md.Metadata) error {
const ( const (
proxyAgentKey = "proxyAgent" proxyAgent = "proxyAgent"
authsKey = "auths" users = "users"
probeResistKey = "probeResist" probeResistKey = "probeResist"
knockKey = "knock" knock = "knock"
retryCount = "retry" 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) authenticator := auth.NewLocalAuthenticator(nil)
for _, auth := range v { for _, auth := range v {
if s, _ := auth.(string); s != "" { if s, _ := auth.(string); s != "" {
@ -45,7 +45,7 @@ func (h *httpHandler) parseMetadata(md md.Metadata) error {
h.md.probeResist = &probeResist{ h.md.probeResist = &probeResist{
Type: ss[0], Type: ss[0],
Value: ss[1], Value: ss[1],
Knock: md.GetString(knockKey), Knock: md.GetString(knock),
} }
} }
} }

View File

@ -89,8 +89,8 @@ func (h *relayHandler) Handle(ctx context.Context, conn net.Conn) {
feature := f.(*relay.UserAuthFeature) feature := f.(*relay.UserAuthFeature)
user, pass = feature.Username, feature.Password user, pass = feature.Username, feature.Password
} }
if f.Type() == relay.FeatureTargetAddr { if f.Type() == relay.FeatureAddr {
feature := f.(*relay.TargetAddrFeature) feature := f.(*relay.AddrFeature)
target = net.JoinHostPort(feature.Host, strconv.Itoa(int(feature.Port))) target = net.JoinHostPort(feature.Host, strconv.Itoa(int(feature.Port)))
} }
} }

View File

@ -16,12 +16,12 @@ type metadata struct {
func (h *relayHandler) parseMetadata(md md.Metadata) (err error) { func (h *relayHandler) parseMetadata(md md.Metadata) (err error) {
const ( const (
authsKey = "auths" users = "users"
readTimeout = "readTimeout" readTimeout = "readTimeout"
retryCount = "retry" retryCount = "retry"
) )
if v, _ := md.Get(authsKey).([]interface{}); len(v) > 0 { if v, _ := md.Get(users).([]interface{}); len(v) > 0 {
authenticator := auth.NewLocalAuthenticator(nil) authenticator := auth.NewLocalAuthenticator(nil)
for _, auth := range v { for _, auth := range v {
if s, _ := auth.(string); s != "" { if s, _ := auth.(string); s != "" {

View File

@ -15,12 +15,12 @@ type metadata struct {
func (h *socks4Handler) parseMetadata(md md.Metadata) (err error) { func (h *socks4Handler) parseMetadata(md md.Metadata) (err error) {
const ( const (
authsKey = "auths" users = "users"
readTimeout = "readTimeout" readTimeout = "readTimeout"
retryCount = "retry" retryCount = "retry"
) )
if v, _ := md.Get(authsKey).([]interface{}); len(v) > 0 { if v, _ := md.Get(users).([]interface{}); len(v) > 0 {
authenticator := auth.NewLocalAuthenticator(nil) authenticator := auth.NewLocalAuthenticator(nil)
for _, auth := range v { for _, auth := range v {
if v, _ := auth.(string); v != "" { if v, _ := auth.(string); v != "" {

View File

@ -28,7 +28,7 @@ func (h *socks5Handler) parseMetadata(md md.Metadata) error {
certFile = "certFile" certFile = "certFile"
keyFile = "keyFile" keyFile = "keyFile"
caFile = "caFile" caFile = "caFile"
authsKey = "auths" users = "users"
readTimeout = "readTimeout" readTimeout = "readTimeout"
timeout = "timeout" timeout = "timeout"
retryCount = "retry" retryCount = "retry"
@ -49,7 +49,7 @@ func (h *socks5Handler) parseMetadata(md md.Metadata) error {
h.logger.Warn("parse tls config: ", err) 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) authenticator := auth.NewLocalAuthenticator(nil)
for _, auth := range v { for _, auth := range v {
if s, _ := auth.(string); s != "" { if s, _ := auth.(string); s != "" {

View File

@ -1,6 +1,7 @@
package ss package ss
import ( import (
"strings"
"time" "time"
"github.com/go-gost/gost/pkg/common/util/ss" "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) { func (h *ssHandler) parseMetadata(md md.Metadata) (err error) {
const ( const (
method = "method" users = "users"
password = "password"
key = "key" key = "key"
readTimeout = "readTimeout" readTimeout = "readTimeout"
retryCount = "retry" retryCount = "retry"
) )
h.md.cipher, err = ss.ShadowCipher( var method, password string
md.GetString(method), if v, _ := md.Get(users).([]interface{}); len(v) > 0 {
md.GetString(password), h.logger.Info(v)
md.GetString(key), 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 { if err != nil {
return return
} }

View File

@ -1,6 +1,7 @@
package ss package ss
import ( import (
"strings"
"time" "time"
"github.com/go-gost/gost/pkg/common/util/ss" "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) { func (h *ssuHandler) parseMetadata(md md.Metadata) (err error) {
const ( const (
method = "method" users = "users"
password = "password"
key = "key" key = "key"
readTimeout = "readTimeout" readTimeout = "readTimeout"
retryCount = "retry" retryCount = "retry"
bufferSize = "bufferSize" bufferSize = "bufferSize"
) )
h.md.cipher, err = ss.ShadowCipher( var method, password string
md.GetString(method), if v, _ := md.Get(users).([]interface{}); len(v) > 0 {
md.GetString(password), for _, auth := range v {
md.GetString(key), 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 { if err != nil {
return return
} }