要确保Nginx日志记录真实客户端IP,必须启用realip模块并配置set_real_ip_from指定可信代理、real_ip_header指定来源头(如X-Forwarded-For)、real_ip_recursive on开启递归解析,使$remote_addr被正确替换为真实IP,再配合log_format使用$remote_addr输出。

在 Nginx 中记录客户端真实 IP,关键不是单纯“定义日志格式”,而是要确保 $remote_addr 取到的是真实用户 IP,而非代理(如 CDN、负载均衡器、反向代理)的 IP。默认情况下,Nginx 的 $remote_addr 是与它直接建立 TCP 连接的上一跳地址,所以必须结合 real_ip_module 模块解析 X-Forwarded-For 或 X-Real-IP 等请求头,并信任指定的代理 IP 段。
启用 real_ip_module 并配置可信代理
Nginx 默认编译包含 real_ip_module(可通过 nginx -V 2>&1 | grep -o with-http-realip-module 确认)。你需要在 http 或 server 块中设置:
-
指定可信代理 IP 或网段:用
set_real_ip_from声明哪些地址是可信的上游代理(例如阿里云 SLB、腾讯云 CLB、公司内部 LB、CDN 回源 IP 段) -
指定真实 IP 来源头字段:用
real_ip_header指定从哪个 HTTP 头读取原始客户端 IP(常见为X-Forwarded-For或X-Real-IP) -
(可选)指定备用头字段:若主头不存在,可用
real_ip_recursive on+real_ip_header X-Forwarded-For自动取最左非信任 IP
示例(放在 http 块中):
set_real_ip_from 10.0.0.0/8; # 内网 LB 地址段<br>set_real_ip_from 172.16.0.0/12;<br>set_real_ip_from 192.168.0.0/16;<br>set_real_ip_from 198.51.100.0/24; # 示例 CDN 回源段(请按实际替换)<br>real_ip_header X-Forwarded-For;<br>real_ip_recursive on;
定义含真实 IP 的日志格式
在 http 块中使用 log_format 定义新格式,用 $remote_addr(此时已被 real_ip_module 替换为真实 IP)或更明确的 $http_x_forwarded_for(不推荐直接用,因可能被伪造)。
推荐写法(安全且准确):
log_format main '$remote_addr - $remote_user [$time_local] "$request" '<br> '$status $body_bytes_sent "$http_referer" '<br> '"$http_user_agent" "$http_x_forwarded_for"';
说明:
– $remote_addr 此时已是真实客户端 IP(经 real_ip_module 处理后)
– 同时保留 $http_x_forwarded_for 用于审计或调试(注意该字段可能含多个 IP,如 203.0.113.1, 198.51.100.2)
在 server 或 location 中启用日志并验证
确保 access_log 使用你定义的格式,例如:
server {<br> listen 80;<br> server_name example.com;<br> access_log /var/log/nginx/access.log main;<br> ...<br>}验证是否生效:
– 用 curl 模拟带 X-Forwarded-For 的请求:curl -H "X-Forwarded-For: 203.0.113.10" http://your-server/
– 查看日志中第一列是否为 203.0.113.10(而非代理内网 IP)
– 若仍显示代理 IP,请检查 set_real_ip_from 是否覆盖了当前请求来源的 IP,以及请求头名称是否与 real_ip_header 一致
注意事项与常见问题
-
不要盲目信任所有 X-Forwarded-For:必须严格限制
set_real_ip_from,否则攻击者可伪造该头欺骗 Nginx -
CDN 场景需查文档获取回源 IP 段:如 Cloudflare 提供完整 IPv4/IPv6 段列表,必须全部加入
set_real_ip_from -
real_ip_recursive on 的作用:开启后,当
X-Forwarded-For为A, B, C且C是可信代理时,会自动取B;若B也可信,则继续取A -
避免在 location 中重复 set_real_ip_from:应在
http或server级统一配置,否则可能失效


















