Nginx的stream层哪个变量存储了请求的目标IP地址?
Nginx stream层获取请求目标IP的方案
直接使用ngx_stream_core_module内置的$server_addr变量即可获取到L3层的目标IP,对应你示例请求中--resolve参数指定的192.0.2.17。
变量说明
$server_addr是stream核心模块的原生内置变量,无需额外加载第三方模块即可直接使用,返回值为当前连接所命中的Nginx监听套接字绑定的IP地址- 搭配内置变量
$server_port可以同时获取到目标端口信息 - 该变量在TCP连接建立完成后即可读取,生效时机早于读取SNI的
$ssl_preread_server_name变量,不依赖SSL握手流程
配置示例
stream { log_format stream_access '$remote_addr $remote_port -> $server_addr:$server_port SNI: $ssl_preread_server_name'; access_log /var/log/nginx/stream_443_access.log stream_access; server { listen 443; ssl_preread on; # 后续代理逻辑 } }
特殊场景说明
如果你的Nginx前端还有其他网络设备做了DNAT转发,需要获取DNAT转换前的原始目标IP,需要满足以下任意一个条件:
- 前端设备开启Proxy Protocol协议传递原始地址信息,Nginx侧监听配置加
proxy_protocol参数,通过$proxy_protocol_addr变量读取 - 服务器内核开启TPROXY透明代理功能,配合对应规则可通过自定义变量获取原始目标地址
内容的提问来源于stack exchange,提问作者Jarvis
相关产品推荐
相关产品推荐

