add proxyProtocol support for dialer

This commit is contained in:
ginuerzh
2025-08-03 15:36:29 +08:00
parent f71351f5ef
commit ad5cf6fd61
23 changed files with 260 additions and 48 deletions
+8
View File
@@ -8,6 +8,8 @@ import (
"github.com/go-gost/core/dialer" "github.com/go-gost/core/dialer"
"github.com/go-gost/core/logger" "github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata" md "github.com/go-gost/core/metadata"
ctxvalue "github.com/go-gost/x/ctx"
"github.com/go-gost/x/internal/net/proxyproto"
xdtls "github.com/go-gost/x/internal/util/dtls" xdtls "github.com/go-gost/x/internal/util/dtls"
"github.com/go-gost/x/registry" "github.com/go-gost/x/registry"
"github.com/pion/dtls/v2" "github.com/pion/dtls/v2"
@@ -50,6 +52,12 @@ func (d *dtlsDialer) Dial(ctx context.Context, addr string, opts ...dialer.DialO
return nil, err return nil, err
} }
conn = proxyproto.WrapClientConn(
d.options.ProxyProtocol,
ctxvalue.SrcAddrFromContext(ctx),
ctxvalue.DstAddrFromContext(ctx),
conn)
tlsCfg := d.options.TLSConfig tlsCfg := d.options.TLSConfig
if tlsCfg == nil { if tlsCfg == nil {
tlsCfg = &tls.Config{ tlsCfg = &tls.Config{
+14 -1
View File
@@ -7,6 +7,8 @@ import (
"github.com/go-gost/core/dialer" "github.com/go-gost/core/dialer"
md "github.com/go-gost/core/metadata" md "github.com/go-gost/core/metadata"
ctxvalue "github.com/go-gost/x/ctx"
"github.com/go-gost/x/internal/net/proxyproto"
pb "github.com/go-gost/x/internal/util/grpc/proto" pb "github.com/go-gost/x/internal/util/grpc/proto"
"github.com/go-gost/x/registry" "github.com/go-gost/x/registry"
"google.golang.org/grpc" "google.golang.org/grpc"
@@ -71,7 +73,18 @@ func (d *grpcDialer) Dial(ctx context.Context, addr string, opts ...dialer.DialO
grpcOpts := []grpc.DialOption{ grpcOpts := []grpc.DialOption{
// grpc.WithBlock(), // grpc.WithBlock(),
grpc.WithContextDialer(func(c context.Context, s string) (net.Conn, error) { grpc.WithContextDialer(func(c context.Context, s string) (net.Conn, error) {
return options.Dialer.Dial(c, "tcp", s) conn, err := options.Dialer.Dial(c, "tcp", s)
if err != nil {
return nil, err
}
conn = proxyproto.WrapClientConn(
d.options.ProxyProtocol,
ctxvalue.SrcAddrFromContext(ctx),
ctxvalue.DstAddrFromContext(ctx),
conn)
return conn, nil
}), }),
grpc.WithAuthority(host), grpc.WithAuthority(host),
grpc.WithConnectParams(grpc.ConnectParams{ grpc.WithConnectParams(grpc.ConnectParams{
+14 -1
View File
@@ -10,7 +10,9 @@ import (
"github.com/go-gost/core/dialer" "github.com/go-gost/core/dialer"
"github.com/go-gost/core/logger" "github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata" md "github.com/go-gost/core/metadata"
ctxvalue "github.com/go-gost/x/ctx"
net_dialer "github.com/go-gost/x/internal/net/dialer" net_dialer "github.com/go-gost/x/internal/net/dialer"
"github.com/go-gost/x/internal/net/proxyproto"
mdx "github.com/go-gost/x/metadata" mdx "github.com/go-gost/x/metadata"
"github.com/go-gost/x/registry" "github.com/go-gost/x/registry"
) )
@@ -91,7 +93,18 @@ func (d *http2Dialer) Dial(ctx context.Context, address string, opts ...dialer.D
if netd == nil { if netd == nil {
netd = net_dialer.DefaultNetDialer netd = net_dialer.DefaultNetDialer
} }
return netd.Dial(ctx, network, addr) conn, err := netd.Dial(ctx, network, addr)
if err != nil {
return nil, err
}
conn = proxyproto.WrapClientConn(
d.options.ProxyProtocol,
ctxvalue.SrcAddrFromContext(ctx),
ctxvalue.DstAddrFromContext(ctx),
conn)
return conn, nil
}, },
ForceAttemptHTTP2: true, ForceAttemptHTTP2: true,
MaxIdleConns: 16, MaxIdleConns: 16,
+26 -2
View File
@@ -15,6 +15,8 @@ import (
"github.com/go-gost/core/dialer" "github.com/go-gost/core/dialer"
"github.com/go-gost/core/logger" "github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata" md "github.com/go-gost/core/metadata"
ctxvalue "github.com/go-gost/x/ctx"
"github.com/go-gost/x/internal/net/proxyproto"
"github.com/go-gost/x/registry" "github.com/go-gost/x/registry"
"golang.org/x/net/http2" "golang.org/x/net/http2"
) )
@@ -94,14 +96,36 @@ func (d *h2Dialer) Dial(ctx context.Context, address string, opts ...dialer.Dial
client.Transport = &http2.Transport{ client.Transport = &http2.Transport{
AllowHTTP: true, AllowHTTP: true,
DialTLSContext: func(ctx context.Context, network, addr string, cfg *tls.Config) (net.Conn, error) { DialTLSContext: func(ctx context.Context, network, addr string, cfg *tls.Config) (net.Conn, error) {
return options.Dialer.Dial(ctx, network, addr) conn, err := options.Dialer.Dial(ctx, network, addr)
if err != nil {
return nil, err
}
conn = proxyproto.WrapClientConn(
d.options.ProxyProtocol,
ctxvalue.SrcAddrFromContext(ctx),
ctxvalue.DstAddrFromContext(ctx),
conn)
return conn, nil
}, },
} }
} else { } else {
client.Transport = &http.Transport{ client.Transport = &http.Transport{
TLSClientConfig: d.options.TLSConfig, TLSClientConfig: d.options.TLSConfig,
DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
return options.Dialer.Dial(ctx, network, addr) conn, err := options.Dialer.Dial(ctx, network, addr)
if err != nil {
return nil, err
}
conn = proxyproto.WrapClientConn(
d.options.ProxyProtocol,
ctxvalue.SrcAddrFromContext(ctx),
ctxvalue.DstAddrFromContext(ctx),
conn)
return conn, nil
}, },
ForceAttemptHTTP2: true, ForceAttemptHTTP2: true,
MaxIdleConns: 100, MaxIdleConns: 100,
+8
View File
@@ -10,6 +10,8 @@ import (
"github.com/go-gost/core/dialer" "github.com/go-gost/core/dialer"
"github.com/go-gost/core/logger" "github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata" md "github.com/go-gost/core/metadata"
ctxvalue "github.com/go-gost/x/ctx"
"github.com/go-gost/x/internal/net/proxyproto"
"github.com/go-gost/x/internal/util/mux" "github.com/go-gost/x/internal/util/mux"
"github.com/go-gost/x/registry" "github.com/go-gost/x/registry"
) )
@@ -72,6 +74,12 @@ func (d *mtcpDialer) Dial(ctx context.Context, addr string, opts ...dialer.DialO
return return
} }
conn = proxyproto.WrapClientConn(
d.options.ProxyProtocol,
ctxvalue.SrcAddrFromContext(ctx),
ctxvalue.DstAddrFromContext(ctx),
conn)
session = &muxSession{conn: conn} session = &muxSession{conn: conn}
d.sessions[addr] = session d.sessions[addr] = session
} }
+8
View File
@@ -11,6 +11,8 @@ import (
"github.com/go-gost/core/dialer" "github.com/go-gost/core/dialer"
"github.com/go-gost/core/logger" "github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata" md "github.com/go-gost/core/metadata"
ctxvalue "github.com/go-gost/x/ctx"
"github.com/go-gost/x/internal/net/proxyproto"
"github.com/go-gost/x/internal/util/mux" "github.com/go-gost/x/internal/util/mux"
"github.com/go-gost/x/registry" "github.com/go-gost/x/registry"
) )
@@ -73,6 +75,12 @@ func (d *mtlsDialer) Dial(ctx context.Context, addr string, opts ...dialer.DialO
return return
} }
conn = proxyproto.WrapClientConn(
d.options.ProxyProtocol,
ctxvalue.SrcAddrFromContext(ctx),
ctxvalue.DstAddrFromContext(ctx),
conn)
session = &muxSession{conn: conn} session = &muxSession{conn: conn}
d.sessions[addr] = session d.sessions[addr] = session
} }
+8
View File
@@ -11,6 +11,8 @@ import (
"github.com/go-gost/core/dialer" "github.com/go-gost/core/dialer"
"github.com/go-gost/core/logger" "github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata" md "github.com/go-gost/core/metadata"
ctxvalue "github.com/go-gost/x/ctx"
"github.com/go-gost/x/internal/net/proxyproto"
"github.com/go-gost/x/internal/util/mux" "github.com/go-gost/x/internal/util/mux"
ws_util "github.com/go-gost/x/internal/util/ws" ws_util "github.com/go-gost/x/internal/util/ws"
"github.com/go-gost/x/registry" "github.com/go-gost/x/registry"
@@ -87,6 +89,12 @@ func (d *mwsDialer) Dial(ctx context.Context, addr string, opts ...dialer.DialOp
return return
} }
conn = proxyproto.WrapClientConn(
d.options.ProxyProtocol,
ctxvalue.SrcAddrFromContext(ctx),
ctxvalue.DstAddrFromContext(ctx),
conn)
session = &muxSession{conn: conn} session = &muxSession{conn: conn}
d.sessions[addr] = session d.sessions[addr] = session
} }
+8
View File
@@ -8,6 +8,8 @@ import (
"github.com/go-gost/core/dialer" "github.com/go-gost/core/dialer"
md "github.com/go-gost/core/metadata" md "github.com/go-gost/core/metadata"
ctxvalue "github.com/go-gost/x/ctx"
"github.com/go-gost/x/internal/net/proxyproto"
ssh_util "github.com/go-gost/x/internal/util/ssh" ssh_util "github.com/go-gost/x/internal/util/ssh"
"github.com/go-gost/x/registry" "github.com/go-gost/x/registry"
"golang.org/x/crypto/ssh" "golang.org/x/crypto/ssh"
@@ -73,6 +75,12 @@ func (d *sshDialer) Dial(ctx context.Context, addr string, opts ...dialer.DialOp
defer conn.SetDeadline(time.Time{}) defer conn.SetDeadline(time.Time{})
} }
conn = proxyproto.WrapClientConn(
d.options.ProxyProtocol,
ctxvalue.SrcAddrFromContext(ctx),
ctxvalue.DstAddrFromContext(ctx),
conn)
session, err = d.initSession(ctx, addr, conn) session, err = d.initSession(ctx, addr, conn)
if err != nil { if err != nil {
conn.Close() conn.Close()
+9 -1
View File
@@ -3,12 +3,14 @@ package sshd
import ( import (
"context" "context"
"net" "net"
"os"
"sync" "sync"
"time" "time"
"os"
"github.com/go-gost/core/dialer" "github.com/go-gost/core/dialer"
md "github.com/go-gost/core/metadata" md "github.com/go-gost/core/metadata"
ctxvalue "github.com/go-gost/x/ctx"
"github.com/go-gost/x/internal/net/proxyproto"
ssh_util "github.com/go-gost/x/internal/util/ssh" ssh_util "github.com/go-gost/x/internal/util/ssh"
"github.com/go-gost/x/registry" "github.com/go-gost/x/registry"
"golang.org/x/crypto/ssh" "golang.org/x/crypto/ssh"
@@ -76,6 +78,12 @@ func (d *sshdDialer) Dial(ctx context.Context, addr string, opts ...dialer.DialO
defer conn.SetDeadline(time.Time{}) defer conn.SetDeadline(time.Time{})
} }
conn = proxyproto.WrapClientConn(
d.options.ProxyProtocol,
ctxvalue.SrcAddrFromContext(ctx),
ctxvalue.DstAddrFromContext(ctx),
conn)
session, err = d.initSession(ctx, addr, conn) session, err = d.initSession(ctx, addr, conn)
if err != nil { if err != nil {
conn.Close() conn.Close()
+16 -5
View File
@@ -7,6 +7,8 @@ import (
"github.com/go-gost/core/dialer" "github.com/go-gost/core/dialer"
"github.com/go-gost/core/logger" "github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata" md "github.com/go-gost/core/metadata"
ctxvalue "github.com/go-gost/x/ctx"
"github.com/go-gost/x/internal/net/proxyproto"
"github.com/go-gost/x/registry" "github.com/go-gost/x/registry"
) )
@@ -15,18 +17,20 @@ func init() {
} }
type tcpDialer struct { type tcpDialer struct {
md metadata md metadata
logger logger.Logger logger logger.Logger
options dialer.Options
} }
func NewDialer(opts ...dialer.Option) dialer.Dialer { func NewDialer(opts ...dialer.Option) dialer.Dialer {
options := &dialer.Options{} options := dialer.Options{}
for _, opt := range opts { for _, opt := range opts {
opt(options) opt(&options)
} }
return &tcpDialer{ return &tcpDialer{
logger: options.Logger, logger: options.Logger,
options: options,
} }
} }
@@ -44,5 +48,12 @@ func (d *tcpDialer) Dial(ctx context.Context, addr string, opts ...dialer.DialOp
if err != nil { if err != nil {
d.logger.Error(err) d.logger.Error(err)
} }
conn = proxyproto.WrapClientConn(
d.options.ProxyProtocol,
ctxvalue.SrcAddrFromContext(ctx),
ctxvalue.DstAddrFromContext(ctx),
conn)
return conn, err return conn, err
} }
+12 -3
View File
@@ -9,6 +9,8 @@ import (
"github.com/go-gost/core/dialer" "github.com/go-gost/core/dialer"
"github.com/go-gost/core/logger" "github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata" md "github.com/go-gost/core/metadata"
ctxvalue "github.com/go-gost/x/ctx"
"github.com/go-gost/x/internal/net/proxyproto"
"github.com/go-gost/x/registry" "github.com/go-gost/x/registry"
) )
@@ -18,7 +20,7 @@ func init() {
type tlsDialer struct { type tlsDialer struct {
md metadata md metadata
logger logger.Logger log logger.Logger
options dialer.Options options dialer.Options
} }
@@ -29,7 +31,7 @@ func NewDialer(opts ...dialer.Option) dialer.Dialer {
} }
return &tlsDialer{ return &tlsDialer{
logger: options.Logger, log: options.Logger,
options: options, options: options,
} }
} }
@@ -46,8 +48,15 @@ func (d *tlsDialer) Dial(ctx context.Context, addr string, opts ...dialer.DialOp
conn, err := options.Dialer.Dial(ctx, "tcp", addr) conn, err := options.Dialer.Dial(ctx, "tcp", addr)
if err != nil { if err != nil {
d.logger.Error(err) d.log.Error(err)
} }
conn = proxyproto.WrapClientConn(
d.options.ProxyProtocol,
ctxvalue.SrcAddrFromContext(ctx),
ctxvalue.DstAddrFromContext(ctx),
conn)
return conn, err return conn, err
} }
+18 -5
View File
@@ -7,6 +7,8 @@ import (
"github.com/go-gost/core/dialer" "github.com/go-gost/core/dialer"
"github.com/go-gost/core/logger" "github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata" md "github.com/go-gost/core/metadata"
ctxvalue "github.com/go-gost/x/ctx"
"github.com/go-gost/x/internal/net/proxyproto"
"github.com/go-gost/x/registry" "github.com/go-gost/x/registry"
) )
@@ -15,8 +17,9 @@ func init() {
} }
type udpDialer struct { type udpDialer struct {
md metadata md metadata
logger logger.Logger logger logger.Logger
options dialer.Options
} }
func NewDialer(opts ...dialer.Option) dialer.Dialer { func NewDialer(opts ...dialer.Option) dialer.Dialer {
@@ -26,7 +29,8 @@ func NewDialer(opts ...dialer.Option) dialer.Dialer {
} }
return &udpDialer{ return &udpDialer{
logger: options.Logger, logger: options.Logger,
options: *options,
} }
} }
@@ -44,7 +48,16 @@ func (d *udpDialer) Dial(ctx context.Context, addr string, opts ...dialer.DialOp
if err != nil { if err != nil {
return nil, err return nil, err
} }
return &conn{
c = &conn{
UDPConn: c.(*net.UDPConn), UDPConn: c.(*net.UDPConn),
}, nil }
c = proxyproto.WrapClientConn(
d.options.ProxyProtocol,
ctxvalue.SrcAddrFromContext(ctx),
ctxvalue.DstAddrFromContext(ctx),
c)
return c, nil
} }
+9
View File
@@ -8,6 +8,8 @@ import (
"github.com/go-gost/core/dialer" "github.com/go-gost/core/dialer"
md "github.com/go-gost/core/metadata" md "github.com/go-gost/core/metadata"
ctxvalue "github.com/go-gost/x/ctx"
"github.com/go-gost/x/internal/net/proxyproto"
ws_util "github.com/go-gost/x/internal/util/ws" ws_util "github.com/go-gost/x/internal/util/ws"
"github.com/go-gost/x/registry" "github.com/go-gost/x/registry"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
@@ -61,6 +63,13 @@ func (d *wsDialer) Dial(ctx context.Context, addr string, opts ...dialer.DialOpt
if err != nil { if err != nil {
d.options.Logger.Error(err) d.options.Logger.Error(err)
} }
conn = proxyproto.WrapClientConn(
d.options.ProxyProtocol,
ctxvalue.SrcAddrFromContext(ctx),
ctxvalue.DstAddrFromContext(ctx),
conn)
return conn, err return conn, err
} }
-4
View File
@@ -214,10 +214,6 @@ func (c *conn) RemoteAddr() net.Addr {
return c.remoteAddr return c.remoteAddr
} }
func (c *conn) SetReadDeadline(t time.Time) error {
return nil
}
func (c *conn) IsIdle() bool { func (c *conn) IsIdle() bool {
return atomic.LoadInt32(&c.idle) > 0 return atomic.LoadInt32(&c.idle) > 0
} }
+23
View File
@@ -4,6 +4,8 @@ import (
"net" "net"
"time" "time"
"github.com/go-gost/core/metadata"
xnet "github.com/go-gost/x/internal/net"
smux "github.com/xtaci/smux" smux "github.com/xtaci/smux"
) )
@@ -143,6 +145,27 @@ func (c *streamConn) Write(b []byte) (n int, err error) {
return c.stream.Write(b) return c.stream.Write(b)
} }
func (c *streamConn) Metadata() metadata.Metadata {
if md, ok := c.Conn.(metadata.Metadatable); ok {
return md.Metadata()
}
return nil
}
func (c *streamConn) SrcAddr() net.Addr {
if sc, ok := c.Conn.(xnet.SrcAddr); ok {
return sc.SrcAddr()
}
return nil
}
func (c *streamConn) DstAddr() net.Addr {
if sc, ok := c.Conn.(xnet.DstAddr); ok {
return sc.DstAddr()
}
return nil
}
func (c *streamConn) Close() error { func (c *streamConn) Close() error {
return c.stream.Close() return c.stream.Close()
} }
+56
View File
@@ -0,0 +1,56 @@
package tls
import (
"crypto/tls"
"net"
"github.com/go-gost/core/metadata"
xnet "github.com/go-gost/x/internal/net"
)
type listener struct {
net.Listener
config *tls.Config
}
func NewListener(inner net.Listener, config *tls.Config) net.Listener {
l := new(listener)
l.Listener = inner
l.config = config
return l
}
func (l *listener) Accept() (net.Conn, error) {
c, err := l.Listener.Accept()
if err != nil {
return nil, err
}
return &tlsConn{
Conn: tls.Server(c, l.config),
}, nil
}
type tlsConn struct {
*tls.Conn
}
func (c *tlsConn) Metadata() metadata.Metadata {
if md, ok := c.NetConn().(metadata.Metadatable); ok {
return md.Metadata()
}
return nil
}
func (c *tlsConn) SrcAddr() net.Addr {
if sc, ok := c.NetConn().(xnet.SrcAddr); ok {
return sc.SrcAddr()
}
return nil
}
func (c *tlsConn) DstAddr() net.Addr {
if sc, ok := c.NetConn().(xnet.DstAddr); ok {
return sc.DstAddr()
}
return nil
}
+3
View File
@@ -81,6 +81,9 @@ func (c *websocketConn) SetWriteDeadline(t time.Time) error {
} }
func (c *websocketConn) SrcAddr() net.Addr { func (c *websocketConn) SrcAddr() net.Addr {
if sa, ok := c.Conn.NetConn().(xnet.SrcAddr); ok {
return sa.SrcAddr()
}
return c.srcAddr return c.srcAddr
} }
+2 -2
View File
@@ -2,7 +2,6 @@ package mtls
import ( import (
"context" "context"
"crypto/tls"
"net" "net"
"time" "time"
@@ -14,6 +13,7 @@ import (
xnet "github.com/go-gost/x/internal/net" xnet "github.com/go-gost/x/internal/net"
"github.com/go-gost/x/internal/net/proxyproto" "github.com/go-gost/x/internal/net/proxyproto"
"github.com/go-gost/x/internal/util/mux" "github.com/go-gost/x/internal/util/mux"
xtls "github.com/go-gost/x/internal/util/tls"
climiter "github.com/go-gost/x/limiter/conn/wrapper" climiter "github.com/go-gost/x/limiter/conn/wrapper"
limiter_wrapper "github.com/go-gost/x/limiter/traffic/wrapper" limiter_wrapper "github.com/go-gost/x/limiter/traffic/wrapper"
metrics "github.com/go-gost/x/metrics/wrapper" metrics "github.com/go-gost/x/metrics/wrapper"
@@ -71,7 +71,7 @@ func (l *mtlsListener) Init(md md.Metadata) (err error) {
ln = admission.WrapListener(l.options.Admission, ln) ln = admission.WrapListener(l.options.Admission, ln)
ln = limiter_wrapper.WrapListener(l.options.Service, ln, l.options.TrafficLimiter) ln = limiter_wrapper.WrapListener(l.options.Service, ln, l.options.TrafficLimiter)
ln = climiter.WrapListener(l.options.ConnLimiter, ln) ln = climiter.WrapListener(l.options.ConnLimiter, ln)
l.Listener = tls.NewListener(ln, l.options.TLSConfig) l.Listener = xtls.NewListener(ln, l.options.TLSConfig)
l.cqueue = make(chan net.Conn, l.md.backlog) l.cqueue = make(chan net.Conn, l.md.backlog)
l.errChan = make(chan error, 1) l.errChan = make(chan error, 1)
+10 -19
View File
@@ -2,7 +2,6 @@ package mws
import ( import (
"context" "context"
"crypto/tls"
"net" "net"
"net/http" "net/http"
"net/http/httputil" "net/http/httputil"
@@ -17,6 +16,7 @@ import (
xhttp "github.com/go-gost/x/internal/net/http" xhttp "github.com/go-gost/x/internal/net/http"
"github.com/go-gost/x/internal/net/proxyproto" "github.com/go-gost/x/internal/net/proxyproto"
"github.com/go-gost/x/internal/util/mux" "github.com/go-gost/x/internal/util/mux"
xtls "github.com/go-gost/x/internal/util/tls"
ws_util "github.com/go-gost/x/internal/util/ws" ws_util "github.com/go-gost/x/internal/util/ws"
climiter "github.com/go-gost/x/limiter/conn/wrapper" climiter "github.com/go-gost/x/limiter/conn/wrapper"
limiter_wrapper "github.com/go-gost/x/limiter/traffic/wrapper" limiter_wrapper "github.com/go-gost/x/limiter/traffic/wrapper"
@@ -38,7 +38,7 @@ type mwsListener struct {
cqueue chan net.Conn cqueue chan net.Conn
errChan chan error errChan chan error
tlsEnabled bool tlsEnabled bool
logger logger.Logger log logger.Logger
md metadata md metadata
options listener.Options options listener.Options
} }
@@ -49,7 +49,7 @@ func NewListener(opts ...listener.Option) listener.Listener {
opt(&options) opt(&options)
} }
return &mwsListener{ return &mwsListener{
logger: options.Logger, log: options.Logger,
options: options, options: options,
} }
} }
@@ -61,7 +61,7 @@ func NewTLSListener(opts ...listener.Option) listener.Listener {
} }
return &mwsListener{ return &mwsListener{
tlsEnabled: true, tlsEnabled: true,
logger: options.Logger, log: options.Logger,
options: options, options: options,
} }
} }
@@ -102,7 +102,7 @@ func (l *mwsListener) Init(md md.Metadata) (err error) {
lc := net.ListenConfig{} lc := net.ListenConfig{}
if l.md.mptcp { if l.md.mptcp {
lc.SetMultipathTCP(true) lc.SetMultipathTCP(true)
l.logger.Debugf("mptcp enabled: %v", lc.MultipathTCP()) l.log.Debugf("mptcp enabled: %v", lc.MultipathTCP())
} }
ln, err := lc.Listen(context.Background(), network, l.options.Addr) ln, err := lc.Listen(context.Background(), network, l.options.Addr)
if err != nil { if err != nil {
@@ -116,7 +116,7 @@ func (l *mwsListener) Init(md md.Metadata) (err error) {
ln = climiter.WrapListener(l.options.ConnLimiter, ln) ln = climiter.WrapListener(l.options.ConnLimiter, ln)
if l.tlsEnabled { if l.tlsEnabled {
ln = tls.NewListener(ln, l.options.TLSConfig) ln = xtls.NewListener(ln, l.options.TLSConfig)
} }
l.addr = ln.Addr() l.addr = ln.Addr()
@@ -168,7 +168,7 @@ func (l *mwsListener) upgrade(w http.ResponseWriter, r *http.Request) {
if clientIP != nil { if clientIP != nil {
cip = clientIP.String() cip = clientIP.String()
} }
log := l.logger.WithFields(map[string]any{ log := l.log.WithFields(map[string]any{
"local": l.addr.String(), "local": l.addr.String(),
"remote": r.RemoteAddr, "remote": r.RemoteAddr,
"client": cip, "client": cip,
@@ -189,10 +189,10 @@ func (l *mwsListener) upgrade(w http.ResponseWriter, r *http.Request) {
srcAddr = &net.TCPAddr{IP: clientIP} srcAddr = &net.TCPAddr{IP: clientIP}
} }
l.mux(ws_util.Conn(conn), srcAddr, log) l.mux(ws_util.ConnWithSrcAddr(conn, srcAddr), log)
} }
func (l *mwsListener) mux(conn net.Conn, srcAddr net.Addr, log logger.Logger) { func (l *mwsListener) mux(conn net.Conn, log logger.Logger) {
defer conn.Close() defer conn.Close()
session, err := mux.ServerSession(conn, l.md.muxCfg) session, err := mux.ServerSession(conn, l.md.muxCfg)
@@ -210,19 +210,10 @@ func (l *mwsListener) mux(conn net.Conn, srcAddr net.Addr, log logger.Logger) {
} }
select { select {
case l.cqueue <- &connWithSrcAddr{Conn: stream, srcAddr: srcAddr}: case l.cqueue <- stream:
default: default:
stream.Close() stream.Close()
log.Warnf("connection queue is full, client %s discarded", stream.RemoteAddr()) log.Warnf("connection queue is full, client %s discarded", stream.RemoteAddr())
} }
} }
} }
type connWithSrcAddr struct {
net.Conn
srcAddr net.Addr
}
func (c *connWithSrcAddr) SrcAddr() net.Addr {
return c.srcAddr
}
+1
View File
@@ -80,6 +80,7 @@ func (l *rtcpListener) Accept() (conn net.Conn, err error) {
if err != nil { if err != nil {
return nil, listener.NewBindError(err) return nil, listener.NewBindError(err)
} }
ln = metrics.WrapListener(l.options.Service, ln) ln = metrics.WrapListener(l.options.Service, ln)
ln = stats.WrapListener(ln, l.options.Stats) ln = stats.WrapListener(ln, l.options.Stats)
ln = admission.WrapListener(l.options.Admission, ln) ln = admission.WrapListener(l.options.Admission, ln)
+2 -3
View File
@@ -2,7 +2,6 @@ package tls
import ( import (
"context" "context"
"crypto/tls"
"net" "net"
"time" "time"
@@ -13,6 +12,7 @@ import (
admission "github.com/go-gost/x/admission/wrapper" admission "github.com/go-gost/x/admission/wrapper"
xnet "github.com/go-gost/x/internal/net" xnet "github.com/go-gost/x/internal/net"
"github.com/go-gost/x/internal/net/proxyproto" "github.com/go-gost/x/internal/net/proxyproto"
xtls "github.com/go-gost/x/internal/util/tls"
climiter "github.com/go-gost/x/limiter/conn/wrapper" climiter "github.com/go-gost/x/limiter/conn/wrapper"
limiter_wrapper "github.com/go-gost/x/limiter/traffic/wrapper" limiter_wrapper "github.com/go-gost/x/limiter/traffic/wrapper"
metrics "github.com/go-gost/x/metrics/wrapper" metrics "github.com/go-gost/x/metrics/wrapper"
@@ -67,8 +67,7 @@ func (l *tlsListener) Init(md md.Metadata) (err error) {
ln = admission.WrapListener(l.options.Admission, ln) ln = admission.WrapListener(l.options.Admission, ln)
ln = limiter_wrapper.WrapListener(l.options.Service, ln, l.options.TrafficLimiter) ln = limiter_wrapper.WrapListener(l.options.Service, ln, l.options.TrafficLimiter)
ln = climiter.WrapListener(l.options.ConnLimiter, ln) ln = climiter.WrapListener(l.options.ConnLimiter, ln)
l.ln = xtls.NewListener(ln, l.options.TLSConfig)
l.ln = tls.NewListener(ln, l.options.TLSConfig)
return return
} }
+3
View File
@@ -2,12 +2,14 @@ package unix
import ( import (
"net" "net"
"time"
"github.com/go-gost/core/limiter" "github.com/go-gost/core/limiter"
"github.com/go-gost/core/listener" "github.com/go-gost/core/listener"
"github.com/go-gost/core/logger" "github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata" md "github.com/go-gost/core/metadata"
admission "github.com/go-gost/x/admission/wrapper" admission "github.com/go-gost/x/admission/wrapper"
"github.com/go-gost/x/internal/net/proxyproto"
climiter "github.com/go-gost/x/limiter/conn/wrapper" climiter "github.com/go-gost/x/limiter/conn/wrapper"
limiter_wrapper "github.com/go-gost/x/limiter/traffic/wrapper" limiter_wrapper "github.com/go-gost/x/limiter/traffic/wrapper"
metrics "github.com/go-gost/x/metrics/wrapper" metrics "github.com/go-gost/x/metrics/wrapper"
@@ -47,6 +49,7 @@ func (l *unixListener) Init(md md.Metadata) (err error) {
return return
} }
ln = proxyproto.WrapListener(l.options.ProxyProtocol, ln, 10*time.Second)
ln = metrics.WrapListener(l.options.Service, ln) ln = metrics.WrapListener(l.options.Service, ln)
ln = stats.WrapListener(ln, l.options.Stats) ln = stats.WrapListener(ln, l.options.Stats)
ln = admission.WrapListener(l.options.Admission, ln) ln = admission.WrapListener(l.options.Admission, ln)
+2 -2
View File
@@ -2,7 +2,6 @@ package ws
import ( import (
"context" "context"
"crypto/tls"
"net" "net"
"net/http" "net/http"
"net/http/httputil" "net/http/httputil"
@@ -16,6 +15,7 @@ import (
xnet "github.com/go-gost/x/internal/net" xnet "github.com/go-gost/x/internal/net"
xhttp "github.com/go-gost/x/internal/net/http" xhttp "github.com/go-gost/x/internal/net/http"
"github.com/go-gost/x/internal/net/proxyproto" "github.com/go-gost/x/internal/net/proxyproto"
xtls "github.com/go-gost/x/internal/util/tls"
ws_util "github.com/go-gost/x/internal/util/ws" ws_util "github.com/go-gost/x/internal/util/ws"
climiter "github.com/go-gost/x/limiter/conn/wrapper" climiter "github.com/go-gost/x/limiter/conn/wrapper"
limiter_wrapper "github.com/go-gost/x/limiter/traffic/wrapper" limiter_wrapper "github.com/go-gost/x/limiter/traffic/wrapper"
@@ -111,7 +111,7 @@ func (l *wsListener) Init(md md.Metadata) (err error) {
ln = climiter.WrapListener(l.options.ConnLimiter, ln) ln = climiter.WrapListener(l.options.ConnLimiter, ln)
if l.tlsEnabled { if l.tlsEnabled {
ln = tls.NewListener(ln, l.options.TLSConfig) ln = xtls.NewListener(ln, l.options.TLSConfig)
} }
l.addr = ln.Addr() l.addr = ln.Addr()