add proxyProtocol support for dialer
This commit is contained in:
@@ -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
@@ -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
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,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()
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
+13
-2
@@ -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"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -17,16 +19,18 @@ 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
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+15
-2
@@ -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"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -17,6 +19,7 @@ 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 {
|
||||||
@@ -27,6 +30,7 @@ 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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
@@ -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,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
@@ -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
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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,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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,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()
|
||||||
|
|||||||
Reference in New Issue
Block a user