improve ss

This commit is contained in:
ginuerzh
2021-11-01 21:57:28 +08:00
parent e2995ece96
commit ec8615991b
71 changed files with 554 additions and 316 deletions

View File

@ -6,13 +6,13 @@ import (
"github.com/go-gost/gost/pkg/bypass" "github.com/go-gost/gost/pkg/bypass"
"github.com/go-gost/gost/pkg/chain" "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/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/logger"
"github.com/go-gost/gost/pkg/metadata"
"github.com/go-gost/gost/pkg/registry" "github.com/go-gost/gost/pkg/registry"
"github.com/go-gost/gost/pkg/service" "github.com/go-gost/gost/pkg/service"
) )

View File

@ -23,6 +23,23 @@ services:
keepAlive: 15s keepAlive: 15s
chain: chain01 chain: chain01
# bypass: bypass01 # 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: chains:
- name: chain01 - name: chain01

View File

@ -2,29 +2,29 @@ package main
import ( import (
// Register connectors // Register connectors
_ "github.com/go-gost/gost/pkg/components/connector/http" _ "github.com/go-gost/gost/pkg/connector/http"
_ "github.com/go-gost/gost/pkg/components/connector/ss" _ "github.com/go-gost/gost/pkg/connector/ss"
// Register dialers // Register dialers
_ "github.com/go-gost/gost/pkg/components/dialer/tcp" _ "github.com/go-gost/gost/pkg/dialer/tcp"
// Register handlers // Register handlers
_ "github.com/go-gost/gost/pkg/components/handler/http" _ "github.com/go-gost/gost/pkg/handler/http"
_ "github.com/go-gost/gost/pkg/components/handler/ss" _ "github.com/go-gost/gost/pkg/handler/ss"
_ "github.com/go-gost/gost/pkg/components/handler/ssu" _ "github.com/go-gost/gost/pkg/handler/ssu"
// Register listeners // Register listeners
_ "github.com/go-gost/gost/pkg/components/listener/ftcp" _ "github.com/go-gost/gost/pkg/listener/ftcp"
_ "github.com/go-gost/gost/pkg/components/listener/http2" _ "github.com/go-gost/gost/pkg/listener/http2"
_ "github.com/go-gost/gost/pkg/components/listener/http2/h2" _ "github.com/go-gost/gost/pkg/listener/http2/h2"
_ "github.com/go-gost/gost/pkg/components/listener/kcp" _ "github.com/go-gost/gost/pkg/listener/kcp"
_ "github.com/go-gost/gost/pkg/components/listener/obfs/http" _ "github.com/go-gost/gost/pkg/listener/obfs/http"
_ "github.com/go-gost/gost/pkg/components/listener/obfs/tls" _ "github.com/go-gost/gost/pkg/listener/obfs/tls"
_ "github.com/go-gost/gost/pkg/components/listener/quic" _ "github.com/go-gost/gost/pkg/listener/quic"
_ "github.com/go-gost/gost/pkg/components/listener/tcp" _ "github.com/go-gost/gost/pkg/listener/tcp"
_ "github.com/go-gost/gost/pkg/components/listener/tls" _ "github.com/go-gost/gost/pkg/listener/tls"
_ "github.com/go-gost/gost/pkg/components/listener/tls/mux" _ "github.com/go-gost/gost/pkg/listener/tls/mux"
_ "github.com/go-gost/gost/pkg/components/listener/udp" _ "github.com/go-gost/gost/pkg/listener/udp"
_ "github.com/go-gost/gost/pkg/components/listener/ws" _ "github.com/go-gost/gost/pkg/listener/ws"
_ "github.com/go-gost/gost/pkg/components/listener/ws/mux" _ "github.com/go-gost/gost/pkg/listener/ws/mux"
) )

View File

@ -101,6 +101,10 @@ func (r *Route) Last() *Node {
} }
func (r *Route) Path() (path []*Node) { func (r *Route) Path() (path []*Node) {
if r == nil || len(r.nodes) == 0 {
return nil
}
for _, node := range r.nodes { for _, node := range r.nodes {
if node.transport != nil && node.transport.route != nil { if node.transport != nil && node.transport.route != nil {
path = append(path, node.transport.route.Path()...) path = append(path, node.transport.route.Path()...)

View File

@ -4,8 +4,8 @@ import (
"context" "context"
"net" "net"
"github.com/go-gost/gost/pkg/components/connector" "github.com/go-gost/gost/pkg/connector"
"github.com/go-gost/gost/pkg/components/dialer" "github.com/go-gost/gost/pkg/dialer"
) )
type Transport struct { type Transport struct {

View File

@ -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
}

View File

@ -1,11 +0,0 @@
package ss
const (
method = "method"
password = "password"
)
type metadata struct {
method string
password string
}

View File

@ -4,7 +4,7 @@ import (
"context" "context"
"net" "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. // Connector is responsible for connecting to the destination address.

View File

@ -11,9 +11,9 @@ import (
"net/url" "net/url"
"strings" "strings"
"github.com/go-gost/gost/pkg/components/connector" "github.com/go-gost/gost/pkg/connector"
md "github.com/go-gost/gost/pkg/components/metadata"
"github.com/go-gost/gost/pkg/logger" "github.com/go-gost/gost/pkg/logger"
md "github.com/go-gost/gost/pkg/metadata"
"github.com/go-gost/gost/pkg/registry" "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") req.Header.Set("Proxy-Connection", "keep-alive")
c.logger = c.logger.WithFields(map[string]interface{}{ c.logger = c.logger.WithFields(map[string]interface{}{
"src": conn.LocalAddr().String(), "local": conn.LocalAddr().String(),
"dst": conn.RemoteAddr().String(), "remote": conn.RemoteAddr().String(),
"target": address,
}) })
c.logger.Infof("connect: ", address)
if user := c.md.User; user != nil { if user := c.md.User; user != nil {
u := user.Username() u := user.Username()

View File

@ -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
}

View File

@ -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
}

View File

@ -4,7 +4,7 @@ import (
"context" "context"
"net" "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. // Transporter is responsible for dialing to the proxy server.

View File

@ -4,9 +4,9 @@ import (
"context" "context"
"net" "net"
"github.com/go-gost/gost/pkg/components/dialer" "github.com/go-gost/gost/pkg/dialer"
md "github.com/go-gost/gost/pkg/components/metadata"
"github.com/go-gost/gost/pkg/logger" "github.com/go-gost/gost/pkg/logger"
md "github.com/go-gost/gost/pkg/metadata"
"github.com/go-gost/gost/pkg/registry" "github.com/go-gost/gost/pkg/registry"
) )

View File

@ -4,7 +4,7 @@ import (
"context" "context"
"net" "net"
"github.com/go-gost/gost/pkg/components/metadata" "github.com/go-gost/gost/pkg/metadata"
) )
type Handler interface { type Handler interface {

View File

@ -20,9 +20,9 @@ import (
"github.com/go-gost/gost/pkg/auth" "github.com/go-gost/gost/pkg/auth"
"github.com/go-gost/gost/pkg/bypass" "github.com/go-gost/gost/pkg/bypass"
"github.com/go-gost/gost/pkg/chain" "github.com/go-gost/gost/pkg/chain"
"github.com/go-gost/gost/pkg/components/handler" "github.com/go-gost/gost/pkg/handler"
md "github.com/go-gost/gost/pkg/components/metadata"
"github.com/go-gost/gost/pkg/logger" "github.com/go-gost/gost/pkg/logger"
md "github.com/go-gost/gost/pkg/metadata"
"github.com/go-gost/gost/pkg/registry" "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) { func (h *httpHandler) Handle(ctx context.Context, conn net.Conn) {
defer conn.Close() defer conn.Close()
start := time.Now()
h.logger = h.logger.WithFields(map[string]interface{}{ h.logger = h.logger.WithFields(map[string]interface{}{
"src": conn.RemoteAddr().String(), "remote": conn.RemoteAddr().String(),
"local": conn.LocalAddr().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)) req, err := http.ReadRequest(bufio.NewReader(conn))
if err != nil { if err != nil {
h.logger.Error(err) h.logger.Error(err)
@ -109,7 +118,8 @@ func (h *httpHandler) handleRequest(ctx context.Context, conn net.Conn, req *htt
return 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 v := req.Header.Get("Gost-Target"); v != "" {
if h, err := h.decodeServerName(v); err == nil { if h, err := h.decodeServerName(v); err == nil {
req.Host = h req.Host = h
@ -117,6 +127,13 @@ func (h *httpHandler) handleRequest(ctx context.Context, conn net.Conn, req *htt
} }
req.Header.Del("Gost-Target") 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 host := req.Host
if _, port, _ := net.SplitHostPort(host); port == "" { if _, port, _ := net.SplitHostPort(host); port == "" {
host = net.JoinHostPort(host, "80") 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) dump, _ := httputil.DumpRequest(req, false)
h.logger.Debug(string(dump)) h.logger.Debug(string(dump))
} }
h.logger.Infof("%s > %s", conn.RemoteAddr(), host)
resp := &http.Response{ resp := &http.Response{
ProtoMajor: 1, ProtoMajor: 1,
@ -202,7 +220,6 @@ func (h *httpHandler) handleRequest(ctx context.Context, conn net.Conn, req *htt
dump, _ := httputil.DumpResponse(resp, false) dump, _ := httputil.DumpResponse(resp, false)
h.logger.Debug(string(dump)) h.logger.Debug(string(dump))
} }
h.logger.Error(err)
return return
} }
defer cc.Close() 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) 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) { 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++ { for i := 0; i < count; i++ {
route := h.chain.GetRouteFor(addr) route := h.chain.GetRouteFor(addr)
buf := bytes.Buffer{} if h.logger.IsLevelEnabled(logger.DebugLevel) {
for _, node := range route.Path() { buf := bytes.Buffer{}
fmt.Fprintf(&buf, "%s@%s -> ", node.Name(), node.Addr()) 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 // forward http request

View File

@ -3,18 +3,20 @@ package ss
import ( import (
"bytes" "bytes"
"context" "context"
"fmt"
"io"
"io/ioutil"
"net" "net"
"time" "time"
"github.com/go-gost/gosocks5" "github.com/go-gost/gosocks5"
"github.com/go-gost/gost/pkg/bypass" "github.com/go-gost/gost/pkg/bypass"
"github.com/go-gost/gost/pkg/chain" "github.com/go-gost/gost/pkg/chain"
"github.com/go-gost/gost/pkg/components/handler" "github.com/go-gost/gost/pkg/handler"
md "github.com/go-gost/gost/pkg/components/metadata" "github.com/go-gost/gost/pkg/internal/utils"
"github.com/go-gost/gost/pkg/logger" "github.com/go-gost/gost/pkg/logger"
md "github.com/go-gost/gost/pkg/metadata"
"github.com/go-gost/gost/pkg/registry" "github.com/go-gost/gost/pkg/registry"
"github.com/shadowsocks/go-shadowsocks2/core"
ss "github.com/shadowsocks/shadowsocks-go/shadowsocks"
) )
func init() { 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) { func (h *ssHandler) Handle(ctx context.Context, conn net.Conn) {
defer conn.Close() defer conn.Close()
start := time.Now()
h.logger = h.logger.WithFields(map[string]interface{}{ h.logger = h.logger.WithFields(map[string]interface{}{
"src": conn.RemoteAddr().String(), "remote": conn.RemoteAddr().String(),
"local": conn.LocalAddr().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 { if h.md.cipher != nil {
conn = &shadowConn{ sc = utils.ShadowConn(h.md.cipher.StreamConn(conn), nil)
Conn: h.md.cipher.StreamConn(conn),
}
} }
if h.md.readTimeout > 0 { if h.md.readTimeout > 0 {
conn.SetReadDeadline(time.Now().Add(h.md.readTimeout)) sc.SetReadDeadline(time.Now().Add(h.md.readTimeout))
} }
addr := &gosocks5.Addr{} addr := &gosocks5.Addr{}
_, err := addr.ReadFrom(conn) _, err := addr.ReadFrom(sc)
if err != nil { if err != nil {
h.logger.Error(err) h.logger.Error(err)
h.discard(conn)
return return
} }
conn.SetReadDeadline(time.Time{}) sc.SetReadDeadline(time.Time{})
h.logger = h.logger.WithFields(map[string]interface{}{ h.logger = h.logger.WithFields(map[string]interface{}{
"dst": addr.String(), "dst": addr.String(),
}) })
h.logger.Infof("%s > %s", conn.RemoteAddr(), addr)
if h.bypass != nil && h.bypass.Contains(addr.String()) { if h.bypass != nil && h.bypass.Contains(addr.String()) {
h.logger.Info("bypass: ", addr.String()) h.logger.Info("bypass: ", addr.String())
return return
@ -83,16 +96,21 @@ func (h *ssHandler) Handle(ctx context.Context, conn net.Conn) {
cc, err := h.dial(ctx, addr.String()) cc, err := h.dial(ctx, addr.String())
if err != nil { if err != nil {
h.logger.Error(err)
return return
} }
defer cc.Close() 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) { 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(method),
md.GetString(password), md.GetString(password),
md.GetString(key), 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++ { for i := 0; i < count; i++ {
route := h.chain.GetRouteFor(addr) route := h.chain.GetRouteFor(addr)
/* if h.logger.IsLevelEnabled(logger.DebugLevel) {
buf := bytes.Buffer{} buf := bytes.Buffer{}
fmt.Fprintf(&buf, "%s -> %s -> ", for _, node := range route.Path() {
conn.RemoteAddr(), h.options.Node.String()) fmt.Fprintf(&buf, "%s@%s > ", node.Name(), node.Addr())
for _, nd := range route.route {
fmt.Fprintf(&buf, "%d@%s -> ", nd.ID, nd.String())
} }
fmt.Fprintf(&buf, "%s", host) fmt.Fprintf(&buf, "%s", addr)
log.Log("[route]", buf.String()) h.logger.Debugf("route(retry=%d): %s", i, buf.String())
*/ }
conn, err = route.Dial(ctx, "tcp", addr) conn, err = route.Dial(ctx, "tcp", addr)
if err == nil { if err == nil {
@ -135,47 +151,3 @@ func (h *ssHandler) dial(ctx context.Context, addr string) (conn net.Conn, err e
return 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
}

View File

@ -4,9 +4,9 @@ import (
"context" "context"
"net" "net"
"github.com/go-gost/gost/pkg/components/handler" "github.com/go-gost/gost/pkg/handler"
md "github.com/go-gost/gost/pkg/components/metadata"
"github.com/go-gost/gost/pkg/logger" "github.com/go-gost/gost/pkg/logger"
md "github.com/go-gost/gost/pkg/metadata"
"github.com/go-gost/gost/pkg/registry" "github.com/go-gost/gost/pkg/registry"
"github.com/shadowsocks/go-shadowsocks2/core" "github.com/shadowsocks/go-shadowsocks2/core"
ss "github.com/shadowsocks/shadowsocks-go/shadowsocks" ss "github.com/shadowsocks/shadowsocks-go/shadowsocks"
@ -16,7 +16,7 @@ func init() {
registry.RegisterHandler("ssu", NewHandler) registry.RegisterHandler("ssu", NewHandler)
} }
type Handler struct { type ssuHandler struct {
logger logger.Logger logger logger.Logger
md metadata md metadata
} }
@ -27,20 +27,20 @@ func NewHandler(opts ...handler.Option) handler.Handler {
opt(options) opt(options)
} }
return &Handler{ return &ssuHandler{
logger: options.Logger, 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) 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() 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( h.md.cipher, err = h.initCipher(
md.GetString(method), md.GetString(method),
md.GetString(password), md.GetString(password),
@ -55,7 +55,7 @@ func (h *Handler) parseMetadata(md md.Metadata) (err error) {
return 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 == "" { if method == "" && password == "" {
return nil, nil return nil, nil
} }

View File

@ -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)
}
}
}

60
pkg/internal/utils/ss.go Normal file
View File

@ -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
}

View File

@ -5,9 +5,9 @@ import (
"sync" "sync"
"sync/atomic" "sync/atomic"
"github.com/go-gost/gost/pkg/components/listener" "github.com/go-gost/gost/pkg/listener"
md "github.com/go-gost/gost/pkg/components/metadata"
"github.com/go-gost/gost/pkg/logger" "github.com/go-gost/gost/pkg/logger"
md "github.com/go-gost/gost/pkg/metadata"
"github.com/go-gost/gost/pkg/registry" "github.com/go-gost/gost/pkg/registry"
"github.com/xtaci/tcpraw" "github.com/xtaci/tcpraw"
) )
@ -16,7 +16,7 @@ func init() {
registry.RegisterListener("ftcp", NewListener) registry.RegisterListener("ftcp", NewListener)
} }
type Listener struct { type ftcpListener struct {
addr string addr string
md metadata md metadata
conn net.PacketConn conn net.PacketConn
@ -31,13 +31,13 @@ func NewListener(opts ...listener.Option) listener.Listener {
for _, opt := range opts { for _, opt := range opts {
opt(options) opt(options)
} }
return &Listener{ return &ftcpListener{
addr: options.Addr, addr: options.Addr,
logger: options.Logger, 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 { if err = l.parseMetadata(md); err != nil {
return return
} }
@ -55,7 +55,7 @@ func (l *Listener) Init(md md.Metadata) (err error) {
return return
} }
func (l *Listener) Accept() (conn net.Conn, err error) { func (l *ftcpListener) Accept() (conn net.Conn, err error) {
var ok bool var ok bool
select { select {
case conn = <-l.connChan: case conn = <-l.connChan:
@ -67,7 +67,7 @@ func (l *Listener) Accept() (conn net.Conn, err error) {
return return
} }
func (l *Listener) Close() error { func (l *ftcpListener) Close() error {
err := l.conn.Close() err := l.conn.Close()
l.connPool.Range(func(k interface{}, v *serverConn) bool { l.connPool.Range(func(k interface{}, v *serverConn) bool {
v.Close() v.Close()
@ -76,11 +76,11 @@ func (l *Listener) Close() error {
return err return err
} }
func (l *Listener) Addr() net.Addr { func (l *ftcpListener) Addr() net.Addr {
return l.conn.LocalAddr() return l.conn.LocalAddr()
} }
func (l *Listener) listenLoop() { func (l *ftcpListener) listenLoop() {
for { for {
b := make([]byte, l.md.readBufferSize) 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 return
} }

View File

@ -7,10 +7,10 @@ import (
"net/http" "net/http"
"time" "time"
"github.com/go-gost/gost/pkg/components/internal/utils" "github.com/go-gost/gost/pkg/internal/utils"
"github.com/go-gost/gost/pkg/components/listener" "github.com/go-gost/gost/pkg/listener"
md "github.com/go-gost/gost/pkg/components/metadata"
"github.com/go-gost/gost/pkg/logger" "github.com/go-gost/gost/pkg/logger"
md "github.com/go-gost/gost/pkg/metadata"
"github.com/go-gost/gost/pkg/registry" "github.com/go-gost/gost/pkg/registry"
"golang.org/x/net/http2" "golang.org/x/net/http2"
) )
@ -19,7 +19,7 @@ func init() {
registry.RegisterListener("h2", NewListener) registry.RegisterListener("h2", NewListener)
} }
type Listener struct { type h2Listener struct {
addr string addr string
net.Listener net.Listener
md metadata md metadata
@ -34,13 +34,13 @@ func NewListener(opts ...listener.Option) listener.Listener {
for _, opt := range opts { for _, opt := range opts {
opt(options) opt(options)
} }
return &Listener{ return &h2Listener{
addr: options.Addr, addr: options.Addr,
logger: options.Logger, 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 { if err = l.parseMetadata(md); err != nil {
return return
} }
@ -71,7 +71,7 @@ func (l *Listener) Init(md md.Metadata) (err error) {
return return
} }
func (l *Listener) Accept() (conn net.Conn, err error) { func (l *h2Listener) Accept() (conn net.Conn, err error) {
var ok bool var ok bool
select { select {
case conn = <-l.connChan: case conn = <-l.connChan:
@ -83,7 +83,7 @@ func (l *Listener) Accept() (conn net.Conn, err error) {
return return
} }
func (l *Listener) listenLoop() { func (l *h2Listener) listenLoop() {
for { for {
conn, err := l.Listener.Accept() conn, err := l.Listener.Accept()
if err != nil { 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 { if l.md.tlsConfig != nil {
tlsConn := tls.Server(conn, l.md.tlsConfig) tlsConn := tls.Server(conn, l.md.tlsConfig)
// NOTE: HTTP2 server will check the TLS version, // NOTE: HTTP2 server will check the TLS version,
@ -114,7 +114,7 @@ func (l *Listener) handleLoop(conn net.Conn) {
l.server.ServeConn(conn, &opt) 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", log.Logf("[http2] %s -> %s %s %s %s",
r.RemoteAddr, r.Host, r.Method, r.RequestURI, r.Proto) 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 <-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 { if l.md.path == "" && r.Method != http.MethodConnect {
w.WriteHeader(http.StatusMethodNotAllowed) w.WriteHeader(http.StatusMethodNotAllowed)
return nil, errors.New("method not allowed") return nil, errors.New("method not allowed")
@ -172,7 +172,7 @@ func (l *Listener) upgrade(w http.ResponseWriter, r *http.Request) (*conn, error
}, nil }, 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( l.md.tlsConfig, err = utils.LoadTLSConfig(
md.GetString(certFile), md.GetString(certFile),
md.GetString(keyFile), md.GetString(keyFile),

View File

@ -5,10 +5,10 @@ import (
"net" "net"
"net/http" "net/http"
"github.com/go-gost/gost/pkg/components/internal/utils" "github.com/go-gost/gost/pkg/internal/utils"
"github.com/go-gost/gost/pkg/components/listener" "github.com/go-gost/gost/pkg/listener"
md "github.com/go-gost/gost/pkg/components/metadata"
"github.com/go-gost/gost/pkg/logger" "github.com/go-gost/gost/pkg/logger"
md "github.com/go-gost/gost/pkg/metadata"
"github.com/go-gost/gost/pkg/registry" "github.com/go-gost/gost/pkg/registry"
"golang.org/x/net/http2" "golang.org/x/net/http2"
) )
@ -17,7 +17,7 @@ func init() {
registry.RegisterListener("http2", NewListener) registry.RegisterListener("http2", NewListener)
} }
type Listener struct { type http2Listener struct {
saddr string saddr string
md metadata md metadata
server *http.Server server *http.Server
@ -32,13 +32,13 @@ func NewListener(opts ...listener.Option) listener.Listener {
for _, opt := range opts { for _, opt := range opts {
opt(options) opt(options)
} }
return &Listener{ return &http2Listener{
saddr: options.Addr, saddr: options.Addr,
logger: options.Logger, 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 { if err = l.parseMetadata(md); err != nil {
return return
} }
@ -82,7 +82,7 @@ func (l *Listener) Init(md md.Metadata) (err error) {
return return
} }
func (l *Listener) Accept() (conn net.Conn, err error) { func (l *http2Listener) Accept() (conn net.Conn, err error) {
var ok bool var ok bool
select { select {
case conn = <-l.connChan: case conn = <-l.connChan:
@ -94,11 +94,11 @@ func (l *Listener) Accept() (conn net.Conn, err error) {
return return
} }
func (l *Listener) Addr() net.Addr { func (l *http2Listener) Addr() net.Addr {
return l.addr return l.addr
} }
func (l *Listener) Close() (err error) { func (l *http2Listener) Close() (err error) {
select { select {
case <-l.errChan: case <-l.errChan:
default: default:
@ -109,7 +109,7 @@ func (l *Listener) Close() (err error) {
return nil return nil
} }
func (l *Listener) handleFunc(w http.ResponseWriter, r *http.Request) { func (l *http2Listener) handleFunc(w http.ResponseWriter, r *http.Request) {
conn := &conn{ conn := &conn{
r: r, r: r,
w: w, w: w,
@ -125,7 +125,7 @@ func (l *Listener) handleFunc(w http.ResponseWriter, r *http.Request) {
<-conn.closed <-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( l.md.tlsConfig, err = utils.LoadTLSConfig(
md.GetString(certFile), md.GetString(certFile),
md.GetString(keyFile), md.GetString(keyFile),

View File

@ -4,10 +4,10 @@ import (
"net" "net"
"time" "time"
"github.com/go-gost/gost/pkg/components/internal/utils" "github.com/go-gost/gost/pkg/internal/utils"
"github.com/go-gost/gost/pkg/components/listener" "github.com/go-gost/gost/pkg/listener"
md "github.com/go-gost/gost/pkg/components/metadata"
"github.com/go-gost/gost/pkg/logger" "github.com/go-gost/gost/pkg/logger"
md "github.com/go-gost/gost/pkg/metadata"
"github.com/go-gost/gost/pkg/registry" "github.com/go-gost/gost/pkg/registry"
"github.com/xtaci/kcp-go/v5" "github.com/xtaci/kcp-go/v5"
"github.com/xtaci/smux" "github.com/xtaci/smux"
@ -18,7 +18,7 @@ func init() {
registry.RegisterListener("kcp", NewListener) registry.RegisterListener("kcp", NewListener)
} }
type Listener struct { type kcpListener struct {
addr string addr string
md metadata md metadata
ln *kcp.Listener ln *kcp.Listener
@ -32,13 +32,13 @@ func NewListener(opts ...listener.Option) listener.Listener {
for _, opt := range opts { for _, opt := range opts {
opt(options) opt(options)
} }
return &Listener{ return &kcpListener{
addr: options.Addr, addr: options.Addr,
logger: options.Logger, 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 { if err = l.parseMetadata(md); err != nil {
return return
} }
@ -88,7 +88,7 @@ func (l *Listener) Init(md md.Metadata) (err error) {
return return
} }
func (l *Listener) Accept() (conn net.Conn, err error) { func (l *kcpListener) Accept() (conn net.Conn, err error) {
var ok bool var ok bool
select { select {
case conn = <-l.connChan: case conn = <-l.connChan:
@ -100,15 +100,15 @@ func (l *Listener) Accept() (conn net.Conn, err error) {
return return
} }
func (l *Listener) Close() error { func (l *kcpListener) Close() error {
return l.ln.Close() return l.ln.Close()
} }
func (l *Listener) Addr() net.Addr { func (l *kcpListener) Addr() net.Addr {
return l.ln.Addr() return l.ln.Addr()
} }
func (l *Listener) listenLoop() { func (l *kcpListener) listenLoop() {
for { for {
conn, err := l.ln.AcceptKCP() conn, err := l.ln.AcceptKCP()
if err != nil { 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() defer conn.Close()
smuxConfig := smux.DefaultConfig() 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 return
} }

View File

@ -4,7 +4,7 @@ import (
"errors" "errors"
"net" "net"
"github.com/go-gost/gost/pkg/components/metadata" "github.com/go-gost/gost/pkg/metadata"
) )
var ( var (

View File

@ -3,10 +3,10 @@ package http
import ( import (
"net" "net"
"github.com/go-gost/gost/pkg/components/internal/utils" "github.com/go-gost/gost/pkg/internal/utils"
"github.com/go-gost/gost/pkg/components/listener" "github.com/go-gost/gost/pkg/listener"
md "github.com/go-gost/gost/pkg/components/metadata"
"github.com/go-gost/gost/pkg/logger" "github.com/go-gost/gost/pkg/logger"
md "github.com/go-gost/gost/pkg/metadata"
"github.com/go-gost/gost/pkg/registry" "github.com/go-gost/gost/pkg/registry"
) )
@ -14,7 +14,7 @@ func init() {
registry.RegisterListener("obfs-http", NewListener) registry.RegisterListener("obfs-http", NewListener)
} }
type Listener struct { type obfsListener struct {
addr string addr string
md metadata md metadata
net.Listener net.Listener
@ -26,13 +26,13 @@ func NewListener(opts ...listener.Option) listener.Listener {
for _, opt := range opts { for _, opt := range opts {
opt(options) opt(options)
} }
return &Listener{ return &obfsListener{
addr: options.Addr, addr: options.Addr,
logger: options.Logger, 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 { if err = l.parseMetadata(md); err != nil {
return return
} }
@ -58,7 +58,7 @@ func (l *Listener) Init(md md.Metadata) (err error) {
return return
} }
func (l *Listener) Accept() (net.Conn, error) { func (l *obfsListener) Accept() (net.Conn, error) {
c, err := l.Listener.Accept() c, err := l.Listener.Accept()
if err != nil { if err != nil {
return nil, err return nil, err
@ -67,7 +67,7 @@ func (l *Listener) Accept() (net.Conn, error) {
return &conn{Conn: c}, nil 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.keepAlive = md.GetBool(keepAlive)
l.md.keepAlivePeriod = md.GetDuration(keepAlivePeriod) l.md.keepAlivePeriod = md.GetDuration(keepAlivePeriod)

View File

@ -3,10 +3,10 @@ package tls
import ( import (
"net" "net"
"github.com/go-gost/gost/pkg/components/internal/utils" "github.com/go-gost/gost/pkg/internal/utils"
"github.com/go-gost/gost/pkg/components/listener" "github.com/go-gost/gost/pkg/listener"
md "github.com/go-gost/gost/pkg/components/metadata"
"github.com/go-gost/gost/pkg/logger" "github.com/go-gost/gost/pkg/logger"
md "github.com/go-gost/gost/pkg/metadata"
"github.com/go-gost/gost/pkg/registry" "github.com/go-gost/gost/pkg/registry"
) )
@ -14,7 +14,7 @@ func init() {
registry.RegisterListener("obfs-tls", NewListener) registry.RegisterListener("obfs-tls", NewListener)
} }
type Listener struct { type obfsListener struct {
addr string addr string
md metadata md metadata
net.Listener net.Listener
@ -26,13 +26,13 @@ func NewListener(opts ...listener.Option) listener.Listener {
for _, opt := range opts { for _, opt := range opts {
opt(options) opt(options)
} }
return &Listener{ return &obfsListener{
addr: options.Addr, addr: options.Addr,
logger: options.Logger, 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 { if err = l.parseMetadata(md); err != nil {
return return
} }
@ -58,7 +58,7 @@ func (l *Listener) Init(md md.Metadata) (err error) {
return return
} }
func (l *Listener) Accept() (net.Conn, error) { func (l *obfsListener) Accept() (net.Conn, error) {
c, err := l.Listener.Accept() c, err := l.Listener.Accept()
if err != nil { if err != nil {
return nil, err return nil, err
@ -67,7 +67,7 @@ func (l *Listener) Accept() (net.Conn, error) {
return &conn{Conn: c}, nil 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.keepAlive = md.GetBool(keepAlive)
l.md.keepAlivePeriod = md.GetDuration(keepAlivePeriod) l.md.keepAlivePeriod = md.GetDuration(keepAlivePeriod)

View File

@ -4,10 +4,10 @@ import (
"context" "context"
"net" "net"
"github.com/go-gost/gost/pkg/components/internal/utils" "github.com/go-gost/gost/pkg/internal/utils"
"github.com/go-gost/gost/pkg/components/listener" "github.com/go-gost/gost/pkg/listener"
md "github.com/go-gost/gost/pkg/components/metadata"
"github.com/go-gost/gost/pkg/logger" "github.com/go-gost/gost/pkg/logger"
md "github.com/go-gost/gost/pkg/metadata"
"github.com/go-gost/gost/pkg/registry" "github.com/go-gost/gost/pkg/registry"
"github.com/lucas-clemente/quic-go" "github.com/lucas-clemente/quic-go"
) )
@ -16,7 +16,7 @@ func init() {
registry.RegisterListener("quic", NewListener) registry.RegisterListener("quic", NewListener)
} }
type Listener struct { type quicListener struct {
addr string addr string
md metadata md metadata
ln quic.Listener ln quic.Listener
@ -30,13 +30,13 @@ func NewListener(opts ...listener.Option) listener.Listener {
for _, opt := range opts { for _, opt := range opts {
opt(options) opt(options)
} }
return &Listener{ return &quicListener{
addr: options.Addr, addr: options.Addr,
logger: options.Logger, 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 { if err = l.parseMetadata(md); err != nil {
return return
} }
@ -76,7 +76,7 @@ func (l *Listener) Init(md md.Metadata) (err error) {
return return
} }
func (l *Listener) Accept() (conn net.Conn, err error) { func (l *quicListener) Accept() (conn net.Conn, err error) {
var ok bool var ok bool
select { select {
case conn = <-l.connChan: case conn = <-l.connChan:
@ -88,15 +88,15 @@ func (l *Listener) Accept() (conn net.Conn, err error) {
return return
} }
func (l *Listener) Close() error { func (l *quicListener) Close() error {
return l.ln.Close() return l.ln.Close()
} }
func (l *Listener) Addr() net.Addr { func (l *quicListener) Addr() net.Addr {
return l.ln.Addr() return l.ln.Addr()
} }
func (l *Listener) listenLoop() { func (l *quicListener) listenLoop() {
for { for {
ctx := context.Background() ctx := context.Background()
session, err := l.ln.Accept(ctx) 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, "") defer session.CloseWithError(0, "")
for { 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 return
} }

View File

@ -3,10 +3,10 @@ package tcp
import ( import (
"net" "net"
"github.com/go-gost/gost/pkg/components/internal/utils" "github.com/go-gost/gost/pkg/internal/utils"
"github.com/go-gost/gost/pkg/components/listener" "github.com/go-gost/gost/pkg/listener"
md "github.com/go-gost/gost/pkg/components/metadata"
"github.com/go-gost/gost/pkg/logger" "github.com/go-gost/gost/pkg/logger"
md "github.com/go-gost/gost/pkg/metadata"
"github.com/go-gost/gost/pkg/registry" "github.com/go-gost/gost/pkg/registry"
) )
@ -14,7 +14,7 @@ func init() {
registry.RegisterListener("tcp", NewListener) registry.RegisterListener("tcp", NewListener)
} }
type Listener struct { type tcpListener struct {
addr string addr string
md metadata md metadata
net.Listener net.Listener
@ -26,13 +26,13 @@ func NewListener(opts ...listener.Option) listener.Listener {
for _, opt := range opts { for _, opt := range opts {
opt(options) opt(options)
} }
return &Listener{ return &tcpListener{
addr: options.Addr, addr: options.Addr,
logger: options.Logger, 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 { if err = l.parseMetadata(md); err != nil {
return return
} }
@ -59,7 +59,7 @@ func (l *Listener) Init(md md.Metadata) (err error) {
return 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.keepAlive = md.GetBool(keepAlive)
l.md.keepAlivePeriod = md.GetDuration(keepAlivePeriod) l.md.keepAlivePeriod = md.GetDuration(keepAlivePeriod)

View File

@ -4,10 +4,10 @@ import (
"crypto/tls" "crypto/tls"
"net" "net"
"github.com/go-gost/gost/pkg/components/internal/utils" "github.com/go-gost/gost/pkg/internal/utils"
"github.com/go-gost/gost/pkg/components/listener" "github.com/go-gost/gost/pkg/listener"
md "github.com/go-gost/gost/pkg/components/metadata"
"github.com/go-gost/gost/pkg/logger" "github.com/go-gost/gost/pkg/logger"
md "github.com/go-gost/gost/pkg/metadata"
"github.com/go-gost/gost/pkg/registry" "github.com/go-gost/gost/pkg/registry"
) )
@ -15,7 +15,7 @@ func init() {
registry.RegisterListener("tls", NewListener) registry.RegisterListener("tls", NewListener)
} }
type Listener struct { type tlsListener struct {
addr string addr string
md metadata md metadata
net.Listener net.Listener
@ -27,13 +27,13 @@ func NewListener(opts ...listener.Option) listener.Listener {
for _, opt := range opts { for _, opt := range opts {
opt(options) opt(options)
} }
return &Listener{ return &tlsListener{
addr: options.Addr, addr: options.Addr,
logger: options.Logger, 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 { if err = l.parseMetadata(md); err != nil {
return return
} }
@ -55,7 +55,7 @@ func (l *Listener) Init(md md.Metadata) (err error) {
return 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( l.md.tlsConfig, err = utils.LoadTLSConfig(
md.GetString(certFile), md.GetString(certFile),
md.GetString(keyFile), md.GetString(keyFile),

View File

@ -4,10 +4,10 @@ import (
"crypto/tls" "crypto/tls"
"net" "net"
"github.com/go-gost/gost/pkg/components/internal/utils" "github.com/go-gost/gost/pkg/internal/utils"
"github.com/go-gost/gost/pkg/components/listener" "github.com/go-gost/gost/pkg/listener"
md "github.com/go-gost/gost/pkg/components/metadata"
"github.com/go-gost/gost/pkg/logger" "github.com/go-gost/gost/pkg/logger"
md "github.com/go-gost/gost/pkg/metadata"
"github.com/go-gost/gost/pkg/registry" "github.com/go-gost/gost/pkg/registry"
"github.com/xtaci/smux" "github.com/xtaci/smux"
) )
@ -16,7 +16,7 @@ func init() {
registry.RegisterListener("mtls", NewListener) registry.RegisterListener("mtls", NewListener)
} }
type Listener struct { type mtlsListener struct {
addr string addr string
md metadata md metadata
net.Listener net.Listener
@ -30,13 +30,13 @@ func NewListener(opts ...listener.Option) listener.Listener {
for _, opt := range opts { for _, opt := range opts {
opt(options) opt(options)
} }
return &Listener{ return &mtlsListener{
addr: options.Addr, addr: options.Addr,
logger: options.Logger, 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 { if err = l.parseMetadata(md); err != nil {
return return
} }
@ -59,7 +59,7 @@ func (l *Listener) Init(md md.Metadata) (err error) {
return return
} }
func (l *Listener) listenLoop() { func (l *mtlsListener) listenLoop() {
for { for {
conn, err := l.Listener.Accept() conn, err := l.Listener.Accept()
if err != nil { 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 := smux.DefaultConfig()
smuxConfig.KeepAliveDisabled = l.md.muxKeepAliveDisabled smuxConfig.KeepAliveDisabled = l.md.muxKeepAliveDisabled
if l.md.muxKeepAlivePeriod > 0 { 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 var ok bool
select { select {
case conn = <-l.connChan: case conn = <-l.connChan:
@ -126,7 +126,7 @@ func (l *Listener) Accept() (conn net.Conn, err error) {
return 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( l.md.tlsConfig, err = utils.LoadTLSConfig(
md.GetString(certFile), md.GetString(certFile),
md.GetString(keyFile), md.GetString(keyFile),

View File

@ -5,9 +5,9 @@ import (
"sync" "sync"
"sync/atomic" "sync/atomic"
"github.com/go-gost/gost/pkg/components/listener" "github.com/go-gost/gost/pkg/listener"
md "github.com/go-gost/gost/pkg/components/metadata"
"github.com/go-gost/gost/pkg/logger" "github.com/go-gost/gost/pkg/logger"
md "github.com/go-gost/gost/pkg/metadata"
"github.com/go-gost/gost/pkg/registry" "github.com/go-gost/gost/pkg/registry"
) )
@ -15,7 +15,7 @@ func init() {
registry.RegisterListener("udp", NewListener) registry.RegisterListener("udp", NewListener)
} }
type Listener struct { type udpListener struct {
addr string addr string
md metadata md metadata
conn net.PacketConn conn net.PacketConn
@ -30,13 +30,13 @@ func NewListener(opts ...listener.Option) listener.Listener {
for _, opt := range opts { for _, opt := range opts {
opt(options) opt(options)
} }
return &Listener{ return &udpListener{
addr: options.Addr, addr: options.Addr,
logger: options.Logger, 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 { if err = l.parseMetadata(md); err != nil {
return return
} }
@ -61,7 +61,7 @@ func (l *Listener) Init(md md.Metadata) (err error) {
return return
} }
func (l *Listener) Accept() (conn net.Conn, err error) { func (l *udpListener) Accept() (conn net.Conn, err error) {
var ok bool var ok bool
select { select {
case conn = <-l.connChan: case conn = <-l.connChan:
@ -73,7 +73,7 @@ func (l *Listener) Accept() (conn net.Conn, err error) {
return return
} }
func (l *Listener) Close() error { func (l *udpListener) Close() error {
err := l.conn.Close() err := l.conn.Close()
l.connPool.Range(func(k interface{}, v *serverConn) bool { l.connPool.Range(func(k interface{}, v *serverConn) bool {
v.Close() v.Close()
@ -82,11 +82,11 @@ func (l *Listener) Close() error {
return err return err
} }
func (l *Listener) Addr() net.Addr { func (l *udpListener) Addr() net.Addr {
return l.conn.LocalAddr() return l.conn.LocalAddr()
} }
func (l *Listener) listenLoop() { func (l *udpListener) listenLoop() {
for { for {
b := make([]byte, l.md.readBufferSize) 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 return
} }

View File

@ -5,10 +5,10 @@ import (
"net" "net"
"net/http" "net/http"
"github.com/go-gost/gost/pkg/components/internal/utils" "github.com/go-gost/gost/pkg/internal/utils"
"github.com/go-gost/gost/pkg/components/listener" "github.com/go-gost/gost/pkg/listener"
md "github.com/go-gost/gost/pkg/components/metadata"
"github.com/go-gost/gost/pkg/logger" "github.com/go-gost/gost/pkg/logger"
md "github.com/go-gost/gost/pkg/metadata"
"github.com/go-gost/gost/pkg/registry" "github.com/go-gost/gost/pkg/registry"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
) )
@ -18,7 +18,7 @@ func init() {
registry.RegisterListener("wss", NewListener) registry.RegisterListener("wss", NewListener)
} }
type Listener struct { type wsListener struct {
saddr string saddr string
md metadata md metadata
addr net.Addr addr net.Addr
@ -34,13 +34,13 @@ func NewListener(opts ...listener.Option) listener.Listener {
for _, opt := range opts { for _, opt := range opts {
opt(options) opt(options)
} }
return &Listener{ return &wsListener{
saddr: options.Addr, saddr: options.Addr,
logger: options.Logger, 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 { if err = l.parseMetadata(md); err != nil {
return return
} }
@ -94,7 +94,7 @@ func (l *Listener) Init(md md.Metadata) (err error) {
return return
} }
func (l *Listener) Accept() (conn net.Conn, err error) { func (l *wsListener) Accept() (conn net.Conn, err error) {
var ok bool var ok bool
select { select {
case conn = <-l.connChan: case conn = <-l.connChan:
@ -106,15 +106,15 @@ func (l *Listener) Accept() (conn net.Conn, err error) {
return return
} }
func (l *Listener) Close() error { func (l *wsListener) Close() error {
return l.srv.Close() return l.srv.Close()
} }
func (l *Listener) Addr() net.Addr { func (l *wsListener) Addr() net.Addr {
return l.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( l.md.tlsConfig, err = utils.LoadTLSConfig(
md.GetString(certFile), md.GetString(certFile),
md.GetString(keyFile), md.GetString(keyFile),
@ -127,7 +127,7 @@ func (l *Listener) parseMetadata(md md.Metadata) (err error) {
return 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) conn, err := l.upgrader.Upgrade(w, r, l.md.responseHeader)
if err != nil { if err != nil {
l.logger.Error(err) l.logger.Error(err)

View File

@ -5,10 +5,10 @@ import (
"net" "net"
"net/http" "net/http"
"github.com/go-gost/gost/pkg/components/internal/utils" "github.com/go-gost/gost/pkg/internal/utils"
"github.com/go-gost/gost/pkg/components/listener" "github.com/go-gost/gost/pkg/listener"
md "github.com/go-gost/gost/pkg/components/metadata"
"github.com/go-gost/gost/pkg/logger" "github.com/go-gost/gost/pkg/logger"
md "github.com/go-gost/gost/pkg/metadata"
"github.com/go-gost/gost/pkg/registry" "github.com/go-gost/gost/pkg/registry"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
"github.com/xtaci/smux" "github.com/xtaci/smux"
@ -19,7 +19,7 @@ func init() {
registry.RegisterListener("mwss", NewListener) registry.RegisterListener("mwss", NewListener)
} }
type Listener struct { type mwsListener struct {
saddr string saddr string
md metadata md metadata
addr net.Addr addr net.Addr
@ -35,12 +35,12 @@ func NewListener(opts ...listener.Option) listener.Listener {
for _, opt := range opts { for _, opt := range opts {
opt(options) opt(options)
} }
return &Listener{ return &mwsListener{
logger: options.Logger, 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 { if err = l.parseMetadata(md); err != nil {
return return
} }
@ -90,7 +90,7 @@ func (l *Listener) Init(md md.Metadata) (err error) {
return return
} }
func (l *Listener) Accept() (conn net.Conn, err error) { func (l *mwsListener) Accept() (conn net.Conn, err error) {
var ok bool var ok bool
select { select {
case conn = <-l.connChan: case conn = <-l.connChan:
@ -102,15 +102,15 @@ func (l *Listener) Accept() (conn net.Conn, err error) {
return return
} }
func (l *Listener) Close() error { func (l *mwsListener) Close() error {
return l.srv.Close() return l.srv.Close()
} }
func (l *Listener) Addr() net.Addr { func (l *mwsListener) Addr() net.Addr {
return l.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( l.md.tlsConfig, err = utils.LoadTLSConfig(
md.GetString(certFile), md.GetString(certFile),
md.GetString(keyFile), md.GetString(keyFile),
@ -123,7 +123,7 @@ func (l *Listener) parseMetadata(md md.Metadata) (err error) {
return 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) conn, err := l.upgrader.Upgrade(w, r, l.md.responseHeader)
if err != nil { if err != nil {
l.logger.Error(err) l.logger.Error(err)
@ -133,7 +133,7 @@ func (l *Listener) upgrade(w http.ResponseWriter, r *http.Request) {
l.mux(utils.WebsocketServerConn(conn)) l.mux(utils.WebsocketServerConn(conn))
} }
func (l *Listener) mux(conn net.Conn) { func (l *mwsListener) mux(conn net.Conn) {
smuxConfig := smux.DefaultConfig() smuxConfig := smux.DefaultConfig()
smuxConfig.KeepAliveDisabled = l.md.muxKeepAliveDisabled smuxConfig.KeepAliveDisabled = l.md.muxKeepAliveDisabled
if l.md.muxKeepAlivePeriod > 0 { if l.md.muxKeepAlivePeriod > 0 {

View File

@ -1,10 +1,10 @@
package registry package registry
import ( import (
"github.com/go-gost/gost/pkg/components/connector" "github.com/go-gost/gost/pkg/connector"
"github.com/go-gost/gost/pkg/components/dialer" "github.com/go-gost/gost/pkg/dialer"
"github.com/go-gost/gost/pkg/components/handler" "github.com/go-gost/gost/pkg/handler"
"github.com/go-gost/gost/pkg/components/listener" "github.com/go-gost/gost/pkg/listener"
) )
type NewListener func(opts ...listener.Option) listener.Listener type NewListener func(opts ...listener.Option) listener.Listener

View File

@ -5,8 +5,8 @@ import (
"net" "net"
"time" "time"
"github.com/go-gost/gost/pkg/components/handler" "github.com/go-gost/gost/pkg/handler"
"github.com/go-gost/gost/pkg/components/listener" "github.com/go-gost/gost/pkg/listener"
) )
type Service struct { type Service struct {