nginx可通过map指令对内网ip段(如192.168.10.0/24、10.200.0.0/16、172.16.0.0/12)实现访问日志脱敏,将匹配ip替换为[internal]占位符,保留时间、路径、状态码等关键信息,避免完全丢弃影响排障。

可以通过 Nginx 的 map 指令结合 log_format 和 access_log 的条件判断,实现对指定 IP 段(如内网管理段)的访问日志过滤或脱敏,而非简单丢弃日志——因为完全屏蔽可能影响故障排查。核心思路是:让匹配内网 IP 的请求不记录真实客户端 IP,改写为占位符(如 127.0.0.1 或 [internal]),既保留请求时间、路径、状态码等关键信息,又隐去管理员真实出口 IP。
定义需过滤的内网 IP 段映射
在 http 块中使用 map 构建一个变量,识别是否属于内网管理段(例如 192.168.10.0/24、10.200.0.0/16、172.16.0.0/12):
map $remote_addr $filtered_ip {
default $remote_addr;
~^192\.168\.10\. "[internal]";
~^10\.200\. "[internal]";
~^172\.(1[6-9]|2[0-9]|3[0-1])\. "[internal]";
}
说明:
• 正则匹配比 CIDR 更灵活,适合 Nginx 原生支持;
• 使用 ~^ 表示忽略大小写的行首匹配,避免误判(如 192.168.100.x 不会被 192.168.10. 错误匹配);
• 若需精确 CIDR,可用第三方模块 ngx_http_geoip2_module 配合 GeoIP2 数据库,但基础场景正则已足够。
自定义日志格式,引用过滤后变量
修改或新增 log_format,用 $filtered_ip 替代原始 $remote_addr:
log_format main_filtered '$filtered_ip - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
这样所有匹配内网段的请求,在日志中都显示为 [internal],而其他公网 IP 保持原样。
在 server 或 location 中启用该日志格式
在对应虚拟主机或管理接口路径下启用新格式(不建议全局替换,以免影响其他业务日志分析):
server {
listen 80;
server_name admin.example.com;
<pre class="brush:php;toolbar:false;"># 仅对该管理域启用过滤日志
access_log /var/log/nginx/admin_access.log main_filtered;
location /api/ {
# 可进一步限制只记录非敏感操作,或加额外 header 标识
add_header X-Log-Filtered "true";
proxy_pass http://backend;
}}
注意:
• 日志路径建议单独分离,便于审计与权限管控(如仅运维组可读);
• 若需彻底不记录内网请求,可用 access_log off; 配合 if ($filtered_ip = "[internal]") { ... },但 Nginx 不推荐在 if 中使用 access_log,更稳妥方式是用 map 将日志路径设为空字符串,再配合 access_log 的条件参数(需 1.7.0+):
map $filtered_ip $log_path {
"[internal]" "";
default "/var/log/nginx/admin_access.log";
}
access_log $log_path main_filtered;
补充隐私防护建议
单靠 IP 过滤不够,还需组合以下措施增强管理员“指纹”防护:
- 禁用或混淆
User-Agent记录:在log_format中用"-"或固定字符串替代$http_user_agent; - 不记录敏感请求头(如
Authorization、X-Forwarded-For等),确保log_format中不包含$http_authorization; - 对管理接口强制启用 Basic Auth 或 JWT,并在日志中隐藏认证凭据字段;
- 定期轮转并加密归档日志,设置严格文件权限(如
640,属主 root:adm); - 若使用反向代理(如前置 SLB/WAF),确保
$remote_addr已被正确替换为真实客户端 IP(通过set_real_ip_from+real_ip_header),否则过滤逻辑会失效。











