使用 nginx 的四层代理监听 443 端口,反代后端 6443 端口站点。
通过http2
可以正常获取到客户端 IP ,通过 h3quic
连接则无法获取到真实的客户端 IP ,只能获取到 127.0.0.1 。
请问各位大佬,在保持使用四层反代的前提下,如何配置可以通过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: 未设置
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;
...
}
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
![]() |
1
dabao OP ```
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 ``` |
![]() |
2
Showfom 30 天前
|
![]() |
3
lambdaq 30 天前
我估计,四层反代 原理上无法把这个值带过来。。。
|
![]() |
7
Opportunity 29 天前
|
![]() |
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 |
9
leonshaw 29 天前 via Android
proxy_bind transparent 行不行
|
![]() |
10
ysc3839 29 天前
四层反代不行,因为完全没有动内部传的数据,自然也不能加上表示 IP 的请求头。
|
11
seansong 29 天前
你已经开启了 proxy_protocol ,后端解析一下呗
|
12
seansong 29 天前
看错了,你是 quic ,proxy_protocol 不会生效
|
13
huihuimoe 29 天前 via iPhone ![]() udp 只能用 proxy protocol v2 ,nginx 官方只支持 v1(只作用于 tcp)。
得加个 nginx-stream-proxy-protocol-v2 ,然后两边开 proxy protocol v2 |