Skip to content

XHTTP & WS & HU & gRPC servers: Require sockopt.trustedXForwardedFor#6309

Merged
RPRX merged 5 commits into
mainfrom
xff
Jun 18, 2026
Merged

XHTTP & WS & HU & gRPC servers: Require sockopt.trustedXForwardedFor#6309
RPRX merged 5 commits into
mainfrom
xff

Conversation

@Meo597

@Meo597 Meo597 commented Jun 10, 2026

Copy link
Copy Markdown
Collaborator

@Meo597

Meo597 commented Jun 10, 2026

Copy link
Copy Markdown
Collaborator Author

考虑到不套 cdn nginx 的情况,我改成了现在这样

@Meo597

Meo597 commented Jun 10, 2026

Copy link
Copy Markdown
Collaborator Author

gRPC 那边用的是 X-Real-IP
要不要考虑让它优先级高于 X-Forwarded-For

这四个传输层都同时兼容这两种?

@RPRX

RPRX commented Jun 16, 2026

Copy link
Copy Markdown
Member

这四个传输层都同时兼容这两种?

不行,会有优先级问题、伪造问题,话说 gRPC 的话 CF 加的是 X-Real-IP

@Meo597

Meo597 commented Jun 16, 2026

Copy link
Copy Markdown
Collaborator Author

有人用 X-Real-IP 有人用 X-Forwarded-For
不是 gRPC 专供

大家约定俗成的语义是 X-Real-IP 是 CDN 边缘节点读 conn 的 remoteAddr
中间节点不会改它,只有一个地址

X-Forwarded-For 只要经过一层 WebServer 就加一个 IP,是个数组

@RPRX

RPRX commented Jun 16, 2026

Copy link
Copy Markdown
Member

总之现在这代码可能的问题很多,我都列不完,只支持一个是最简单的

所以 gRPC 过 CF 加的到底是哪个?XHTTP stream-up/one 呢?

@Meo597

Meo597 commented Jun 16, 2026

Copy link
Copy Markdown
Collaborator Author

不知道啊,那就 X-Real-IP 给 gRPC,其他还是 XFF?

@RPRX

RPRX commented Jun 16, 2026

Copy link
Copy Markdown
Member

你测一下啊

@Meo597

Meo597 commented Jun 16, 2026

Copy link
Copy Markdown
Collaborator Author

首先我得有一个 CF 账号。。。
不用 XHTTP 大逆不道

@Meo597

Meo597 commented Jun 16, 2026

Copy link
Copy Markdown
Collaborator Author

当前代码是:

连接时如果用户没配 trusted,用 conn 的 IP
. 如果请求没有携带 XRI/XFF 头,单纯警告用户去配一下;否则携带了头则警告有人伪造 IP

如果配了 trusted,不符合警告有人伪造;符合优先用 XRI,否则 XFF[0]

我看 nginx 默认值是 X-Real-IP
https://nginx.org/en/docs/http/ngx_http_realip_module.html

@RPRX

RPRX commented Jun 16, 2026

Copy link
Copy Markdown
Member

盲猜 CF 给 gRPC 加的是 X-Forwarded-For,毕竟 XHTTP 的 stream-up/one 被 CF 识别成 gRPC,也没人报告过有源 IP 问题

所以就只留它吧,搞两个问题太多

@RPRX

RPRX commented Jun 16, 2026

Copy link
Copy Markdown
Member

另外我搜到了几年前的讨论 v2fly/v2ray-core#1026 ,你测下每一级到底是往开头加还是 append,必须只信任最后一级加的

@Meo597

Meo597 commented Jun 17, 2026

Copy link
Copy Markdown
Collaborator Author

晚点我弄一下

@Meo597

Meo597 commented Jun 18, 2026

Copy link
Copy Markdown
Collaborator Author

另外我搜到了几年前的讨论 v2fly/v2ray-core#1026 ,你测下每一级到底是往开头加还是 append,必须只信任最后一级加的

约定俗成的都是用 [0],我也查了下 CF 文档确认过了

@RPRX

RPRX commented Jun 18, 2026

Copy link
Copy Markdown
Member

看了下,虽然对于 XHTTP/3 应当是 UDPAddr,但是毕竟反代后的接收栈目前都是 TCP 所以还行吧

至于 local 是 IPv4 但 remote 被改成了 IPv6 的情况,似乎只有往后传 PROXY protocol 的时候有点问题?依稀记得之前有人提过这协议设计考虑不周还是 go-proxyprotocol 那个库代码有限制来着?好像也解决了,反正以前也会有这情况,先不想了

最后总结下这个 PR,对于 XHTTP & WS & HU & gRPC 服务端:若未配置 sockopt.trustedXForwardedFor 但是有 X-Forwarded-For 传进来了会 LogWarning,若配置了且传入请求有 X-Forwarded-For 但它没有 trusted header 会 LogError

对于又有 CDN 又有 Nginx 又有直连,建议 Nginx 到 Xray-core 用 PROXY protocol 传递真实 IP,而不是把 CDN 的 XFF 顶掉

@RPRX RPRX changed the title HTTP transports: Require trustedXForwardedFor for X-Forwarded-For XHTTP & WS & HU & gRPC servers: Require sockopt.trustedXForwardedFor Jun 18, 2026
@RPRX RPRX merged commit 711aea4 into main Jun 18, 2026
48 checks passed
@Meo597 Meo597 deleted the xff branch June 18, 2026 22:43
Maolaohei added a commit to Maolaohei/Bray-Core that referenced this pull request Jun 19, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants