Xray-core icon indicating copy to clipboard operation
Xray-core copied to clipboard

acceptProxyProtocol + gRPC 源IP不更新

Open r06ertray opened this issue 11 months ago • 1 comments

使用 caddy 反代 xray, 启用 proxy_protocol 传递客户端IP地址。

观察 xray 的输出日志,可以发现源IP固定为第一次连接的客户端IP,不会随客户端网络切换发生变化。

客户端 gRPC 设置

    "streamSettings": {
        "network": "grpc",
        "grpcSettings": {
            "serviceName": "duckduckgo",
            "idle_timeout": 60,
            "initial_windows_size": 32768
        },
        "security": "tls",
        "tlsSettings": {
            "allowInsecure": false,
            "serverName": "*.*.*",
            "fingerprint": "edge"
        }
    }

服务端 gRPC 设置

    "streamSettings": {
        "network": "grpc",
        "grpcSettings": {
            "serviceName": "duckduckgo"
        },
        "sockopt": {
            "acceptProxyProtocol": true
        }
    }

Caddy 反代 gRPC

    @duckduckgo {
        protocol grpc
        path /duckduckgo/*
    }
    reverse_proxy @duckduckgo 127.0.0.1:8080 {
        transport http {
            proxy_protocol v2
            versions h2c
        }
    }

r06ertray avatar Mar 05 '24 07:03 r06ertray

观察 xray 的输出日志,可以发现源IP固定为第一次连接的客户端IP,不会随客户端网络切换发生变化。

按理来说客户端切换网络后 TCP 会断,会开一条新的 TCP,~~请再测几次确定该问题确实存在~~

RPRX avatar Mar 05 '24 08:03 RPRX

~~反直觉,先关了~~

RPRX avatar Mar 06 '24 06:03 RPRX

按理来说客户端切换网络后 TCP 会断,会开一条新的 TCP,~请再测几次确定该问题确实存在~

我配合 trojan / vless 测试均复现

r06ertray avatar Mar 06 '24 10:03 r06ertray

@r06ertray 不加caddy会不会出现问题 如果不加没问题 可能需要抓包检查一下发出proxy protocol有没有问题

Fangliding avatar Mar 06 '24 10:03 Fangliding

可以用X-Forwarded-For头传递源ip(proxy protocol只在建立tcp连接时传递,应该是h2多路复用导致的问题?)

izumi0004 avatar Mar 06 '24 18:03 izumi0004

@r06ertray 不加caddy会不会出现问题 如果不加没问题 可能需要抓包检查一下发出proxy protocol有没有问题

不会配置 nginx

xray直接监听端口 不用caddy或者Nginx

Fangliding avatar Mar 06 '24 18:03 Fangliding

如果问题存在的话,只有一种可能,就是 Caddy 复用了到 Xray 服务端的连接,~~但这样会导致所有用户都成了同一个 IP 吧~~

RPRX avatar Mar 07 '24 04:03 RPRX

xray直接监听端口 不用caddy或者Nginx

单独使用 xray 测试了以下两种方案,源IP均正常更新

1、不使用反代,直接配置 TLS

    "streamSettings": {
        "network": "grpc",
        "grpcSettings": {
            "serviceName": "duckduckgo"
        },
        "security": "tls",
        "tlsSettings": {
            "rejectUnknownSni": true,
            "alpn": [
                "h2"
            ],
            "certificates": [
                {
                    "certificateFile": "/path/to/cert.pem",
                    "keyFile": "/path/to/key.pem"
                }
            ]
        }
    }

2、借用其他的 inbound,fallback 到 gRPC

    "fallbacks": [
        {
            "dest": 8080,
            "xver": 2
        }
    ]
    "streamSettings": {
        "network": "grpc",
        "grpcSettings": {
            "serviceName": "duckduckgo"
        },
        "sockopt": {
            "acceptProxyProtocol": true
        }
    }

r06ertray avatar Mar 07 '24 04:03 r06ertray