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
+2 -2
View File
@@ -2,7 +2,6 @@ package mtls
import (
"context"
"crypto/tls"
"net"
"time"
@@ -14,6 +13,7 @@ import (
xnet "github.com/go-gost/x/internal/net"
"github.com/go-gost/x/internal/net/proxyproto"
"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"
limiter_wrapper "github.com/go-gost/x/limiter/traffic/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 = limiter_wrapper.WrapListener(l.options.Service, ln, l.options.TrafficLimiter)
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.errChan = make(chan error, 1)
+10 -19
View File
@@ -2,7 +2,6 @@ package mws
import (
"context"
"crypto/tls"
"net"
"net/http"
"net/http/httputil"
@@ -17,6 +16,7 @@ import (
xhttp "github.com/go-gost/x/internal/net/http"
"github.com/go-gost/x/internal/net/proxyproto"
"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"
climiter "github.com/go-gost/x/limiter/conn/wrapper"
limiter_wrapper "github.com/go-gost/x/limiter/traffic/wrapper"
@@ -38,7 +38,7 @@ type mwsListener struct {
cqueue chan net.Conn
errChan chan error
tlsEnabled bool
logger logger.Logger
log logger.Logger
md metadata
options listener.Options
}
@@ -49,7 +49,7 @@ func NewListener(opts ...listener.Option) listener.Listener {
opt(&options)
}
return &mwsListener{
logger: options.Logger,
log: options.Logger,
options: options,
}
}
@@ -61,7 +61,7 @@ func NewTLSListener(opts ...listener.Option) listener.Listener {
}
return &mwsListener{
tlsEnabled: true,
logger: options.Logger,
log: options.Logger,
options: options,
}
}
@@ -102,7 +102,7 @@ func (l *mwsListener) Init(md md.Metadata) (err error) {
lc := net.ListenConfig{}
if l.md.mptcp {
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)
if err != nil {
@@ -116,7 +116,7 @@ func (l *mwsListener) Init(md md.Metadata) (err error) {
ln = climiter.WrapListener(l.options.ConnLimiter, ln)
if l.tlsEnabled {
ln = tls.NewListener(ln, l.options.TLSConfig)
ln = xtls.NewListener(ln, l.options.TLSConfig)
}
l.addr = ln.Addr()
@@ -168,7 +168,7 @@ func (l *mwsListener) upgrade(w http.ResponseWriter, r *http.Request) {
if clientIP != nil {
cip = clientIP.String()
}
log := l.logger.WithFields(map[string]any{
log := l.log.WithFields(map[string]any{
"local": l.addr.String(),
"remote": r.RemoteAddr,
"client": cip,
@@ -189,10 +189,10 @@ func (l *mwsListener) upgrade(w http.ResponseWriter, r *http.Request) {
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()
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 {
case l.cqueue <- &connWithSrcAddr{Conn: stream, srcAddr: srcAddr}:
case l.cqueue <- stream:
default:
stream.Close()
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 {
return nil, listener.NewBindError(err)
}
ln = metrics.WrapListener(l.options.Service, ln)
ln = stats.WrapListener(ln, l.options.Stats)
ln = admission.WrapListener(l.options.Admission, ln)
+2 -3
View File
@@ -2,7 +2,6 @@ package tls
import (
"context"
"crypto/tls"
"net"
"time"
@@ -13,6 +12,7 @@ import (
admission "github.com/go-gost/x/admission/wrapper"
xnet "github.com/go-gost/x/internal/net"
"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"
limiter_wrapper "github.com/go-gost/x/limiter/traffic/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 = limiter_wrapper.WrapListener(l.options.Service, ln, l.options.TrafficLimiter)
ln = climiter.WrapListener(l.options.ConnLimiter, ln)
l.ln = tls.NewListener(ln, l.options.TLSConfig)
l.ln = xtls.NewListener(ln, l.options.TLSConfig)
return
}
+3
View File
@@ -2,12 +2,14 @@ package unix
import (
"net"
"time"
"github.com/go-gost/core/limiter"
"github.com/go-gost/core/listener"
"github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata"
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"
limiter_wrapper "github.com/go-gost/x/limiter/traffic/wrapper"
metrics "github.com/go-gost/x/metrics/wrapper"
@@ -47,6 +49,7 @@ func (l *unixListener) Init(md md.Metadata) (err error) {
return
}
ln = proxyproto.WrapListener(l.options.ProxyProtocol, ln, 10*time.Second)
ln = metrics.WrapListener(l.options.Service, ln)
ln = stats.WrapListener(ln, l.options.Stats)
ln = admission.WrapListener(l.options.Admission, ln)
+2 -2
View File
@@ -2,7 +2,6 @@ package ws
import (
"context"
"crypto/tls"
"net"
"net/http"
"net/http/httputil"
@@ -16,6 +15,7 @@ import (
xnet "github.com/go-gost/x/internal/net"
xhttp "github.com/go-gost/x/internal/net/http"
"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"
climiter "github.com/go-gost/x/limiter/conn/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)
if l.tlsEnabled {
ln = tls.NewListener(ln, l.options.TLSConfig)
ln = xtls.NewListener(ln, l.options.TLSConfig)
}
l.addr = ln.Addr()