From 7da8b2a710528bc59b8c2be36543a63418efb431 Mon Sep 17 00:00:00 2001 From: Christian Groschupp Date: Tue, 16 Apr 2024 12:17:10 +0200 Subject: [PATCH 1/8] feat: allow to read ssh passphrase from keyring --- dialer/ssh/metadata.go | 22 +++++++++++++++++----- dialer/sshd/metadata.go | 12 +++++++++++- go.mod | 4 ++++ go.sum | 9 +++++++++ listener/sshd/metadata.go | 12 +++++++++++- 5 files changed, 52 insertions(+), 7 deletions(-) diff --git a/dialer/ssh/metadata.go b/dialer/ssh/metadata.go index 2fa8315..9ceafc8 100644 --- a/dialer/ssh/metadata.go +++ b/dialer/ssh/metadata.go @@ -1,11 +1,13 @@ package ssh import ( + "fmt" "os" "time" mdata "github.com/go-gost/core/metadata" mdutil "github.com/go-gost/core/metadata/util" + "github.com/zalando/go-keyring" "golang.org/x/crypto/ssh" ) @@ -20,9 +22,10 @@ type metadata struct { func (d *sshDialer) parseMetadata(md mdata.Metadata) (err error) { const ( - handshakeTimeout = "handshakeTimeout" - privateKeyFile = "privateKeyFile" - passphrase = "passphrase" + handshakeTimeout = "handshakeTimeout" + privateKeyFile = "privateKeyFile" + passphrase = "passphrase" + passphraseFromKeyring = "passphraseFromKeyring" ) if key := mdutil.GetString(md, privateKeyFile); key != "" { @@ -31,10 +34,19 @@ func (d *sshDialer) parseMetadata(md mdata.Metadata) (err error) { return err } - if pp := mdutil.GetString(md, passphrase); pp != "" { - d.md.signer, err = ssh.ParsePrivateKeyWithPassphrase(data, []byte(pp)) + var pp string + if mdutil.GetBool(md, "passphraseFromKeyring") { + pp, err = keyring.Get(fmt.Sprintf("SSH %s", key), d.options.Auth.Username()) + if err != nil { + return fmt.Errorf("unable to get secret(%s) from keyring: %w", key, err) + } } else { + pp = mdutil.GetString(md, passphrase) + } + if pp == "" { d.md.signer, err = ssh.ParsePrivateKey(data) + } else { + d.md.signer, err = ssh.ParsePrivateKeyWithPassphrase(data, []byte(pp)) } if err != nil { return err diff --git a/dialer/sshd/metadata.go b/dialer/sshd/metadata.go index 4a9b484..3185927 100644 --- a/dialer/sshd/metadata.go +++ b/dialer/sshd/metadata.go @@ -1,11 +1,13 @@ package sshd import ( + "fmt" "os" "time" mdata "github.com/go-gost/core/metadata" mdutil "github.com/go-gost/core/metadata/util" + "github.com/zalando/go-keyring" "golang.org/x/crypto/ssh" ) @@ -31,7 +33,15 @@ func (d *sshdDialer) parseMetadata(md mdata.Metadata) (err error) { return err } - pp := mdutil.GetString(md, passphrase) + var pp string + if mdutil.GetBool(md, "passphraseFromKeyring") { + pp, err = keyring.Get(fmt.Sprintf("SSH %s", key), key) + if err != nil { + return fmt.Errorf("unable to get secret(%s) from keyring: %w", key, err) + } + } else { + pp = mdutil.GetString(md, passphrase) + } if pp == "" { d.md.signer, err = ssh.ParsePrivateKey(data) } else { diff --git a/go.mod b/go.mod index d4e06ab..5d7f21c 100644 --- a/go.mod +++ b/go.mod @@ -36,6 +36,7 @@ require ( github.com/xtaci/smux v1.5.24 github.com/xtaci/tcpraw v1.2.25 github.com/yl2chen/cidranger v1.0.2 + github.com/zalando/go-keyring v0.2.4 golang.org/x/crypto v0.17.0 golang.org/x/net v0.19.0 golang.org/x/sys v0.15.0 @@ -49,12 +50,14 @@ require ( require ( github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect + github.com/alessio/shellescape v1.4.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bytedance/sonic v1.10.2 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect github.com/chenzhuoyu/iasm v0.9.1 // indirect github.com/coreos/go-iptables v0.5.0 // indirect + github.com/danieljoos/wincred v1.2.0 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/gabriel-vasile/mimetype v1.4.3 // indirect @@ -64,6 +67,7 @@ require ( github.com/go-playground/validator/v10 v10.16.0 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/goccy/go-json v0.10.2 // indirect + github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/gopacket v1.1.19 // indirect github.com/google/pprof v0.0.0-20230912144702-c363fe2c2ed8 // indirect diff --git a/go.sum b/go.sum index d08bdff..0b2a182 100644 --- a/go.sum +++ b/go.sum @@ -4,6 +4,8 @@ github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmH github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/alessio/shellescape v1.4.1 h1:V7yhSDDn8LP4lc4jS8pFkt0zCnzVJlG5JXy9BVKJUX0= +github.com/alessio/shellescape v1.4.1/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30= github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ= github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -26,6 +28,8 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/coreos/go-iptables v0.5.0 h1:mw6SAibtHKZcNzAsOxjoHIG0gy5YFHhypWSSNc6EjbQ= github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= +github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -79,6 +83,8 @@ github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= +github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -216,6 +222,7 @@ github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -255,6 +262,8 @@ github.com/xtaci/tcpraw v1.2.25/go.mod h1:dKyZ2V75s0cZ7cbgJYdxPvms7af0joIeOyx1Gg github.com/yl2chen/cidranger v1.0.2 h1:lbOWZVCG1tCRX4u24kuM1Tb4nHqWkDxwLdoS+SevawU= github.com/yl2chen/cidranger v1.0.2/go.mod h1:9U1yz7WPYDwf0vpNWFaeRh0bjwz5RVgRy/9UEQfHl0g= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zalando/go-keyring v0.2.4 h1:wi2xxTqdiwMKbM6TWwi+uJCG/Tum2UV0jqaQhCa9/68= +github.com/zalando/go-keyring v0.2.4/go.mod h1:HL4k+OXQfJUWaMnqyuSOc0drfGPX2b51Du6K+MRgZMk= go.uber.org/mock v0.3.0 h1:3mUxI1No2/60yUYax92Pt8eNOEecx2D3lcXZh2NEZJo= go.uber.org/mock v0.3.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= diff --git a/listener/sshd/metadata.go b/listener/sshd/metadata.go index f4d3497..7d1b900 100644 --- a/listener/sshd/metadata.go +++ b/listener/sshd/metadata.go @@ -1,11 +1,13 @@ package ssh import ( + "fmt" "os" mdata "github.com/go-gost/core/metadata" mdutil "github.com/go-gost/core/metadata/util" ssh_util "github.com/go-gost/x/internal/util/ssh" + "github.com/zalando/go-keyring" "golang.org/x/crypto/ssh" ) @@ -34,7 +36,15 @@ func (l *sshdListener) parseMetadata(md mdata.Metadata) (err error) { return err } - pp := mdutil.GetString(md, passphrase) + var pp string + if mdutil.GetBool(md, "passphraseFromKeyring") { + pp, err = keyring.Get(fmt.Sprintf("SSH %s", key), l.options.Auth.Username()) + if err != nil { + return fmt.Errorf("unable to get secret(%s) from keyring: %w", key, err) + } + } else { + pp = mdutil.GetString(md, passphrase) + } if pp == "" { l.md.signer, err = ssh.ParsePrivateKey(data) } else { From 6ba22b0935eceb8b884636541278ed152ca9843d Mon Sep 17 00:00:00 2001 From: Christian Groschupp Date: Mon, 15 Apr 2024 21:40:47 +0200 Subject: [PATCH 2/8] feat: expand homedir of ssh private key --- dialer/ssh/metadata.go | 5 +++++ dialer/sshd/metadata.go | 5 +++++ go.mod | 7 ++++++- go.sum | 4 ++-- listener/ssh/metadata.go | 5 +++++ listener/sshd/metadata.go | 5 +++++ 6 files changed, 28 insertions(+), 3 deletions(-) diff --git a/dialer/ssh/metadata.go b/dialer/ssh/metadata.go index 2fa8315..a50378c 100644 --- a/dialer/ssh/metadata.go +++ b/dialer/ssh/metadata.go @@ -6,6 +6,7 @@ import ( mdata "github.com/go-gost/core/metadata" mdutil "github.com/go-gost/core/metadata/util" + "github.com/mitchellh/go-homedir" "golang.org/x/crypto/ssh" ) @@ -26,6 +27,10 @@ func (d *sshDialer) parseMetadata(md mdata.Metadata) (err error) { ) if key := mdutil.GetString(md, privateKeyFile); key != "" { + key, err = homedir.Expand(key) + if err != nil { + return err + } data, err := os.ReadFile(key) if err != nil { return err diff --git a/dialer/sshd/metadata.go b/dialer/sshd/metadata.go index 4a9b484..f06eea1 100644 --- a/dialer/sshd/metadata.go +++ b/dialer/sshd/metadata.go @@ -6,6 +6,7 @@ import ( mdata "github.com/go-gost/core/metadata" mdutil "github.com/go-gost/core/metadata/util" + "github.com/mitchellh/go-homedir" "golang.org/x/crypto/ssh" ) @@ -26,6 +27,10 @@ func (d *sshdDialer) parseMetadata(md mdata.Metadata) (err error) { ) if key := mdutil.GetString(md, privateKeyFile); key != "" { + key, err = homedir.Expand(key) + if err != nil { + return err + } data, err := os.ReadFile(key) if err != nil { return err diff --git a/go.mod b/go.mod index d4e06ab..ce7c107 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,8 @@ module github.com/go-gost/x -go 1.21 +go 1.22 + +toolchain go1.22.2 require ( github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 @@ -19,6 +21,7 @@ require ( github.com/google/uuid v1.4.0 github.com/gorilla/websocket v1.5.1 github.com/miekg/dns v1.1.57 + github.com/mitchellh/go-homedir v1.1.0 github.com/patrickmn/go-cache v2.1.0+incompatible github.com/pion/dtls/v2 v2.2.6 github.com/pires/go-proxyproto v0.7.0 @@ -114,3 +117,5 @@ require ( google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f // indirect gopkg.in/ini.v1 v1.67.0 // indirect ) + +replace github.com/go-gost/core => ../gost-core diff --git a/go.sum b/go.sum index d08bdff..0059b54 100644 --- a/go.sum +++ b/go.sum @@ -49,8 +49,6 @@ github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= -github.com/go-gost/core v0.0.0-20240131151724-a06608ccafbf h1:akQ96Ibm+P7IftDluZPoMCzBzbLR/TjFu8Wpjy3H7hM= -github.com/go-gost/core v0.0.0-20240131151724-a06608ccafbf/go.mod h1:ndkgWVYRLwupVaFFWv8ML1Nr8tD3xhHK245PLpUDg4E= github.com/go-gost/gosocks4 v0.0.1 h1:+k1sec8HlELuQV7rWftIkmy8UijzUt2I6t+iMPlGB2s= github.com/go-gost/gosocks4 v0.0.1/go.mod h1:3B6L47HbU/qugDg4JnoFPHgJXE43Inz8Bah1QaN9qCc= github.com/go-gost/gosocks5 v0.4.0 h1:EIrOEkpJez4gwHrMa33frA+hHXJyevjp47thpMQsJzI= @@ -135,6 +133,8 @@ github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zk github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/miekg/dns v1.1.57 h1:Jzi7ApEIzwEPLHWRcafCN9LZSBbqQpxjt/wpgvg7wcM= github.com/miekg/dns v1.1.57/go.mod h1:uqRjCRUuEAA6qsOiJvDd+CFo/vW+y5WR6SNmHE55hZk= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= diff --git a/listener/ssh/metadata.go b/listener/ssh/metadata.go index cb9c32e..c291f9f 100644 --- a/listener/ssh/metadata.go +++ b/listener/ssh/metadata.go @@ -6,6 +6,7 @@ import ( mdata "github.com/go-gost/core/metadata" mdutil "github.com/go-gost/core/metadata/util" ssh_util "github.com/go-gost/x/internal/util/ssh" + "github.com/mitchellh/go-homedir" "golang.org/x/crypto/ssh" ) @@ -29,6 +30,10 @@ func (l *sshListener) parseMetadata(md mdata.Metadata) (err error) { ) if key := mdutil.GetString(md, privateKeyFile); key != "" { + key, err = homedir.Expand(key) + if err != nil { + return err + } data, err := os.ReadFile(key) if err != nil { return err diff --git a/listener/sshd/metadata.go b/listener/sshd/metadata.go index f4d3497..4d2e5ed 100644 --- a/listener/sshd/metadata.go +++ b/listener/sshd/metadata.go @@ -6,6 +6,7 @@ import ( mdata "github.com/go-gost/core/metadata" mdutil "github.com/go-gost/core/metadata/util" ssh_util "github.com/go-gost/x/internal/util/ssh" + "github.com/mitchellh/go-homedir" "golang.org/x/crypto/ssh" ) @@ -29,6 +30,10 @@ func (l *sshdListener) parseMetadata(md mdata.Metadata) (err error) { ) if key := mdutil.GetString(md, privateKeyFile); key != "" { + key, err = homedir.Expand(key) + if err != nil { + return err + } data, err := os.ReadFile(key) if err != nil { return err From 7bf053724373e774a35c09783d457327c4ca3370 Mon Sep 17 00:00:00 2001 From: Christian Groschupp Date: Mon, 15 Apr 2024 21:41:54 +0200 Subject: [PATCH 3/8] feat: add redirect darwin support --- handler/redirect/tcp/handler_darwin.go | 64 ++++++++++++++++++++++++ handler/redirect/tcp/handler_other.go | 4 +- listener/redirect/tcp/listener_darwin.go | 9 ++++ listener/redirect/tcp/listener_other.go | 2 +- 4 files changed, 76 insertions(+), 3 deletions(-) create mode 100644 handler/redirect/tcp/handler_darwin.go create mode 100644 listener/redirect/tcp/listener_darwin.go diff --git a/handler/redirect/tcp/handler_darwin.go b/handler/redirect/tcp/handler_darwin.go new file mode 100644 index 0000000..2e71686 --- /dev/null +++ b/handler/redirect/tcp/handler_darwin.go @@ -0,0 +1,64 @@ +package redirect + +import ( + "fmt" + "net" + "os/exec" + "strconv" + "strings" +) + +func (h *redirectHandler) getOriginalDstAddr(conn net.Conn) (addr net.Addr, err error) { + host, port, err := localToRemote(conn) + if err != nil { + return nil, err + } + portNumber, _ := strconv.Atoi(port) + addr = &net.TCPAddr{ + IP: net.ParseIP(host), + Port: portNumber, + } + + return +} + +func localToRemote(clientConn net.Conn) (string, string, error) { + host, port, err := net.SplitHostPort(clientConn.RemoteAddr().String()) + if err != nil { + return "", "", err + } + out, err := exec.Command("sudo", "-n", "/sbin/pfctl", "-s", "state").Output() + if err != nil { + return "", "", err + } + remoteAddr, remotePort, err := translatePfctlOutput(host, port, string(out)) + if err != nil { + return "", "", err + } + return remoteAddr, remotePort, err +} + +func translatePfctlOutput(address string, port, s string) (string, string, error) { + // We may get an ipv4-mapped ipv6 address here, e.g. ::ffff:127.0.0.1. + // Those still appear as "127.0.0.1" in the table, so we need to strip the prefix. + // re := regexp.MustCompile(`^::ffff:((\d+\.\d+\.\d+\.\d+$))`) + // strippedAddress := re.ReplaceAllString(address, "") + strippedAddress := address + + // ALL tcp 192.168.1.13:57474 -> 23.205.82.58:443 ESTABLISHED:ESTABLISHED + spec := net.JoinHostPort(strippedAddress, port) + + lines := strings.Split(s, "\n") + for _, line := range lines { + if strings.Contains(line, "ESTABLISHED:ESTABLISHED") { + if strings.Contains(line, spec) { + fields := strings.Fields(line) + if len(fields) > 4 { + return net.SplitHostPort(fields[4]) + } + } + } + } + + return "", "", fmt.Errorf("could not resolve original destination") +} diff --git a/handler/redirect/tcp/handler_other.go b/handler/redirect/tcp/handler_other.go index c91c633..8b09c2d 100644 --- a/handler/redirect/tcp/handler_other.go +++ b/handler/redirect/tcp/handler_other.go @@ -1,4 +1,4 @@ -//go:build !linux +//go:build !linux && !darwin package redirect @@ -7,7 +7,7 @@ import ( "net" ) -func (h *redirectHandler) getOriginalDstAddr(conn net.Conn) (addr net.Addr, err error) { +func (h *redirectHandler) getOriginalDstAddr(_ net.Conn) (addr net.Addr, err error) { err = errors.New("TCP redirect is not available on non-linux platform") return } diff --git a/listener/redirect/tcp/listener_darwin.go b/listener/redirect/tcp/listener_darwin.go new file mode 100644 index 0000000..d42f002 --- /dev/null +++ b/listener/redirect/tcp/listener_darwin.go @@ -0,0 +1,9 @@ +package tcp + +import ( + "syscall" +) + +func (l *redirectListener) control(network, address string, c syscall.RawConn) error { + return nil +} diff --git a/listener/redirect/tcp/listener_other.go b/listener/redirect/tcp/listener_other.go index c065d19..7447113 100644 --- a/listener/redirect/tcp/listener_other.go +++ b/listener/redirect/tcp/listener_other.go @@ -1,4 +1,4 @@ -//go:build !linux +//go:build !linux && !darwin package tcp From 77a8f28edc09725665b970ebc36863a46795c60c Mon Sep 17 00:00:00 2001 From: Christian Groschupp Date: Mon, 15 Apr 2024 21:43:09 +0200 Subject: [PATCH 4/8] feat: add whitelist support --- bypass/bypass.go | 8 +++++++- bypass/plugin/grpc.go | 4 ++++ bypass/plugin/http.go | 4 ++++ registry/bypass.go | 8 ++++++++ 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/bypass/bypass.go b/bypass/bypass.go index ea4f131..3da5cb7 100644 --- a/bypass/bypass.go +++ b/bypass/bypass.go @@ -235,11 +235,17 @@ func (bp *localBypass) Contains(ctx context.Context, network, addr string, opts b := !bp.options.whitelist && matched || bp.options.whitelist && !matched if b { - bp.options.logger.Debugf("bypass: %s", addr) + bp.options.logger.Debugf("bypass: %s, whitelist: %t", addr, bp.options.whitelist) + } else { + bp.options.logger.Debugf("pass: %s, whitelist: %t", addr, bp.options.whitelist) } return b } +func (p *localBypass) IsWhitelist() bool { + return p.options.whitelist +} + func (bp *localBypass) parseLine(s string) string { if n := strings.IndexByte(s, '#'); n >= 0 { s = s[:n] diff --git a/bypass/plugin/grpc.go b/bypass/plugin/grpc.go index 37ad21f..d4d7250 100644 --- a/bypass/plugin/grpc.go +++ b/bypass/plugin/grpc.go @@ -75,3 +75,7 @@ func (p *grpcPlugin) Close() error { } return nil } + +func (p *grpcPlugin) IsWhitelist() bool { + return false +} diff --git a/bypass/plugin/http.go b/bypass/plugin/http.go index 2035251..17792fe 100644 --- a/bypass/plugin/http.go +++ b/bypass/plugin/http.go @@ -96,3 +96,7 @@ func (p *httpPlugin) Contains(ctx context.Context, network, addr string, opts .. } return res.OK } + +func (p *httpPlugin) IsWhitelist() bool { + return false +} diff --git a/registry/bypass.go b/registry/bypass.go index 3ad7b1e..59b167e 100644 --- a/registry/bypass.go +++ b/registry/bypass.go @@ -37,3 +37,11 @@ func (w *bypassWrapper) Contains(ctx context.Context, network, addr string, opts } return bp.Contains(ctx, network, addr, opts...) } + +func (p *bypassWrapper) IsWhitelist() bool { + bp := p.r.get(p.name) + if bp == nil { + return false + } + return bp.IsWhitelist() +} From 5ea88aa5cf2a11692a5067fecf2db223164de608 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Mar 2024 23:03:43 +0000 Subject: [PATCH 5/8] Bump google.golang.org/protobuf from 1.31.0 to 1.33.0 Bumps google.golang.org/protobuf from 1.31.0 to 1.33.0. --- updated-dependencies: - dependency-name: google.golang.org/protobuf dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index d4e06ab..fb1a5a6 100644 --- a/go.mod +++ b/go.mod @@ -42,7 +42,7 @@ require ( golang.org/x/time v0.5.0 golang.zx2c4.com/wireguard v0.0.0-20220703234212-c31a7b1ab478 google.golang.org/grpc v1.59.0 - google.golang.org/protobuf v1.31.0 + google.golang.org/protobuf v1.33.0 gopkg.in/natefinch/lumberjack.v2 v2.2.1 gopkg.in/yaml.v3 v3.0.1 ) diff --git a/go.sum b/go.sum index d08bdff..39ed2cd 100644 --- a/go.sum +++ b/go.sum @@ -371,8 +371,8 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= From d26bf4f05c29ee9142f0e549718a08fdc3179ab3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Apr 2024 14:18:51 +0000 Subject: [PATCH 6/8] Bump github.com/quic-go/quic-go from 0.40.1 to 0.42.0 Bumps [github.com/quic-go/quic-go](https://github.com/quic-go/quic-go) from 0.40.1 to 0.42.0. - [Release notes](https://github.com/quic-go/quic-go/releases) - [Changelog](https://github.com/quic-go/quic-go/blob/master/Changelog.md) - [Commits](https://github.com/quic-go/quic-go/compare/v0.40.1...v0.42.0) --- updated-dependencies: - dependency-name: github.com/quic-go/quic-go dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- go.mod | 5 ++--- go.sum | 10 ++++------ 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index fb1a5a6..1b60dee 100644 --- a/go.mod +++ b/go.mod @@ -23,7 +23,7 @@ require ( github.com/pion/dtls/v2 v2.2.6 github.com/pires/go-proxyproto v0.7.0 github.com/prometheus/client_golang v1.17.0 - github.com/quic-go/quic-go v0.40.1 + github.com/quic-go/quic-go v0.42.0 github.com/quic-go/webtransport-go v0.6.0 github.com/rs/xid v1.3.0 github.com/shadowsocks/go-shadowsocks2 v0.1.5 @@ -88,7 +88,6 @@ require ( github.com/prometheus/common v0.44.0 // indirect github.com/prometheus/procfs v0.11.1 // indirect github.com/quic-go/qpack v0.4.0 // indirect - github.com/quic-go/qtls-go1-20 v0.4.1 // indirect github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect @@ -103,7 +102,7 @@ require ( github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.11 // indirect github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df // indirect - go.uber.org/mock v0.3.0 // indirect + go.uber.org/mock v0.4.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/arch v0.6.0 // indirect golang.org/x/exp v0.0.0-20231219180239-dc181d75b848 // indirect diff --git a/go.sum b/go.sum index 39ed2cd..03a3bb1 100644 --- a/go.sum +++ b/go.sum @@ -180,10 +180,8 @@ github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwa github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= -github.com/quic-go/qtls-go1-20 v0.4.1 h1:D33340mCNDAIKBqXuAvexTNMUByrYmFYVfKfDN5nfFs= -github.com/quic-go/qtls-go1-20 v0.4.1/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k= -github.com/quic-go/quic-go v0.40.1 h1:X3AGzUNFs0jVuO3esAGnTfvdgvL4fq655WaOi1snv1Q= -github.com/quic-go/quic-go v0.40.1/go.mod h1:PeN7kuVJ4xZbxSv/4OX6S1USOX8MJvydwpTx31vx60c= +github.com/quic-go/quic-go v0.42.0 h1:uSfdap0eveIl8KXnipv9K7nlwZ5IqLlYOpJ58u5utpM= +github.com/quic-go/quic-go v0.42.0/go.mod h1:132kz4kL3F9vxhW3CtQJLDVwcFe5wdWeJXXijhsO57M= github.com/quic-go/webtransport-go v0.6.0 h1:CvNsKqc4W2HljHJnoT+rMmbRJybShZ0YPFDD3NxaZLY= github.com/quic-go/webtransport-go v0.6.0/go.mod h1:9KjU4AEBqEQidGHNDkZrb8CAa1abRaosM2yGOyiikEc= github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3 h1:f/FNXud6gA3MNr8meMVVGxhp+QBTqY91tM8HjEuMjGg= @@ -255,8 +253,8 @@ github.com/xtaci/tcpraw v1.2.25/go.mod h1:dKyZ2V75s0cZ7cbgJYdxPvms7af0joIeOyx1Gg github.com/yl2chen/cidranger v1.0.2 h1:lbOWZVCG1tCRX4u24kuM1Tb4nHqWkDxwLdoS+SevawU= github.com/yl2chen/cidranger v1.0.2/go.mod h1:9U1yz7WPYDwf0vpNWFaeRh0bjwz5RVgRy/9UEQfHl0g= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.uber.org/mock v0.3.0 h1:3mUxI1No2/60yUYax92Pt8eNOEecx2D3lcXZh2NEZJo= -go.uber.org/mock v0.3.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= +go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= +go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= From 66104cd079cea49445631bd31b992e150c62a84a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Apr 2024 14:46:46 +0000 Subject: [PATCH 7/8] Bump golang.org/x/net from 0.19.0 to 0.23.0 Bumps [golang.org/x/net](https://github.com/golang/net) from 0.19.0 to 0.23.0. - [Commits](https://github.com/golang/net/compare/v0.19.0...v0.23.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- go.mod | 6 +++--- go.sum | 16 ++++++++-------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/go.mod b/go.mod index d27d81c..4bc9dc1 100644 --- a/go.mod +++ b/go.mod @@ -40,9 +40,9 @@ require ( github.com/xtaci/tcpraw v1.2.25 github.com/yl2chen/cidranger v1.0.2 github.com/zalando/go-keyring v0.2.4 - golang.org/x/crypto v0.17.0 - golang.org/x/net v0.19.0 - golang.org/x/sys v0.15.0 + golang.org/x/crypto v0.21.0 + golang.org/x/net v0.23.0 + golang.org/x/sys v0.18.0 golang.org/x/time v0.5.0 golang.zx2c4.com/wireguard v0.0.0-20220703234212-c31a7b1ab478 google.golang.org/grpc v1.59.0 diff --git a/go.sum b/go.sum index 20d241a..19c4523 100644 --- a/go.sum +++ b/go.sum @@ -276,8 +276,8 @@ golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= -golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20231219180239-dc181d75b848 h1:+iq7lrkxmFNBM7xx+Rae2W6uyPfhPeDWD+n+JgppptE= golang.org/x/exp v0.0.0-20231219180239-dc181d75b848/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= @@ -300,8 +300,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -323,15 +323,15 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= -golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= From 254875cd30fc025e73abd5def569bbe4b63226ff Mon Sep 17 00:00:00 2001 From: ginuerzh Date: Wed, 24 Apr 2024 23:38:50 +0800 Subject: [PATCH 8/8] update go.mod --- go.mod | 4 +--- go.sum | 2 ++ service/status.go | 3 +++ 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 4bc9dc1..92c142d 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d github.com/gin-contrib/cors v1.5.0 github.com/gin-gonic/gin v1.9.1 - github.com/go-gost/core v0.0.0-20240131151724-a06608ccafbf + github.com/go-gost/core v0.0.0-20240424153155-5d6c2115fa15 github.com/go-gost/gosocks4 v0.0.1 github.com/go-gost/gosocks5 v0.4.0 github.com/go-gost/plugin v0.0.0-20240103125338-9c84e29cb81a @@ -120,5 +120,3 @@ require ( google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f // indirect gopkg.in/ini.v1 v1.67.0 // indirect ) - -replace github.com/go-gost/core => ../gost-core diff --git a/go.sum b/go.sum index 19c4523..e497d9c 100644 --- a/go.sum +++ b/go.sum @@ -53,6 +53,8 @@ github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= +github.com/go-gost/core v0.0.0-20240424153155-5d6c2115fa15 h1:X7rvyLzslfgA+A7VKlUr//l798na8ZywuFyGcGfDUl8= +github.com/go-gost/core v0.0.0-20240424153155-5d6c2115fa15/go.mod h1:j08tDHkFzk7dfOeLhl3RWsASdf9YWWRfWBUQqbQvx3A= github.com/go-gost/gosocks4 v0.0.1 h1:+k1sec8HlELuQV7rWftIkmy8UijzUt2I6t+iMPlGB2s= github.com/go-gost/gosocks4 v0.0.1/go.mod h1:3B6L47HbU/qugDg4JnoFPHgJXE43Inz8Bah1QaN9qCc= github.com/go-gost/gosocks5 v0.4.0 h1:EIrOEkpJez4gwHrMa33frA+hHXJyevjp47thpMQsJzI= diff --git a/service/status.go b/service/status.go index 0d3a913..424a77a 100644 --- a/service/status.go +++ b/service/status.go @@ -72,5 +72,8 @@ func (p *Status) addEvent(event Event) { } func (p *Status) Stats() *stats.Stats { + if p == nil { + return nil + } return p.stats }