需配置可信代理、解析x-forwarded-for头并使用$realip_remote_addr记录真实ip:先用set_real_ip_from和real_ip_header声明可信源与头字段,再定义含$realip_remote_addr的日志格式,同时确保上游正确追加x-forwarded-for。

要让 Nginx 的 access_log 正确记录代理转发场景下的真实客户端 IP,不能只依赖 $remote_addr(它默认是上一级代理的 IP),而需结合可信代理声明、HTTP 头解析和日志变量替换三步协同完成。
声明可信代理来源
Nginx 默认不信任 X-Forwarded-For 头里的 IP,必须明确告诉它哪些上游是可信的。在 http 或 server 块中添加:
-
set_real_ip_from 192.168.1.0/24;(填你前端负载均衡器、CDN 节点或内网网关的真实 IP 段) -
real_ip_header X-Forwarded-For;(指定从该请求头提取原始 IP) -
real_ip_recursive on;(启用多级代理嵌套解析,例如 CDN → LB → Nginx)
注意:若上游不是固定内网段(如公有云 CDN),请精确填写其官方公布的出口 IP 段,切勿写 0.0.0.0/0,否则存在 IP 欺骗风险。
修改日志格式,使用真实 IP 变量
启用 realip 模块后,$realip_remote_addr 会自动填充解析出的客户端真实 IP(若解析失败则回退为 $remote_addr)。在 http 块中定义新日志格式:
log_format realip_log '$realip_remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
然后在对应 server 或 location 中启用:
使用tbot机器ID身份文件配合tsh CLI,通过Teleport访问控制SSH登录托管主机或执行远程命令。
access_log /var/log/nginx/access.log realip_log;
避免直接改默认 main 格式,便于后续区分调试。
确保上游正确传递 X-Forwarded-For
如果日志仍显示代理 IP,大概率是前置环节没传头或传错。检查并确认上游配置了:
- Nginx 前置代理中含:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - 不要用
$remote_addr直接覆盖,否则丢失原始链路 - 若有多层代理,每层都应追加而非重写该头
临时加一条调试日志可快速定位问题:
log_format debug '$http_x_forwarded_for ←→ $realip_remote_addr ←→ $remote_addr';
(可选)同时记录后端处理节点
反向代理场景下,常需关联“谁访问了”和“被转到哪台后端”。可在同一日志中叠加 $upstream_addr:
log_format proxy_full '$realip_remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$upstream_addr" '
'"$http_user_agent" "$http_x_forwarded_for"';
注意:$upstream_addr 仅在含 proxy_pass 的 location 内有效,且需请求结束才写入。










