Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
dabao
V2EX  ›  NGINX

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

  •  
  •   dabao · 30 天前 · 2082 次点击

    使用 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;
        
        ...
    }
    
    第 1 条附言  ·  30 天前
    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
    
    14 条回复    2025-03-17 10:15:18 +08:00
    dabao
        1
    dabao  
    OP
       30 天前
    ```
    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
        2
    Showfom  
       30 天前
    lambdaq
        3
    lambdaq  
       30 天前
    我估计,四层反代 原理上无法把这个值带过来。。。
    dabao
        4
    dabao  
    OP
       30 天前
    @Showfom 这个模块也无法通过 quic 连接传递客户端 ip
    dabao
        5
    dabao  
    OP
       30 天前
    @lambdaq 通过目前查到的资料来看,还不支持通过 quic 传递客户端 ip
    lambdaq
        6
    lambdaq  
       29 天前
    @dabao 我猜就是因为 quic 是加密包,在不破坏原有二进制流的情况下,没法夹带额外的元数据
    Opportunity
        7
    Opportunity  
       29 天前
    kk2syc
        8
    kk2syc  
       29 天前
    stream 模块已经移除了对 QUIC 的支持,获取真实客户端 ip 直接直接在 HTTP 模块下多 Server 监听同端口即可

    https://hg.nginx.org/nginx/rev/113e2438dbd4
    https://mailman.nginx.org/pipermail/nginx/2023-April/CZ5L6KMLLZNDP2R6TGAX5MN4VLQA3U3R.html
    leonshaw
        9
    leonshaw  
       29 天前 via Android
    proxy_bind transparent 行不行
    ysc3839
        10
    ysc3839  
       29 天前
    四层反代不行,因为完全没有动内部传的数据,自然也不能加上表示 IP 的请求头。
    seansong
        11
    seansong  
       29 天前
    你已经开启了 proxy_protocol ,后端解析一下呗
    seansong
        12
    seansong  
       29 天前
    看错了,你是 quic ,proxy_protocol 不会生效
    huihuimoe
        13
    huihuimoe  
       29 天前 via iPhone   ❤️ 3
    udp 只能用 proxy protocol v2 ,nginx 官方只支持 v1(只作用于 tcp)。
    得加个 nginx-stream-proxy-protocol-v2 ,然后两边开 proxy protocol v2
    dabao
        14
    dabao  
    OP
       27 天前
    @kk2syc 最终还是用了这个办法
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2678 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 07:52 · PVG 15:52 · LAX 00:52 · JFK 03:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.