diff --git a/transport/internet/httpupgrade/connection.go b/transport/internet/httpupgrade/connection.go new file mode 100644 index 00000000..c7a33af9 --- /dev/null +++ b/transport/internet/httpupgrade/connection.go @@ -0,0 +1,19 @@ +package httpupgrade + +import "net" + +type connnection struct { + net.Conn + remoteAddr net.Addr +} + +func newConnection(conn net.Conn, remoteAddr net.Addr) *connnection { + return &connnection{ + Conn: conn, + remoteAddr: remoteAddr, + } +} + +func (c *connnection) RemoteAddr() net.Addr { + return c.remoteAddr +} diff --git a/transport/internet/httpupgrade/hub.go b/transport/internet/httpupgrade/hub.go index f87d020f..f78f8442 100644 --- a/transport/internet/httpupgrade/hub.go +++ b/transport/internet/httpupgrade/hub.go @@ -9,6 +9,7 @@ import ( "github.com/xtls/xray-core/common" "github.com/xtls/xray-core/common/net" + http_proto "github.com/xtls/xray-core/common/protocol/http" "github.com/xtls/xray-core/common/session" "github.com/xtls/xray-core/transport/internet" "github.com/xtls/xray-core/transport/internet/stat" @@ -68,6 +69,20 @@ func (s *server) Handle(conn net.Conn) (stat.Connection, error) { _ = conn.Close() return nil, err } + + forwardedAddrs := http_proto.ParseXForwardedFor(req.Header) + remoteAddr := conn.RemoteAddr() + if len(forwardedAddrs) > 0 && forwardedAddrs[0].Family().IsIP() { + remoteAddr = &net.TCPAddr{ + IP: forwardedAddrs[0].IP(), + Port: int(0), + } + } + if remoteAddr == nil { + return nil, newError("remoteAddr is nil") + } + + conn = newConnection(conn, remoteAddr) return stat.Connection(conn), nil }