Nginx 四层反代 QUIC 如何传递客户端 IP

140 天前
 dabao

使用 nginx 的四层代理监听 443 端口,反代后端 6443 端口站点。 通过http2可以正常获取到客户端 IP ,通过 h3quic连接则无法获取到真实的客户端 IP ,只能获取到 127.0.0.1 。

请问各位大佬,在保持使用四层反代的前提下,如何配置可以通过quic获取到客户端 IP 。

使用 quic 连接获取到的 IP

REMOTE_ADDR: 127.0.0.1
HTTP_CLIENT_IP: 未设置
HTTP_X_FORWARDED_FOR: 未设置
HTTP_X_REAL_IP: 未设置
HTTP_FORWARDED: 未设置
HTTP_FORWARDED_FOR: 未设置
HTTP_X_FORWARDED: 未设置

四层 stream 配置

map $ssl_preread_server_name $name {
    default default_backend;
}

upstream default_backend {
    server 127.0.0.1:6443; # 站点
}

server {
    listen 443 reuseport;
    listen 443 udp reuseport;
    proxy_pass $name;
    ssl_preread on;
    proxy_protocol on;
}

站点配置

server
{
    listen 80;
    listen 6443 ssl  proxy_protocol ;
    listen 6443 quic reuseport;
		
    http2 on;
    server_name abc.com www.abc.com;
    
    index index.php index.html;
    root /wwwroot/abc.com;
    
    set_real_ip_from 127.0.0.1;
    real_ip_header proxy_protocol;
    
    ...
}
2765 次点击
所在节点    NGINX
14 条回复
dabao
140 天前
```
nginx version: nginx/1.27.1
built by gcc 12.2.0 (Debian 12.2.0-14)
built with OpenSSL 1.1.1q 5 Jul 2022
TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/www/server/nginx --add-module=/www/server/nginx/src/ngx_devel_kit --add-module=/www/server/nginx/src/lua_nginx_module --add-module=/www/server/nginx/src/ngx_cache_purge --with-openssl=/www/server/nginx/src/openssl --with-pcre=pcre-8.43 --with-http_v2_module --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module --with-http_stub_status_module --with-http_ssl_module --with-http_image_filter_module --with-http_gzip_static_module --with-http_gunzip_module --with-ipv6 --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module --with-http_auth_request_module --add-module=/www/server/nginx/src/ngx_http_substitutions_filter_module-master --with-ld-opt=-Wl,-E --with-cc-opt=-Wno-error --with-ld-opt=-ljemalloc --with-http_dav_module --add-module=/www/server/nginx/src/nginx-dav-ext-module --with-http_v3_module
```
Showfom
140 天前
lambdaq
140 天前
我估计,四层反代 原理上无法把这个值带过来。。。
dabao
140 天前
@Showfom 这个模块也无法通过 quic 连接传递客户端 ip
dabao
140 天前
@lambdaq 通过目前查到的资料来看,还不支持通过 quic 传递客户端 ip
lambdaq
140 天前
@dabao 我猜就是因为 quic 是加密包,在不破坏原有二进制流的情况下,没法夹带额外的元数据
Opportunity
140 天前
kk2syc
140 天前
stream 模块已经移除了对 QUIC 的支持,获取真实客户端 ip 直接直接在 HTTP 模块下多 Server 监听同端口即可

https://hg.nginx.org/nginx/rev/113e2438dbd4
https://mailman.nginx.org/pipermail/nginx/2023-April/CZ5L6KMLLZNDP2R6TGAX5MN4VLQA3U3R.html
leonshaw
140 天前
proxy_bind transparent 行不行
ysc3839
140 天前
四层反代不行,因为完全没有动内部传的数据,自然也不能加上表示 IP 的请求头。
seansong
140 天前
你已经开启了 proxy_protocol ,后端解析一下呗
seansong
140 天前
看错了,你是 quic ,proxy_protocol 不会生效
huihuimoe
140 天前
udp 只能用 proxy protocol v2 ,nginx 官方只支持 v1(只作用于 tcp)。
得加个 nginx-stream-proxy-protocol-v2 ,然后两边开 proxy protocol v2
dabao
137 天前
@kk2syc 最终还是用了这个办法

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1118432

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX