diff --git a/cmd/gost/config.go b/cmd/gost/config.go index d20d8a2..7ff0e6d 100644 --- a/cmd/gost/config.go +++ b/cmd/gost/config.go @@ -6,13 +6,13 @@ import ( "github.com/go-gost/gost/pkg/bypass" "github.com/go-gost/gost/pkg/chain" - "github.com/go-gost/gost/pkg/components/connector" - "github.com/go-gost/gost/pkg/components/dialer" - "github.com/go-gost/gost/pkg/components/handler" - "github.com/go-gost/gost/pkg/components/listener" - "github.com/go-gost/gost/pkg/components/metadata" "github.com/go-gost/gost/pkg/config" + "github.com/go-gost/gost/pkg/connector" + "github.com/go-gost/gost/pkg/dialer" + "github.com/go-gost/gost/pkg/handler" + "github.com/go-gost/gost/pkg/listener" "github.com/go-gost/gost/pkg/logger" + "github.com/go-gost/gost/pkg/metadata" "github.com/go-gost/gost/pkg/registry" "github.com/go-gost/gost/pkg/service" ) diff --git a/cmd/gost/gost.yml b/cmd/gost/gost.yml index f245e4f..4c7542c 100644 --- a/cmd/gost/gost.yml +++ b/cmd/gost/gost.yml @@ -23,6 +23,23 @@ services: keepAlive: 15s chain: chain01 # bypass: bypass01 +- name: ss+tcp + url: "ss://chacha20:gost@:8000" + addr: ":8338" + handler: + type: ss + metadata: + method: AES-256-GCM + password: gost + key: gost + readTimeout: 5s + retry: 3 + listener: + type: tcp + metadata: + keepAlive: 15s + chain: chain01 + # bypass: bypass01 chains: - name: chain01 diff --git a/cmd/gost/register.go b/cmd/gost/register.go index 6872461..6f16f25 100644 --- a/cmd/gost/register.go +++ b/cmd/gost/register.go @@ -2,29 +2,29 @@ package main import ( // Register connectors - _ "github.com/go-gost/gost/pkg/components/connector/http" - _ "github.com/go-gost/gost/pkg/components/connector/ss" + _ "github.com/go-gost/gost/pkg/connector/http" + _ "github.com/go-gost/gost/pkg/connector/ss" // Register dialers - _ "github.com/go-gost/gost/pkg/components/dialer/tcp" + _ "github.com/go-gost/gost/pkg/dialer/tcp" // Register handlers - _ "github.com/go-gost/gost/pkg/components/handler/http" - _ "github.com/go-gost/gost/pkg/components/handler/ss" - _ "github.com/go-gost/gost/pkg/components/handler/ssu" + _ "github.com/go-gost/gost/pkg/handler/http" + _ "github.com/go-gost/gost/pkg/handler/ss" + _ "github.com/go-gost/gost/pkg/handler/ssu" // Register listeners - _ "github.com/go-gost/gost/pkg/components/listener/ftcp" - _ "github.com/go-gost/gost/pkg/components/listener/http2" - _ "github.com/go-gost/gost/pkg/components/listener/http2/h2" - _ "github.com/go-gost/gost/pkg/components/listener/kcp" - _ "github.com/go-gost/gost/pkg/components/listener/obfs/http" - _ "github.com/go-gost/gost/pkg/components/listener/obfs/tls" - _ "github.com/go-gost/gost/pkg/components/listener/quic" - _ "github.com/go-gost/gost/pkg/components/listener/tcp" - _ "github.com/go-gost/gost/pkg/components/listener/tls" - _ "github.com/go-gost/gost/pkg/components/listener/tls/mux" - _ "github.com/go-gost/gost/pkg/components/listener/udp" - _ "github.com/go-gost/gost/pkg/components/listener/ws" - _ "github.com/go-gost/gost/pkg/components/listener/ws/mux" + _ "github.com/go-gost/gost/pkg/listener/ftcp" + _ "github.com/go-gost/gost/pkg/listener/http2" + _ "github.com/go-gost/gost/pkg/listener/http2/h2" + _ "github.com/go-gost/gost/pkg/listener/kcp" + _ "github.com/go-gost/gost/pkg/listener/obfs/http" + _ "github.com/go-gost/gost/pkg/listener/obfs/tls" + _ "github.com/go-gost/gost/pkg/listener/quic" + _ "github.com/go-gost/gost/pkg/listener/tcp" + _ "github.com/go-gost/gost/pkg/listener/tls" + _ "github.com/go-gost/gost/pkg/listener/tls/mux" + _ "github.com/go-gost/gost/pkg/listener/udp" + _ "github.com/go-gost/gost/pkg/listener/ws" + _ "github.com/go-gost/gost/pkg/listener/ws/mux" ) diff --git a/pkg/chain/route.go b/pkg/chain/route.go index dbaa3d0..6b02392 100644 --- a/pkg/chain/route.go +++ b/pkg/chain/route.go @@ -101,6 +101,10 @@ func (r *Route) Last() *Node { } func (r *Route) Path() (path []*Node) { + if r == nil || len(r.nodes) == 0 { + return nil + } + for _, node := range r.nodes { if node.transport != nil && node.transport.route != nil { path = append(path, node.transport.route.Path()...) diff --git a/pkg/chain/transport.go b/pkg/chain/transport.go index 305d516..60d0a0f 100644 --- a/pkg/chain/transport.go +++ b/pkg/chain/transport.go @@ -4,8 +4,8 @@ import ( "context" "net" - "github.com/go-gost/gost/pkg/components/connector" - "github.com/go-gost/gost/pkg/components/dialer" + "github.com/go-gost/gost/pkg/connector" + "github.com/go-gost/gost/pkg/dialer" ) type Transport struct { diff --git a/pkg/components/connector/ss/connector.go b/pkg/components/connector/ss/connector.go deleted file mode 100644 index 0436e8d..0000000 --- a/pkg/components/connector/ss/connector.go +++ /dev/null @@ -1,47 +0,0 @@ -package ss - -import ( - "context" - "net" - - "github.com/go-gost/gost/pkg/components/connector" - md "github.com/go-gost/gost/pkg/components/metadata" - "github.com/go-gost/gost/pkg/logger" - "github.com/go-gost/gost/pkg/registry" -) - -func init() { - registry.RegiserConnector("ss", NewConnector) -} - -type Connector struct { - md metadata - logger logger.Logger -} - -func NewConnector(opts ...connector.Option) connector.Connector { - options := &connector.Options{} - for _, opt := range opts { - opt(options) - } - - return &Connector{ - logger: options.Logger, - } -} - -func (c *Connector) Init(md md.Metadata) (err error) { - return c.parseMetadata(md) -} - -func (c *Connector) Connect(ctx context.Context, conn net.Conn, network, address string, opts ...connector.ConnectOption) (net.Conn, error) { - - return conn, nil -} - -func (c *Connector) parseMetadata(md md.Metadata) (err error) { - c.md.method = md.GetString(method) - c.md.password = md.GetString(password) - - return -} diff --git a/pkg/components/connector/ss/metadata.go b/pkg/components/connector/ss/metadata.go deleted file mode 100644 index 7143faf..0000000 --- a/pkg/components/connector/ss/metadata.go +++ /dev/null @@ -1,11 +0,0 @@ -package ss - -const ( - method = "method" - password = "password" -) - -type metadata struct { - method string - password string -} diff --git a/pkg/components/connector/connector.go b/pkg/connector/connector.go similarity index 85% rename from pkg/components/connector/connector.go rename to pkg/connector/connector.go index 118c0ce..7a5c7cb 100644 --- a/pkg/components/connector/connector.go +++ b/pkg/connector/connector.go @@ -4,7 +4,7 @@ import ( "context" "net" - "github.com/go-gost/gost/pkg/components/metadata" + "github.com/go-gost/gost/pkg/metadata" ) // Connector is responsible for connecting to the destination address. diff --git a/pkg/components/connector/http/connector.go b/pkg/connector/http/connector.go similarity index 91% rename from pkg/components/connector/http/connector.go rename to pkg/connector/http/connector.go index 3eff3c8..c399d9f 100644 --- a/pkg/components/connector/http/connector.go +++ b/pkg/connector/http/connector.go @@ -11,9 +11,9 @@ import ( "net/url" "strings" - "github.com/go-gost/gost/pkg/components/connector" - md "github.com/go-gost/gost/pkg/components/metadata" + "github.com/go-gost/gost/pkg/connector" "github.com/go-gost/gost/pkg/logger" + md "github.com/go-gost/gost/pkg/metadata" "github.com/go-gost/gost/pkg/registry" ) @@ -56,9 +56,11 @@ func (c *httpConnector) Connect(ctx context.Context, conn net.Conn, network, add req.Header.Set("Proxy-Connection", "keep-alive") c.logger = c.logger.WithFields(map[string]interface{}{ - "src": conn.LocalAddr().String(), - "dst": conn.RemoteAddr().String(), + "local": conn.LocalAddr().String(), + "remote": conn.RemoteAddr().String(), + "target": address, }) + c.logger.Infof("connect: ", address) if user := c.md.User; user != nil { u := user.Username() diff --git a/pkg/components/connector/http/metadata.go b/pkg/connector/http/metadata.go similarity index 100% rename from pkg/components/connector/http/metadata.go rename to pkg/connector/http/metadata.go diff --git a/pkg/components/connector/option.go b/pkg/connector/option.go similarity index 100% rename from pkg/components/connector/option.go rename to pkg/connector/option.go diff --git a/pkg/connector/ss/connector.go b/pkg/connector/ss/connector.go new file mode 100644 index 0000000..8755970 --- /dev/null +++ b/pkg/connector/ss/connector.go @@ -0,0 +1,99 @@ +package ss + +import ( + "context" + "net" + "time" + + "github.com/go-gost/gosocks5" + "github.com/go-gost/gost/pkg/connector" + "github.com/go-gost/gost/pkg/internal/bufpool" + "github.com/go-gost/gost/pkg/internal/utils" + "github.com/go-gost/gost/pkg/logger" + md "github.com/go-gost/gost/pkg/metadata" + "github.com/go-gost/gost/pkg/registry" +) + +func init() { + registry.RegiserConnector("ss", NewConnector) +} + +type Connector struct { + md metadata + logger logger.Logger +} + +func NewConnector(opts ...connector.Option) connector.Connector { + options := &connector.Options{} + for _, opt := range opts { + opt(options) + } + + return &Connector{ + logger: options.Logger, + } +} + +func (c *Connector) Init(md md.Metadata) (err error) { + return c.parseMetadata(md) +} + +func (c *Connector) Connect(ctx context.Context, conn net.Conn, network, address string, opts ...connector.ConnectOption) (net.Conn, error) { + c.logger = c.logger.WithFields(map[string]interface{}{ + "remote": conn.RemoteAddr().String(), + "local": conn.LocalAddr().String(), + "target": address, + }) + c.logger.Infof("connect: ", address) + + socksAddr, err := gosocks5.NewAddr(address) + if err != nil { + c.logger.Error("parse addr: ", err) + return nil, err + } + rawaddr := bufpool.Get(512) + defer bufpool.Put(rawaddr) + + n, err := socksAddr.Encode(rawaddr) + if err != nil { + c.logger.Error("encoding addr: ", err) + return nil, err + } + + conn.SetDeadline(time.Now().Add(c.md.connectTimeout)) + defer conn.SetDeadline(time.Time{}) + + if c.md.cipher != nil { + conn = c.md.cipher.StreamConn(conn) + } + + var sc net.Conn + if c.md.noDelay { + sc = utils.ShadowConn(conn, nil) + // write the addr at once. + if _, err := sc.Write(rawaddr[:n]); err != nil { + return nil, err + } + } else { + // cache the header + sc = utils.ShadowConn(conn, rawaddr[:n]) + } + + return sc, nil +} + +func (c *Connector) parseMetadata(md md.Metadata) (err error) { + c.md.cipher, err = utils.ShadowCipher( + md.GetString(method), + md.GetString(password), + md.GetString(key), + ) + if err != nil { + return + } + + c.md.connectTimeout = md.GetDuration(connectTimeout) + c.md.noDelay = md.GetBool(noDelay) + + return +} diff --git a/pkg/connector/ss/metadata.go b/pkg/connector/ss/metadata.go new file mode 100644 index 0000000..1b01380 --- /dev/null +++ b/pkg/connector/ss/metadata.go @@ -0,0 +1,21 @@ +package ss + +import ( + "time" + + "github.com/shadowsocks/go-shadowsocks2/core" +) + +const ( + method = "method" + password = "password" + key = "key" + connectTimeout = "timeout" + noDelay = "noDelay" +) + +type metadata struct { + cipher core.Cipher + connectTimeout time.Duration + noDelay bool +} diff --git a/pkg/components/dialer/dialer.go b/pkg/dialer/dialer.go similarity index 88% rename from pkg/components/dialer/dialer.go rename to pkg/dialer/dialer.go index cab257d..03b6204 100644 --- a/pkg/components/dialer/dialer.go +++ b/pkg/dialer/dialer.go @@ -4,7 +4,7 @@ import ( "context" "net" - "github.com/go-gost/gost/pkg/components/metadata" + "github.com/go-gost/gost/pkg/metadata" ) // Transporter is responsible for dialing to the proxy server. diff --git a/pkg/components/dialer/option.go b/pkg/dialer/option.go similarity index 100% rename from pkg/components/dialer/option.go rename to pkg/dialer/option.go diff --git a/pkg/components/dialer/tcp/dialer.go b/pkg/dialer/tcp/dialer.go similarity index 93% rename from pkg/components/dialer/tcp/dialer.go rename to pkg/dialer/tcp/dialer.go index cdc146b..c816431 100644 --- a/pkg/components/dialer/tcp/dialer.go +++ b/pkg/dialer/tcp/dialer.go @@ -4,9 +4,9 @@ import ( "context" "net" - "github.com/go-gost/gost/pkg/components/dialer" - md "github.com/go-gost/gost/pkg/components/metadata" + "github.com/go-gost/gost/pkg/dialer" "github.com/go-gost/gost/pkg/logger" + md "github.com/go-gost/gost/pkg/metadata" "github.com/go-gost/gost/pkg/registry" ) diff --git a/pkg/components/dialer/tcp/metadata.go b/pkg/dialer/tcp/metadata.go similarity index 100% rename from pkg/components/dialer/tcp/metadata.go rename to pkg/dialer/tcp/metadata.go diff --git a/pkg/components/handler/handler.go b/pkg/handler/handler.go similarity index 73% rename from pkg/components/handler/handler.go rename to pkg/handler/handler.go index 93c1cb1..610c868 100644 --- a/pkg/components/handler/handler.go +++ b/pkg/handler/handler.go @@ -4,7 +4,7 @@ import ( "context" "net" - "github.com/go-gost/gost/pkg/components/metadata" + "github.com/go-gost/gost/pkg/metadata" ) type Handler interface { diff --git a/pkg/components/handler/http/handler.go b/pkg/handler/http/handler.go similarity index 88% rename from pkg/components/handler/http/handler.go rename to pkg/handler/http/handler.go index 85e50b4..d912965 100644 --- a/pkg/components/handler/http/handler.go +++ b/pkg/handler/http/handler.go @@ -20,9 +20,9 @@ import ( "github.com/go-gost/gost/pkg/auth" "github.com/go-gost/gost/pkg/bypass" "github.com/go-gost/gost/pkg/chain" - "github.com/go-gost/gost/pkg/components/handler" - md "github.com/go-gost/gost/pkg/components/metadata" + "github.com/go-gost/gost/pkg/handler" "github.com/go-gost/gost/pkg/logger" + md "github.com/go-gost/gost/pkg/metadata" "github.com/go-gost/gost/pkg/registry" ) @@ -89,11 +89,20 @@ func (h *httpHandler) parseMetadata(md md.Metadata) error { func (h *httpHandler) Handle(ctx context.Context, conn net.Conn) { defer conn.Close() + start := time.Now() + h.logger = h.logger.WithFields(map[string]interface{}{ - "src": conn.RemoteAddr().String(), - "local": conn.LocalAddr().String(), + "remote": conn.RemoteAddr().String(), + "local": conn.LocalAddr().String(), }) + h.logger.Infof("%s <> %s", conn.RemoteAddr(), conn.LocalAddr()) + defer func() { + h.logger.WithFields(map[string]interface{}{ + "duration": time.Since(start), + }).Infof("%s >< %s", conn.RemoteAddr(), conn.LocalAddr()) + }() + req, err := http.ReadRequest(bufio.NewReader(conn)) if err != nil { h.logger.Error(err) @@ -109,7 +118,8 @@ func (h *httpHandler) handleRequest(ctx context.Context, conn net.Conn, req *htt return } - // try to get the actual host. + // Try to get the actual host. + // Compatible with GOST 2.x. if v := req.Header.Get("Gost-Target"); v != "" { if h, err := h.decodeServerName(v); err == nil { req.Host = h @@ -117,6 +127,13 @@ func (h *httpHandler) handleRequest(ctx context.Context, conn net.Conn, req *htt } req.Header.Del("Gost-Target") + if v := req.Header.Get("X-Gost-Target"); v != "" { + if h, err := h.decodeServerName(v); err == nil { + req.Host = h + } + } + req.Header.Del("X-Gost-Target") + host := req.Host if _, port, _ := net.SplitHostPort(host); port == "" { host = net.JoinHostPort(host, "80") @@ -134,6 +151,7 @@ func (h *httpHandler) handleRequest(ctx context.Context, conn net.Conn, req *htt dump, _ := httputil.DumpRequest(req, false) h.logger.Debug(string(dump)) } + h.logger.Infof("%s > %s", conn.RemoteAddr(), host) resp := &http.Response{ ProtoMajor: 1, @@ -202,7 +220,6 @@ func (h *httpHandler) handleRequest(ctx context.Context, conn net.Conn, req *htt dump, _ := httputil.DumpResponse(resp, false) h.logger.Debug(string(dump)) } - h.logger.Error(err) return } defer cc.Close() @@ -227,7 +244,9 @@ func (h *httpHandler) handleRequest(ctx context.Context, conn net.Conn, req *htt } } + h.logger.Infof("%s <> %s", conn.RemoteAddr(), host) handler.Transport(conn, cc) + h.logger.Infof("%s >< %s", conn.RemoteAddr(), host) } func (h *httpHandler) dial(ctx context.Context, addr string) (conn net.Conn, err error) { @@ -239,12 +258,14 @@ func (h *httpHandler) dial(ctx context.Context, addr string) (conn net.Conn, err for i := 0; i < count; i++ { route := h.chain.GetRouteFor(addr) - buf := bytes.Buffer{} - for _, node := range route.Path() { - fmt.Fprintf(&buf, "%s@%s -> ", node.Name(), node.Addr()) + if h.logger.IsLevelEnabled(logger.DebugLevel) { + buf := bytes.Buffer{} + for _, node := range route.Path() { + fmt.Fprintf(&buf, "%s@%s > ", node.Name(), node.Addr()) + } + fmt.Fprintf(&buf, "%s", addr) + h.logger.Debugf("route(retry=%d): %s", i, buf.String()) } - fmt.Fprintf(&buf, "%s", addr) - h.logger.Infof("route(retry=%d): %s", i, buf.String()) /* // forward http request diff --git a/pkg/components/handler/http/metadata.go b/pkg/handler/http/metadata.go similarity index 100% rename from pkg/components/handler/http/metadata.go rename to pkg/handler/http/metadata.go diff --git a/pkg/components/handler/option.go b/pkg/handler/option.go similarity index 100% rename from pkg/components/handler/option.go rename to pkg/handler/option.go diff --git a/pkg/components/handler/ss/handler.go b/pkg/handler/ss/handler.go similarity index 51% rename from pkg/components/handler/ss/handler.go rename to pkg/handler/ss/handler.go index b30d7bd..5ddd81d 100644 --- a/pkg/components/handler/ss/handler.go +++ b/pkg/handler/ss/handler.go @@ -3,18 +3,20 @@ package ss import ( "bytes" "context" + "fmt" + "io" + "io/ioutil" "net" "time" "github.com/go-gost/gosocks5" "github.com/go-gost/gost/pkg/bypass" "github.com/go-gost/gost/pkg/chain" - "github.com/go-gost/gost/pkg/components/handler" - md "github.com/go-gost/gost/pkg/components/metadata" + "github.com/go-gost/gost/pkg/handler" + "github.com/go-gost/gost/pkg/internal/utils" "github.com/go-gost/gost/pkg/logger" + md "github.com/go-gost/gost/pkg/metadata" "github.com/go-gost/gost/pkg/registry" - "github.com/shadowsocks/go-shadowsocks2/core" - ss "github.com/shadowsocks/shadowsocks-go/shadowsocks" ) func init() { @@ -48,34 +50,45 @@ func (h *ssHandler) Init(md md.Metadata) (err error) { func (h *ssHandler) Handle(ctx context.Context, conn net.Conn) { defer conn.Close() + start := time.Now() + h.logger = h.logger.WithFields(map[string]interface{}{ - "src": conn.RemoteAddr().String(), - "local": conn.LocalAddr().String(), + "remote": conn.RemoteAddr().String(), + "local": conn.LocalAddr().String(), }) + h.logger.Infof("%s <> %s", conn.RemoteAddr(), conn.LocalAddr()) + defer func() { + h.logger.WithFields(map[string]interface{}{ + "duration": time.Since(start), + }).Infof("%s >< %s", conn.RemoteAddr(), conn.LocalAddr()) + }() + + sc := conn if h.md.cipher != nil { - conn = &shadowConn{ - Conn: h.md.cipher.StreamConn(conn), - } + sc = utils.ShadowConn(h.md.cipher.StreamConn(conn), nil) } if h.md.readTimeout > 0 { - conn.SetReadDeadline(time.Now().Add(h.md.readTimeout)) + sc.SetReadDeadline(time.Now().Add(h.md.readTimeout)) } addr := &gosocks5.Addr{} - _, err := addr.ReadFrom(conn) + _, err := addr.ReadFrom(sc) if err != nil { h.logger.Error(err) + h.discard(conn) return } - conn.SetReadDeadline(time.Time{}) + sc.SetReadDeadline(time.Time{}) h.logger = h.logger.WithFields(map[string]interface{}{ "dst": addr.String(), }) + h.logger.Infof("%s > %s", conn.RemoteAddr(), addr) + if h.bypass != nil && h.bypass.Contains(addr.String()) { h.logger.Info("bypass: ", addr.String()) return @@ -83,16 +96,21 @@ func (h *ssHandler) Handle(ctx context.Context, conn net.Conn) { cc, err := h.dial(ctx, addr.String()) if err != nil { - h.logger.Error(err) return } defer cc.Close() - handler.Transport(conn, cc) + h.logger.Infof("%s <> %s", conn.RemoteAddr(), addr) + handler.Transport(sc, cc) + h.logger.Infof("%s >< %s", conn.RemoteAddr(), addr) +} + +func (h *ssHandler) discard(conn net.Conn) { + io.Copy(ioutil.Discard, conn) } func (h *ssHandler) parseMetadata(md md.Metadata) (err error) { - h.md.cipher, err = h.initCipher( + h.md.cipher, err = utils.ShadowCipher( md.GetString(method), md.GetString(password), md.GetString(key), @@ -115,16 +133,14 @@ func (h *ssHandler) dial(ctx context.Context, addr string) (conn net.Conn, err e for i := 0; i < count; i++ { route := h.chain.GetRouteFor(addr) - /* + if h.logger.IsLevelEnabled(logger.DebugLevel) { buf := bytes.Buffer{} - fmt.Fprintf(&buf, "%s -> %s -> ", - conn.RemoteAddr(), h.options.Node.String()) - for _, nd := range route.route { - fmt.Fprintf(&buf, "%d@%s -> ", nd.ID, nd.String()) + for _, node := range route.Path() { + fmt.Fprintf(&buf, "%s@%s > ", node.Name(), node.Addr()) } - fmt.Fprintf(&buf, "%s", host) - log.Log("[route]", buf.String()) - */ + fmt.Fprintf(&buf, "%s", addr) + h.logger.Debugf("route(retry=%d): %s", i, buf.String()) + } conn, err = route.Dial(ctx, "tcp", addr) if err == nil { @@ -135,47 +151,3 @@ func (h *ssHandler) dial(ctx context.Context, addr string) (conn net.Conn, err e return } - -func (h *ssHandler) initCipher(method, password string, key string) (core.Cipher, error) { - if method == "" && password == "" { - return nil, nil - } - - c, _ := ss.NewCipher(method, password) - if c != nil { - return &shadowCipher{cipher: c}, nil - } - - return core.PickCipher(method, []byte(key), password) -} - -type shadowCipher struct { - cipher *ss.Cipher -} - -func (c *shadowCipher) StreamConn(conn net.Conn) net.Conn { - return ss.NewConn(conn, c.cipher.Copy()) -} - -func (c *shadowCipher) PacketConn(conn net.PacketConn) net.PacketConn { - return ss.NewSecurePacketConn(conn, c.cipher.Copy()) -} - -// Due to in/out byte length is inconsistent of the shadowsocks.Conn.Write, -// we wrap around it to make io.Copy happy. -type shadowConn struct { - net.Conn - wbuf bytes.Buffer -} - -func (c *shadowConn) Write(b []byte) (n int, err error) { - n = len(b) // force byte length consistent - if c.wbuf.Len() > 0 { - c.wbuf.Write(b) // append the data to the cached header - _, err = c.Conn.Write(c.wbuf.Bytes()) - c.wbuf.Reset() - return - } - _, err = c.Conn.Write(b) - return -} diff --git a/pkg/components/handler/ss/metadata.go b/pkg/handler/ss/metadata.go similarity index 100% rename from pkg/components/handler/ss/metadata.go rename to pkg/handler/ss/metadata.go diff --git a/pkg/components/handler/ssu/handler.go b/pkg/handler/ssu/handler.go similarity index 75% rename from pkg/components/handler/ssu/handler.go rename to pkg/handler/ssu/handler.go index 694a6cb..1182f4d 100644 --- a/pkg/components/handler/ssu/handler.go +++ b/pkg/handler/ssu/handler.go @@ -4,9 +4,9 @@ import ( "context" "net" - "github.com/go-gost/gost/pkg/components/handler" - md "github.com/go-gost/gost/pkg/components/metadata" + "github.com/go-gost/gost/pkg/handler" "github.com/go-gost/gost/pkg/logger" + md "github.com/go-gost/gost/pkg/metadata" "github.com/go-gost/gost/pkg/registry" "github.com/shadowsocks/go-shadowsocks2/core" ss "github.com/shadowsocks/shadowsocks-go/shadowsocks" @@ -16,7 +16,7 @@ func init() { registry.RegisterHandler("ssu", NewHandler) } -type Handler struct { +type ssuHandler struct { logger logger.Logger md metadata } @@ -27,20 +27,20 @@ func NewHandler(opts ...handler.Option) handler.Handler { opt(options) } - return &Handler{ + return &ssuHandler{ logger: options.Logger, } } -func (h *Handler) Init(md md.Metadata) (err error) { +func (h *ssuHandler) Init(md md.Metadata) (err error) { return h.parseMetadata(md) } -func (h *Handler) Handle(ctx context.Context, conn net.Conn) { +func (h *ssuHandler) Handle(ctx context.Context, conn net.Conn) { defer conn.Close() } -func (h *Handler) parseMetadata(md md.Metadata) (err error) { +func (h *ssuHandler) parseMetadata(md md.Metadata) (err error) { h.md.cipher, err = h.initCipher( md.GetString(method), md.GetString(password), @@ -55,7 +55,7 @@ func (h *Handler) parseMetadata(md md.Metadata) (err error) { return } -func (h *Handler) initCipher(method, password string, key string) (core.Cipher, error) { +func (h *ssuHandler) initCipher(method, password string, key string) (core.Cipher, error) { if method == "" && password == "" { return nil, nil } diff --git a/pkg/components/handler/ssu/metadata.go b/pkg/handler/ssu/metadata.go similarity index 100% rename from pkg/components/handler/ssu/metadata.go rename to pkg/handler/ssu/metadata.go diff --git a/pkg/components/handler/transport.go b/pkg/handler/transport.go similarity index 100% rename from pkg/components/handler/transport.go rename to pkg/handler/transport.go diff --git a/pkg/internal/bufpool/pool.go b/pkg/internal/bufpool/pool.go new file mode 100644 index 0000000..23f1504 --- /dev/null +++ b/pkg/internal/bufpool/pool.go @@ -0,0 +1,100 @@ +package bufpool + +import "sync" + +var ( + smallBufferSize = 1 * 1024 // 1KB buffer + mediumBufferSize = 8 * 1024 // 8KB buffer + largeBufferSize = 64 * 1024 // 64KB buffer +) + +var ( + pools = []struct { + size int + pool sync.Pool + }{ + { + size: 128, + pool: sync.Pool{ + New: func() interface{} { + return make([]byte, 128) + }, + }, + }, + { + size: 512, + pool: sync.Pool{ + New: func() interface{} { + return make([]byte, 512) + }, + }, + }, + { + size: 1024, + pool: sync.Pool{ + New: func() interface{} { + return make([]byte, 1024) + }, + }, + }, + { + size: 4096, + pool: sync.Pool{ + New: func() interface{} { + return make([]byte, 4096) + }, + }, + }, + { + size: 8192, + pool: sync.Pool{ + New: func() interface{} { + return make([]byte, 8192) + }, + }, + }, + { + size: 16 * 1024, + pool: sync.Pool{ + New: func() interface{} { + return make([]byte, 16*1024) + }, + }, + }, + { + size: 32 * 1024, + pool: sync.Pool{ + New: func() interface{} { + return make([]byte, 32*1024) + }, + }, + }, + { + size: 64 * 1024, + pool: sync.Pool{ + New: func() interface{} { + return make([]byte, 64*1024) + }, + }, + }, + } +) + +// Get returns a buffer size range from (0, 64]KB, +// panic if size > 64KB. +func Get(size int) []byte { + for i := range pools { + if size <= pools[i].size { + return pools[i].pool.Get().([]byte) + } + } + panic("size too large (max=64KB)") +} + +func Put(b []byte) { + for i := range pools { + if len(b) == pools[i].size { + pools[i].pool.Put(b) + } + } +} diff --git a/pkg/components/internal/utils/kcp.go b/pkg/internal/utils/kcp.go similarity index 100% rename from pkg/components/internal/utils/kcp.go rename to pkg/internal/utils/kcp.go diff --git a/pkg/components/internal/utils/quic.go b/pkg/internal/utils/quic.go similarity index 100% rename from pkg/components/internal/utils/quic.go rename to pkg/internal/utils/quic.go diff --git a/pkg/internal/utils/ss.go b/pkg/internal/utils/ss.go new file mode 100644 index 0000000..14f1650 --- /dev/null +++ b/pkg/internal/utils/ss.go @@ -0,0 +1,60 @@ +package utils + +import ( + "bytes" + "net" + + "github.com/shadowsocks/go-shadowsocks2/core" + ss "github.com/shadowsocks/shadowsocks-go/shadowsocks" +) + +type shadowCipher struct { + cipher *ss.Cipher +} + +func (c *shadowCipher) StreamConn(conn net.Conn) net.Conn { + return ss.NewConn(conn, c.cipher.Copy()) +} + +func (c *shadowCipher) PacketConn(conn net.PacketConn) net.PacketConn { + return ss.NewSecurePacketConn(conn, c.cipher.Copy()) +} + +func ShadowCipher(method, password string, key string) (core.Cipher, error) { + if method == "" && password == "" { + return nil, nil + } + + c, _ := ss.NewCipher(method, password) + if c != nil { + return &shadowCipher{cipher: c}, nil + } + + return core.PickCipher(method, []byte(key), password) +} + +// Due to in/out byte length is inconsistent of the shadowsocks.Conn.Write, +// we wrap around it to make io.Copy happy. +type shadowConn struct { + net.Conn + wbuf *bytes.Buffer +} + +func ShadowConn(conn net.Conn, header []byte) net.Conn { + return &shadowConn{ + Conn: conn, + wbuf: bytes.NewBuffer(header), + } +} + +func (c *shadowConn) Write(b []byte) (n int, err error) { + n = len(b) // force byte length consistent + if c.wbuf.Len() > 0 { + c.wbuf.Write(b) // append the data to the cached header + _, err = c.Conn.Write(c.wbuf.Bytes()) + c.wbuf.Reset() + return + } + _, err = c.Conn.Write(b) + return +} diff --git a/pkg/components/internal/utils/tcp.go b/pkg/internal/utils/tcp.go similarity index 100% rename from pkg/components/internal/utils/tcp.go rename to pkg/internal/utils/tcp.go diff --git a/pkg/components/internal/utils/tls.go b/pkg/internal/utils/tls.go similarity index 100% rename from pkg/components/internal/utils/tls.go rename to pkg/internal/utils/tls.go diff --git a/pkg/components/internal/utils/ws.go b/pkg/internal/utils/ws.go similarity index 100% rename from pkg/components/internal/utils/ws.go rename to pkg/internal/utils/ws.go diff --git a/pkg/components/listener/ftcp/conn.go b/pkg/listener/ftcp/conn.go similarity index 100% rename from pkg/components/listener/ftcp/conn.go rename to pkg/listener/ftcp/conn.go diff --git a/pkg/components/listener/ftcp/listener.go b/pkg/listener/ftcp/listener.go similarity index 85% rename from pkg/components/listener/ftcp/listener.go rename to pkg/listener/ftcp/listener.go index cd7f69d..c8813a2 100644 --- a/pkg/components/listener/ftcp/listener.go +++ b/pkg/listener/ftcp/listener.go @@ -5,9 +5,9 @@ import ( "sync" "sync/atomic" - "github.com/go-gost/gost/pkg/components/listener" - md "github.com/go-gost/gost/pkg/components/metadata" + "github.com/go-gost/gost/pkg/listener" "github.com/go-gost/gost/pkg/logger" + md "github.com/go-gost/gost/pkg/metadata" "github.com/go-gost/gost/pkg/registry" "github.com/xtaci/tcpraw" ) @@ -16,7 +16,7 @@ func init() { registry.RegisterListener("ftcp", NewListener) } -type Listener struct { +type ftcpListener struct { addr string md metadata conn net.PacketConn @@ -31,13 +31,13 @@ func NewListener(opts ...listener.Option) listener.Listener { for _, opt := range opts { opt(options) } - return &Listener{ + return &ftcpListener{ addr: options.Addr, logger: options.Logger, } } -func (l *Listener) Init(md md.Metadata) (err error) { +func (l *ftcpListener) Init(md md.Metadata) (err error) { if err = l.parseMetadata(md); err != nil { return } @@ -55,7 +55,7 @@ func (l *Listener) Init(md md.Metadata) (err error) { return } -func (l *Listener) Accept() (conn net.Conn, err error) { +func (l *ftcpListener) Accept() (conn net.Conn, err error) { var ok bool select { case conn = <-l.connChan: @@ -67,7 +67,7 @@ func (l *Listener) Accept() (conn net.Conn, err error) { return } -func (l *Listener) Close() error { +func (l *ftcpListener) Close() error { err := l.conn.Close() l.connPool.Range(func(k interface{}, v *serverConn) bool { v.Close() @@ -76,11 +76,11 @@ func (l *Listener) Close() error { return err } -func (l *Listener) Addr() net.Addr { +func (l *ftcpListener) Addr() net.Addr { return l.conn.LocalAddr() } -func (l *Listener) listenLoop() { +func (l *ftcpListener) listenLoop() { for { b := make([]byte, l.md.readBufferSize) @@ -119,7 +119,7 @@ func (l *Listener) listenLoop() { } } -func (l *Listener) parseMetadata(md md.Metadata) (err error) { +func (l *ftcpListener) parseMetadata(md md.Metadata) (err error) { return } diff --git a/pkg/components/listener/ftcp/metadata.go b/pkg/listener/ftcp/metadata.go similarity index 100% rename from pkg/components/listener/ftcp/metadata.go rename to pkg/listener/ftcp/metadata.go diff --git a/pkg/components/listener/http2/conn.go b/pkg/listener/http2/conn.go similarity index 100% rename from pkg/components/listener/http2/conn.go rename to pkg/listener/http2/conn.go diff --git a/pkg/components/listener/http2/h2/conn.go b/pkg/listener/http2/h2/conn.go similarity index 100% rename from pkg/components/listener/http2/h2/conn.go rename to pkg/listener/http2/h2/conn.go diff --git a/pkg/components/listener/http2/h2/listener.go b/pkg/listener/http2/h2/listener.go similarity index 85% rename from pkg/components/listener/http2/h2/listener.go rename to pkg/listener/http2/h2/listener.go index 89d1161..daae128 100644 --- a/pkg/components/listener/http2/h2/listener.go +++ b/pkg/listener/http2/h2/listener.go @@ -7,10 +7,10 @@ import ( "net/http" "time" - "github.com/go-gost/gost/pkg/components/internal/utils" - "github.com/go-gost/gost/pkg/components/listener" - md "github.com/go-gost/gost/pkg/components/metadata" + "github.com/go-gost/gost/pkg/internal/utils" + "github.com/go-gost/gost/pkg/listener" "github.com/go-gost/gost/pkg/logger" + md "github.com/go-gost/gost/pkg/metadata" "github.com/go-gost/gost/pkg/registry" "golang.org/x/net/http2" ) @@ -19,7 +19,7 @@ func init() { registry.RegisterListener("h2", NewListener) } -type Listener struct { +type h2Listener struct { addr string net.Listener md metadata @@ -34,13 +34,13 @@ func NewListener(opts ...listener.Option) listener.Listener { for _, opt := range opts { opt(options) } - return &Listener{ + return &h2Listener{ addr: options.Addr, logger: options.Logger, } } -func (l *Listener) Init(md md.Metadata) (err error) { +func (l *h2Listener) Init(md md.Metadata) (err error) { if err = l.parseMetadata(md); err != nil { return } @@ -71,7 +71,7 @@ func (l *Listener) Init(md md.Metadata) (err error) { return } -func (l *Listener) Accept() (conn net.Conn, err error) { +func (l *h2Listener) Accept() (conn net.Conn, err error) { var ok bool select { case conn = <-l.connChan: @@ -83,7 +83,7 @@ func (l *Listener) Accept() (conn net.Conn, err error) { return } -func (l *Listener) listenLoop() { +func (l *h2Listener) listenLoop() { for { conn, err := l.Listener.Accept() if err != nil { @@ -96,7 +96,7 @@ func (l *Listener) listenLoop() { } } -func (l *Listener) handleLoop(conn net.Conn) { +func (l *h2Listener) handleLoop(conn net.Conn) { if l.md.tlsConfig != nil { tlsConn := tls.Server(conn, l.md.tlsConfig) // NOTE: HTTP2 server will check the TLS version, @@ -114,7 +114,7 @@ func (l *Listener) handleLoop(conn net.Conn) { l.server.ServeConn(conn, &opt) } -func (l *Listener) handleFunc(w http.ResponseWriter, r *http.Request) { +func (l *h2Listener) handleFunc(w http.ResponseWriter, r *http.Request) { /* log.Logf("[http2] %s -> %s %s %s %s", r.RemoteAddr, r.Host, r.Method, r.RequestURI, r.Proto) @@ -140,7 +140,7 @@ func (l *Listener) handleFunc(w http.ResponseWriter, r *http.Request) { <-conn.closed // NOTE: we need to wait for streaming end, or the connection will be closed } -func (l *Listener) upgrade(w http.ResponseWriter, r *http.Request) (*conn, error) { +func (l *h2Listener) upgrade(w http.ResponseWriter, r *http.Request) (*conn, error) { if l.md.path == "" && r.Method != http.MethodConnect { w.WriteHeader(http.StatusMethodNotAllowed) return nil, errors.New("method not allowed") @@ -172,7 +172,7 @@ func (l *Listener) upgrade(w http.ResponseWriter, r *http.Request) (*conn, error }, nil } -func (l *Listener) parseMetadata(md md.Metadata) (err error) { +func (l *h2Listener) parseMetadata(md md.Metadata) (err error) { l.md.tlsConfig, err = utils.LoadTLSConfig( md.GetString(certFile), md.GetString(keyFile), diff --git a/pkg/components/listener/http2/h2/metadata.go b/pkg/listener/http2/h2/metadata.go similarity index 100% rename from pkg/components/listener/http2/h2/metadata.go rename to pkg/listener/http2/h2/metadata.go diff --git a/pkg/components/listener/http2/listener.go b/pkg/listener/http2/listener.go similarity index 79% rename from pkg/components/listener/http2/listener.go rename to pkg/listener/http2/listener.go index f8c0db4..fad48e5 100644 --- a/pkg/components/listener/http2/listener.go +++ b/pkg/listener/http2/listener.go @@ -5,10 +5,10 @@ import ( "net" "net/http" - "github.com/go-gost/gost/pkg/components/internal/utils" - "github.com/go-gost/gost/pkg/components/listener" - md "github.com/go-gost/gost/pkg/components/metadata" + "github.com/go-gost/gost/pkg/internal/utils" + "github.com/go-gost/gost/pkg/listener" "github.com/go-gost/gost/pkg/logger" + md "github.com/go-gost/gost/pkg/metadata" "github.com/go-gost/gost/pkg/registry" "golang.org/x/net/http2" ) @@ -17,7 +17,7 @@ func init() { registry.RegisterListener("http2", NewListener) } -type Listener struct { +type http2Listener struct { saddr string md metadata server *http.Server @@ -32,13 +32,13 @@ func NewListener(opts ...listener.Option) listener.Listener { for _, opt := range opts { opt(options) } - return &Listener{ + return &http2Listener{ saddr: options.Addr, logger: options.Logger, } } -func (l *Listener) Init(md md.Metadata) (err error) { +func (l *http2Listener) Init(md md.Metadata) (err error) { if err = l.parseMetadata(md); err != nil { return } @@ -82,7 +82,7 @@ func (l *Listener) Init(md md.Metadata) (err error) { return } -func (l *Listener) Accept() (conn net.Conn, err error) { +func (l *http2Listener) Accept() (conn net.Conn, err error) { var ok bool select { case conn = <-l.connChan: @@ -94,11 +94,11 @@ func (l *Listener) Accept() (conn net.Conn, err error) { return } -func (l *Listener) Addr() net.Addr { +func (l *http2Listener) Addr() net.Addr { return l.addr } -func (l *Listener) Close() (err error) { +func (l *http2Listener) Close() (err error) { select { case <-l.errChan: default: @@ -109,7 +109,7 @@ func (l *Listener) Close() (err error) { return nil } -func (l *Listener) handleFunc(w http.ResponseWriter, r *http.Request) { +func (l *http2Listener) handleFunc(w http.ResponseWriter, r *http.Request) { conn := &conn{ r: r, w: w, @@ -125,7 +125,7 @@ func (l *Listener) handleFunc(w http.ResponseWriter, r *http.Request) { <-conn.closed } -func (l *Listener) parseMetadata(md md.Metadata) (err error) { +func (l *http2Listener) parseMetadata(md md.Metadata) (err error) { l.md.tlsConfig, err = utils.LoadTLSConfig( md.GetString(certFile), md.GetString(keyFile), diff --git a/pkg/components/listener/http2/metadata.go b/pkg/listener/http2/metadata.go similarity index 100% rename from pkg/components/listener/http2/metadata.go rename to pkg/listener/http2/metadata.go diff --git a/pkg/components/listener/kcp/config.go b/pkg/listener/kcp/config.go similarity index 100% rename from pkg/components/listener/kcp/config.go rename to pkg/listener/kcp/config.go diff --git a/pkg/components/listener/kcp/listener.go b/pkg/listener/kcp/listener.go similarity index 84% rename from pkg/components/listener/kcp/listener.go rename to pkg/listener/kcp/listener.go index f65b477..6cb7461 100644 --- a/pkg/components/listener/kcp/listener.go +++ b/pkg/listener/kcp/listener.go @@ -4,10 +4,10 @@ import ( "net" "time" - "github.com/go-gost/gost/pkg/components/internal/utils" - "github.com/go-gost/gost/pkg/components/listener" - md "github.com/go-gost/gost/pkg/components/metadata" + "github.com/go-gost/gost/pkg/internal/utils" + "github.com/go-gost/gost/pkg/listener" "github.com/go-gost/gost/pkg/logger" + md "github.com/go-gost/gost/pkg/metadata" "github.com/go-gost/gost/pkg/registry" "github.com/xtaci/kcp-go/v5" "github.com/xtaci/smux" @@ -18,7 +18,7 @@ func init() { registry.RegisterListener("kcp", NewListener) } -type Listener struct { +type kcpListener struct { addr string md metadata ln *kcp.Listener @@ -32,13 +32,13 @@ func NewListener(opts ...listener.Option) listener.Listener { for _, opt := range opts { opt(options) } - return &Listener{ + return &kcpListener{ addr: options.Addr, logger: options.Logger, } } -func (l *Listener) Init(md md.Metadata) (err error) { +func (l *kcpListener) Init(md md.Metadata) (err error) { if err = l.parseMetadata(md); err != nil { return } @@ -88,7 +88,7 @@ func (l *Listener) Init(md md.Metadata) (err error) { return } -func (l *Listener) Accept() (conn net.Conn, err error) { +func (l *kcpListener) Accept() (conn net.Conn, err error) { var ok bool select { case conn = <-l.connChan: @@ -100,15 +100,15 @@ func (l *Listener) Accept() (conn net.Conn, err error) { return } -func (l *Listener) Close() error { +func (l *kcpListener) Close() error { return l.ln.Close() } -func (l *Listener) Addr() net.Addr { +func (l *kcpListener) Addr() net.Addr { return l.ln.Addr() } -func (l *Listener) listenLoop() { +func (l *kcpListener) listenLoop() { for { conn, err := l.ln.AcceptKCP() if err != nil { @@ -133,7 +133,7 @@ func (l *Listener) listenLoop() { } } -func (l *Listener) mux(conn net.Conn) { +func (l *kcpListener) mux(conn net.Conn) { defer conn.Close() smuxConfig := smux.DefaultConfig() @@ -169,6 +169,6 @@ func (l *Listener) mux(conn net.Conn) { } } -func (l *Listener) parseMetadata(md md.Metadata) (err error) { +func (l *kcpListener) parseMetadata(md md.Metadata) (err error) { return } diff --git a/pkg/components/listener/kcp/metadata.go b/pkg/listener/kcp/metadata.go similarity index 100% rename from pkg/components/listener/kcp/metadata.go rename to pkg/listener/kcp/metadata.go diff --git a/pkg/components/listener/listener.go b/pkg/listener/listener.go similarity index 88% rename from pkg/components/listener/listener.go rename to pkg/listener/listener.go index ca83627..078cd5f 100644 --- a/pkg/components/listener/listener.go +++ b/pkg/listener/listener.go @@ -4,7 +4,7 @@ import ( "errors" "net" - "github.com/go-gost/gost/pkg/components/metadata" + "github.com/go-gost/gost/pkg/metadata" ) var ( diff --git a/pkg/components/listener/obfs/http/conn.go b/pkg/listener/obfs/http/conn.go similarity index 100% rename from pkg/components/listener/obfs/http/conn.go rename to pkg/listener/obfs/http/conn.go diff --git a/pkg/components/listener/obfs/http/listener.go b/pkg/listener/obfs/http/listener.go similarity index 73% rename from pkg/components/listener/obfs/http/listener.go rename to pkg/listener/obfs/http/listener.go index e2661bc..793dd1b 100644 --- a/pkg/components/listener/obfs/http/listener.go +++ b/pkg/listener/obfs/http/listener.go @@ -3,10 +3,10 @@ package http import ( "net" - "github.com/go-gost/gost/pkg/components/internal/utils" - "github.com/go-gost/gost/pkg/components/listener" - md "github.com/go-gost/gost/pkg/components/metadata" + "github.com/go-gost/gost/pkg/internal/utils" + "github.com/go-gost/gost/pkg/listener" "github.com/go-gost/gost/pkg/logger" + md "github.com/go-gost/gost/pkg/metadata" "github.com/go-gost/gost/pkg/registry" ) @@ -14,7 +14,7 @@ func init() { registry.RegisterListener("obfs-http", NewListener) } -type Listener struct { +type obfsListener struct { addr string md metadata net.Listener @@ -26,13 +26,13 @@ func NewListener(opts ...listener.Option) listener.Listener { for _, opt := range opts { opt(options) } - return &Listener{ + return &obfsListener{ addr: options.Addr, logger: options.Logger, } } -func (l *Listener) Init(md md.Metadata) (err error) { +func (l *obfsListener) Init(md md.Metadata) (err error) { if err = l.parseMetadata(md); err != nil { return } @@ -58,7 +58,7 @@ func (l *Listener) Init(md md.Metadata) (err error) { return } -func (l *Listener) Accept() (net.Conn, error) { +func (l *obfsListener) Accept() (net.Conn, error) { c, err := l.Listener.Accept() if err != nil { return nil, err @@ -67,7 +67,7 @@ func (l *Listener) Accept() (net.Conn, error) { return &conn{Conn: c}, nil } -func (l *Listener) parseMetadata(md md.Metadata) (err error) { +func (l *obfsListener) parseMetadata(md md.Metadata) (err error) { l.md.keepAlive = md.GetBool(keepAlive) l.md.keepAlivePeriod = md.GetDuration(keepAlivePeriod) diff --git a/pkg/components/listener/obfs/http/metadata.go b/pkg/listener/obfs/http/metadata.go similarity index 100% rename from pkg/components/listener/obfs/http/metadata.go rename to pkg/listener/obfs/http/metadata.go diff --git a/pkg/components/listener/obfs/tls/conn.go b/pkg/listener/obfs/tls/conn.go similarity index 100% rename from pkg/components/listener/obfs/tls/conn.go rename to pkg/listener/obfs/tls/conn.go diff --git a/pkg/components/listener/obfs/tls/listener.go b/pkg/listener/obfs/tls/listener.go similarity index 73% rename from pkg/components/listener/obfs/tls/listener.go rename to pkg/listener/obfs/tls/listener.go index c58c773..046f903 100644 --- a/pkg/components/listener/obfs/tls/listener.go +++ b/pkg/listener/obfs/tls/listener.go @@ -3,10 +3,10 @@ package tls import ( "net" - "github.com/go-gost/gost/pkg/components/internal/utils" - "github.com/go-gost/gost/pkg/components/listener" - md "github.com/go-gost/gost/pkg/components/metadata" + "github.com/go-gost/gost/pkg/internal/utils" + "github.com/go-gost/gost/pkg/listener" "github.com/go-gost/gost/pkg/logger" + md "github.com/go-gost/gost/pkg/metadata" "github.com/go-gost/gost/pkg/registry" ) @@ -14,7 +14,7 @@ func init() { registry.RegisterListener("obfs-tls", NewListener) } -type Listener struct { +type obfsListener struct { addr string md metadata net.Listener @@ -26,13 +26,13 @@ func NewListener(opts ...listener.Option) listener.Listener { for _, opt := range opts { opt(options) } - return &Listener{ + return &obfsListener{ addr: options.Addr, logger: options.Logger, } } -func (l *Listener) Init(md md.Metadata) (err error) { +func (l *obfsListener) Init(md md.Metadata) (err error) { if err = l.parseMetadata(md); err != nil { return } @@ -58,7 +58,7 @@ func (l *Listener) Init(md md.Metadata) (err error) { return } -func (l *Listener) Accept() (net.Conn, error) { +func (l *obfsListener) Accept() (net.Conn, error) { c, err := l.Listener.Accept() if err != nil { return nil, err @@ -67,7 +67,7 @@ func (l *Listener) Accept() (net.Conn, error) { return &conn{Conn: c}, nil } -func (l *Listener) parseMetadata(md md.Metadata) (err error) { +func (l *obfsListener) parseMetadata(md md.Metadata) (err error) { l.md.keepAlive = md.GetBool(keepAlive) l.md.keepAlivePeriod = md.GetDuration(keepAlivePeriod) diff --git a/pkg/components/listener/obfs/tls/metadata.go b/pkg/listener/obfs/tls/metadata.go similarity index 100% rename from pkg/components/listener/obfs/tls/metadata.go rename to pkg/listener/obfs/tls/metadata.go diff --git a/pkg/components/listener/option.go b/pkg/listener/option.go similarity index 100% rename from pkg/components/listener/option.go rename to pkg/listener/option.go diff --git a/pkg/components/listener/quic/listener.go b/pkg/listener/quic/listener.go similarity index 78% rename from pkg/components/listener/quic/listener.go rename to pkg/listener/quic/listener.go index 95f44d8..0489373 100644 --- a/pkg/components/listener/quic/listener.go +++ b/pkg/listener/quic/listener.go @@ -4,10 +4,10 @@ import ( "context" "net" - "github.com/go-gost/gost/pkg/components/internal/utils" - "github.com/go-gost/gost/pkg/components/listener" - md "github.com/go-gost/gost/pkg/components/metadata" + "github.com/go-gost/gost/pkg/internal/utils" + "github.com/go-gost/gost/pkg/listener" "github.com/go-gost/gost/pkg/logger" + md "github.com/go-gost/gost/pkg/metadata" "github.com/go-gost/gost/pkg/registry" "github.com/lucas-clemente/quic-go" ) @@ -16,7 +16,7 @@ func init() { registry.RegisterListener("quic", NewListener) } -type Listener struct { +type quicListener struct { addr string md metadata ln quic.Listener @@ -30,13 +30,13 @@ func NewListener(opts ...listener.Option) listener.Listener { for _, opt := range opts { opt(options) } - return &Listener{ + return &quicListener{ addr: options.Addr, logger: options.Logger, } } -func (l *Listener) Init(md md.Metadata) (err error) { +func (l *quicListener) Init(md md.Metadata) (err error) { if err = l.parseMetadata(md); err != nil { return } @@ -76,7 +76,7 @@ func (l *Listener) Init(md md.Metadata) (err error) { return } -func (l *Listener) Accept() (conn net.Conn, err error) { +func (l *quicListener) Accept() (conn net.Conn, err error) { var ok bool select { case conn = <-l.connChan: @@ -88,15 +88,15 @@ func (l *Listener) Accept() (conn net.Conn, err error) { return } -func (l *Listener) Close() error { +func (l *quicListener) Close() error { return l.ln.Close() } -func (l *Listener) Addr() net.Addr { +func (l *quicListener) Addr() net.Addr { return l.ln.Addr() } -func (l *Listener) listenLoop() { +func (l *quicListener) listenLoop() { for { ctx := context.Background() session, err := l.ln.Accept(ctx) @@ -110,7 +110,7 @@ func (l *Listener) listenLoop() { } } -func (l *Listener) mux(ctx context.Context, session quic.Session) { +func (l *quicListener) mux(ctx context.Context, session quic.Session) { defer session.CloseWithError(0, "") for { @@ -132,7 +132,7 @@ func (l *Listener) mux(ctx context.Context, session quic.Session) { } } -func (l *Listener) parseMetadata(md md.Metadata) (err error) { +func (l *quicListener) parseMetadata(md md.Metadata) (err error) { return } diff --git a/pkg/components/listener/quic/metadata.go b/pkg/listener/quic/metadata.go similarity index 100% rename from pkg/components/listener/quic/metadata.go rename to pkg/listener/quic/metadata.go diff --git a/pkg/components/listener/tcp/listener.go b/pkg/listener/tcp/listener.go similarity index 75% rename from pkg/components/listener/tcp/listener.go rename to pkg/listener/tcp/listener.go index cbd6f66..006ea0c 100644 --- a/pkg/components/listener/tcp/listener.go +++ b/pkg/listener/tcp/listener.go @@ -3,10 +3,10 @@ package tcp import ( "net" - "github.com/go-gost/gost/pkg/components/internal/utils" - "github.com/go-gost/gost/pkg/components/listener" - md "github.com/go-gost/gost/pkg/components/metadata" + "github.com/go-gost/gost/pkg/internal/utils" + "github.com/go-gost/gost/pkg/listener" "github.com/go-gost/gost/pkg/logger" + md "github.com/go-gost/gost/pkg/metadata" "github.com/go-gost/gost/pkg/registry" ) @@ -14,7 +14,7 @@ func init() { registry.RegisterListener("tcp", NewListener) } -type Listener struct { +type tcpListener struct { addr string md metadata net.Listener @@ -26,13 +26,13 @@ func NewListener(opts ...listener.Option) listener.Listener { for _, opt := range opts { opt(options) } - return &Listener{ + return &tcpListener{ addr: options.Addr, logger: options.Logger, } } -func (l *Listener) Init(md md.Metadata) (err error) { +func (l *tcpListener) Init(md md.Metadata) (err error) { if err = l.parseMetadata(md); err != nil { return } @@ -59,7 +59,7 @@ func (l *Listener) Init(md md.Metadata) (err error) { return } -func (l *Listener) parseMetadata(md md.Metadata) (err error) { +func (l *tcpListener) parseMetadata(md md.Metadata) (err error) { l.md.keepAlive = md.GetBool(keepAlive) l.md.keepAlivePeriod = md.GetDuration(keepAlivePeriod) diff --git a/pkg/components/listener/tcp/metadata.go b/pkg/listener/tcp/metadata.go similarity index 100% rename from pkg/components/listener/tcp/metadata.go rename to pkg/listener/tcp/metadata.go diff --git a/pkg/components/listener/tls/listener.go b/pkg/listener/tls/listener.go similarity index 75% rename from pkg/components/listener/tls/listener.go rename to pkg/listener/tls/listener.go index 60bbf32..8ded0b7 100644 --- a/pkg/components/listener/tls/listener.go +++ b/pkg/listener/tls/listener.go @@ -4,10 +4,10 @@ import ( "crypto/tls" "net" - "github.com/go-gost/gost/pkg/components/internal/utils" - "github.com/go-gost/gost/pkg/components/listener" - md "github.com/go-gost/gost/pkg/components/metadata" + "github.com/go-gost/gost/pkg/internal/utils" + "github.com/go-gost/gost/pkg/listener" "github.com/go-gost/gost/pkg/logger" + md "github.com/go-gost/gost/pkg/metadata" "github.com/go-gost/gost/pkg/registry" ) @@ -15,7 +15,7 @@ func init() { registry.RegisterListener("tls", NewListener) } -type Listener struct { +type tlsListener struct { addr string md metadata net.Listener @@ -27,13 +27,13 @@ func NewListener(opts ...listener.Option) listener.Listener { for _, opt := range opts { opt(options) } - return &Listener{ + return &tlsListener{ addr: options.Addr, logger: options.Logger, } } -func (l *Listener) Init(md md.Metadata) (err error) { +func (l *tlsListener) Init(md md.Metadata) (err error) { if err = l.parseMetadata(md); err != nil { return } @@ -55,7 +55,7 @@ func (l *Listener) Init(md md.Metadata) (err error) { return } -func (l *Listener) parseMetadata(md md.Metadata) (err error) { +func (l *tlsListener) parseMetadata(md md.Metadata) (err error) { l.md.tlsConfig, err = utils.LoadTLSConfig( md.GetString(certFile), md.GetString(keyFile), diff --git a/pkg/components/listener/tls/metadata.go b/pkg/listener/tls/metadata.go similarity index 100% rename from pkg/components/listener/tls/metadata.go rename to pkg/listener/tls/metadata.go diff --git a/pkg/components/listener/tls/mux/listener.go b/pkg/listener/tls/mux/listener.go similarity index 83% rename from pkg/components/listener/tls/mux/listener.go rename to pkg/listener/tls/mux/listener.go index 747ed44..c44f00b 100644 --- a/pkg/components/listener/tls/mux/listener.go +++ b/pkg/listener/tls/mux/listener.go @@ -4,10 +4,10 @@ import ( "crypto/tls" "net" - "github.com/go-gost/gost/pkg/components/internal/utils" - "github.com/go-gost/gost/pkg/components/listener" - md "github.com/go-gost/gost/pkg/components/metadata" + "github.com/go-gost/gost/pkg/internal/utils" + "github.com/go-gost/gost/pkg/listener" "github.com/go-gost/gost/pkg/logger" + md "github.com/go-gost/gost/pkg/metadata" "github.com/go-gost/gost/pkg/registry" "github.com/xtaci/smux" ) @@ -16,7 +16,7 @@ func init() { registry.RegisterListener("mtls", NewListener) } -type Listener struct { +type mtlsListener struct { addr string md metadata net.Listener @@ -30,13 +30,13 @@ func NewListener(opts ...listener.Option) listener.Listener { for _, opt := range opts { opt(options) } - return &Listener{ + return &mtlsListener{ addr: options.Addr, logger: options.Logger, } } -func (l *Listener) Init(md md.Metadata) (err error) { +func (l *mtlsListener) Init(md md.Metadata) (err error) { if err = l.parseMetadata(md); err != nil { return } @@ -59,7 +59,7 @@ func (l *Listener) Init(md md.Metadata) (err error) { return } -func (l *Listener) listenLoop() { +func (l *mtlsListener) listenLoop() { for { conn, err := l.Listener.Accept() if err != nil { @@ -71,7 +71,7 @@ func (l *Listener) listenLoop() { } } -func (l *Listener) mux(conn net.Conn) { +func (l *mtlsListener) mux(conn net.Conn) { smuxConfig := smux.DefaultConfig() smuxConfig.KeepAliveDisabled = l.md.muxKeepAliveDisabled if l.md.muxKeepAlivePeriod > 0 { @@ -114,7 +114,7 @@ func (l *Listener) mux(conn net.Conn) { } } -func (l *Listener) Accept() (conn net.Conn, err error) { +func (l *mtlsListener) Accept() (conn net.Conn, err error) { var ok bool select { case conn = <-l.connChan: @@ -126,7 +126,7 @@ func (l *Listener) Accept() (conn net.Conn, err error) { return } -func (l *Listener) parseMetadata(md md.Metadata) (err error) { +func (l *mtlsListener) parseMetadata(md md.Metadata) (err error) { l.md.tlsConfig, err = utils.LoadTLSConfig( md.GetString(certFile), md.GetString(keyFile), diff --git a/pkg/components/listener/tls/mux/metadata.go b/pkg/listener/tls/mux/metadata.go similarity index 100% rename from pkg/components/listener/tls/mux/metadata.go rename to pkg/listener/tls/mux/metadata.go diff --git a/pkg/components/listener/udp/conn.go b/pkg/listener/udp/conn.go similarity index 100% rename from pkg/components/listener/udp/conn.go rename to pkg/listener/udp/conn.go diff --git a/pkg/components/listener/udp/listener.go b/pkg/listener/udp/listener.go similarity index 85% rename from pkg/components/listener/udp/listener.go rename to pkg/listener/udp/listener.go index 1181c01..e41466c 100644 --- a/pkg/components/listener/udp/listener.go +++ b/pkg/listener/udp/listener.go @@ -5,9 +5,9 @@ import ( "sync" "sync/atomic" - "github.com/go-gost/gost/pkg/components/listener" - md "github.com/go-gost/gost/pkg/components/metadata" + "github.com/go-gost/gost/pkg/listener" "github.com/go-gost/gost/pkg/logger" + md "github.com/go-gost/gost/pkg/metadata" "github.com/go-gost/gost/pkg/registry" ) @@ -15,7 +15,7 @@ func init() { registry.RegisterListener("udp", NewListener) } -type Listener struct { +type udpListener struct { addr string md metadata conn net.PacketConn @@ -30,13 +30,13 @@ func NewListener(opts ...listener.Option) listener.Listener { for _, opt := range opts { opt(options) } - return &Listener{ + return &udpListener{ addr: options.Addr, logger: options.Logger, } } -func (l *Listener) Init(md md.Metadata) (err error) { +func (l *udpListener) Init(md md.Metadata) (err error) { if err = l.parseMetadata(md); err != nil { return } @@ -61,7 +61,7 @@ func (l *Listener) Init(md md.Metadata) (err error) { return } -func (l *Listener) Accept() (conn net.Conn, err error) { +func (l *udpListener) Accept() (conn net.Conn, err error) { var ok bool select { case conn = <-l.connChan: @@ -73,7 +73,7 @@ func (l *Listener) Accept() (conn net.Conn, err error) { return } -func (l *Listener) Close() error { +func (l *udpListener) Close() error { err := l.conn.Close() l.connPool.Range(func(k interface{}, v *serverConn) bool { v.Close() @@ -82,11 +82,11 @@ func (l *Listener) Close() error { return err } -func (l *Listener) Addr() net.Addr { +func (l *udpListener) Addr() net.Addr { return l.conn.LocalAddr() } -func (l *Listener) listenLoop() { +func (l *udpListener) listenLoop() { for { b := make([]byte, l.md.readBufferSize) @@ -125,7 +125,7 @@ func (l *Listener) listenLoop() { } } -func (l *Listener) parseMetadata(md md.Metadata) (err error) { +func (l *udpListener) parseMetadata(md md.Metadata) (err error) { return } diff --git a/pkg/components/listener/udp/metadata.go b/pkg/listener/udp/metadata.go similarity index 100% rename from pkg/components/listener/udp/metadata.go rename to pkg/listener/udp/metadata.go diff --git a/pkg/components/listener/ws/listener.go b/pkg/listener/ws/listener.go similarity index 81% rename from pkg/components/listener/ws/listener.go rename to pkg/listener/ws/listener.go index 43cbc4d..9366d5c 100644 --- a/pkg/components/listener/ws/listener.go +++ b/pkg/listener/ws/listener.go @@ -5,10 +5,10 @@ import ( "net" "net/http" - "github.com/go-gost/gost/pkg/components/internal/utils" - "github.com/go-gost/gost/pkg/components/listener" - md "github.com/go-gost/gost/pkg/components/metadata" + "github.com/go-gost/gost/pkg/internal/utils" + "github.com/go-gost/gost/pkg/listener" "github.com/go-gost/gost/pkg/logger" + md "github.com/go-gost/gost/pkg/metadata" "github.com/go-gost/gost/pkg/registry" "github.com/gorilla/websocket" ) @@ -18,7 +18,7 @@ func init() { registry.RegisterListener("wss", NewListener) } -type Listener struct { +type wsListener struct { saddr string md metadata addr net.Addr @@ -34,13 +34,13 @@ func NewListener(opts ...listener.Option) listener.Listener { for _, opt := range opts { opt(options) } - return &Listener{ + return &wsListener{ saddr: options.Addr, logger: options.Logger, } } -func (l *Listener) Init(md md.Metadata) (err error) { +func (l *wsListener) Init(md md.Metadata) (err error) { if err = l.parseMetadata(md); err != nil { return } @@ -94,7 +94,7 @@ func (l *Listener) Init(md md.Metadata) (err error) { return } -func (l *Listener) Accept() (conn net.Conn, err error) { +func (l *wsListener) Accept() (conn net.Conn, err error) { var ok bool select { case conn = <-l.connChan: @@ -106,15 +106,15 @@ func (l *Listener) Accept() (conn net.Conn, err error) { return } -func (l *Listener) Close() error { +func (l *wsListener) Close() error { return l.srv.Close() } -func (l *Listener) Addr() net.Addr { +func (l *wsListener) Addr() net.Addr { return l.addr } -func (l *Listener) parseMetadata(md md.Metadata) (err error) { +func (l *wsListener) parseMetadata(md md.Metadata) (err error) { l.md.tlsConfig, err = utils.LoadTLSConfig( md.GetString(certFile), md.GetString(keyFile), @@ -127,7 +127,7 @@ func (l *Listener) parseMetadata(md md.Metadata) (err error) { return } -func (l *Listener) upgrade(w http.ResponseWriter, r *http.Request) { +func (l *wsListener) upgrade(w http.ResponseWriter, r *http.Request) { conn, err := l.upgrader.Upgrade(w, r, l.md.responseHeader) if err != nil { l.logger.Error(err) diff --git a/pkg/components/listener/ws/metadata.go b/pkg/listener/ws/metadata.go similarity index 100% rename from pkg/components/listener/ws/metadata.go rename to pkg/listener/ws/metadata.go diff --git a/pkg/components/listener/ws/mux/listener.go b/pkg/listener/ws/mux/listener.go similarity index 84% rename from pkg/components/listener/ws/mux/listener.go rename to pkg/listener/ws/mux/listener.go index 2b99c17..84be483 100644 --- a/pkg/components/listener/ws/mux/listener.go +++ b/pkg/listener/ws/mux/listener.go @@ -5,10 +5,10 @@ import ( "net" "net/http" - "github.com/go-gost/gost/pkg/components/internal/utils" - "github.com/go-gost/gost/pkg/components/listener" - md "github.com/go-gost/gost/pkg/components/metadata" + "github.com/go-gost/gost/pkg/internal/utils" + "github.com/go-gost/gost/pkg/listener" "github.com/go-gost/gost/pkg/logger" + md "github.com/go-gost/gost/pkg/metadata" "github.com/go-gost/gost/pkg/registry" "github.com/gorilla/websocket" "github.com/xtaci/smux" @@ -19,7 +19,7 @@ func init() { registry.RegisterListener("mwss", NewListener) } -type Listener struct { +type mwsListener struct { saddr string md metadata addr net.Addr @@ -35,12 +35,12 @@ func NewListener(opts ...listener.Option) listener.Listener { for _, opt := range opts { opt(options) } - return &Listener{ + return &mwsListener{ logger: options.Logger, } } -func (l *Listener) Init(md md.Metadata) (err error) { +func (l *mwsListener) Init(md md.Metadata) (err error) { if err = l.parseMetadata(md); err != nil { return } @@ -90,7 +90,7 @@ func (l *Listener) Init(md md.Metadata) (err error) { return } -func (l *Listener) Accept() (conn net.Conn, err error) { +func (l *mwsListener) Accept() (conn net.Conn, err error) { var ok bool select { case conn = <-l.connChan: @@ -102,15 +102,15 @@ func (l *Listener) Accept() (conn net.Conn, err error) { return } -func (l *Listener) Close() error { +func (l *mwsListener) Close() error { return l.srv.Close() } -func (l *Listener) Addr() net.Addr { +func (l *mwsListener) Addr() net.Addr { return l.addr } -func (l *Listener) parseMetadata(md md.Metadata) (err error) { +func (l *mwsListener) parseMetadata(md md.Metadata) (err error) { l.md.tlsConfig, err = utils.LoadTLSConfig( md.GetString(certFile), md.GetString(keyFile), @@ -123,7 +123,7 @@ func (l *Listener) parseMetadata(md md.Metadata) (err error) { return } -func (l *Listener) upgrade(w http.ResponseWriter, r *http.Request) { +func (l *mwsListener) upgrade(w http.ResponseWriter, r *http.Request) { conn, err := l.upgrader.Upgrade(w, r, l.md.responseHeader) if err != nil { l.logger.Error(err) @@ -133,7 +133,7 @@ func (l *Listener) upgrade(w http.ResponseWriter, r *http.Request) { l.mux(utils.WebsocketServerConn(conn)) } -func (l *Listener) mux(conn net.Conn) { +func (l *mwsListener) mux(conn net.Conn) { smuxConfig := smux.DefaultConfig() smuxConfig.KeepAliveDisabled = l.md.muxKeepAliveDisabled if l.md.muxKeepAlivePeriod > 0 { diff --git a/pkg/components/listener/ws/mux/metadata.go b/pkg/listener/ws/mux/metadata.go similarity index 100% rename from pkg/components/listener/ws/mux/metadata.go rename to pkg/listener/ws/mux/metadata.go diff --git a/pkg/components/metadata/metadata.go b/pkg/metadata/metadata.go similarity index 100% rename from pkg/components/metadata/metadata.go rename to pkg/metadata/metadata.go diff --git a/pkg/registry/registry.go b/pkg/registry/registry.go index 59e5c36..b96909d 100644 --- a/pkg/registry/registry.go +++ b/pkg/registry/registry.go @@ -1,10 +1,10 @@ package registry import ( - "github.com/go-gost/gost/pkg/components/connector" - "github.com/go-gost/gost/pkg/components/dialer" - "github.com/go-gost/gost/pkg/components/handler" - "github.com/go-gost/gost/pkg/components/listener" + "github.com/go-gost/gost/pkg/connector" + "github.com/go-gost/gost/pkg/dialer" + "github.com/go-gost/gost/pkg/handler" + "github.com/go-gost/gost/pkg/listener" ) type NewListener func(opts ...listener.Option) listener.Listener diff --git a/pkg/service/service.go b/pkg/service/service.go index eb36f0b..427df87 100644 --- a/pkg/service/service.go +++ b/pkg/service/service.go @@ -5,8 +5,8 @@ import ( "net" "time" - "github.com/go-gost/gost/pkg/components/handler" - "github.com/go-gost/gost/pkg/components/listener" + "github.com/go-gost/gost/pkg/handler" + "github.com/go-gost/gost/pkg/listener" ) type Service struct {