[点晴永久免费OA]你以为自己封的是攻击者,其实封掉的可能是 CDN:Nginx 真实 IP 配错有多坑
|
admin
2026年4月29日 17:3
本文热度 77
|
很多人第一次在 Nginx 里封 IP,动作都很果断。 日志里看到一个 IP 疯狂刷接口。
反手就是一条:
deny x.x.x.x;
然后 nginx -s reload。
心里很踏实:
这下总算把攻击者挡住了。
但真相经常没这么简单。
很多时候,你以为自己封掉的是攻击者。
实际上,你封掉的可能是:
更糟一点。
你甚至不是封了一个人,
而是顺手封掉了一大片正常用户。
这听起来离谱。
但在线上,真的很常见。
问题不在 deny
问题通常不在 deny 这条指令本身。
问题在于:
你看到的那个 IP,未必是真实用户 IP。
很多人默认相信一件事:
Nginx 日志里的 IP,就是来访问你的那个人。
但只要你的服务前面挂了这些东西:
这个认知就不一定成立了。
因为请求到 Nginx 这里时,
很可能已经不是用户直接连进来了。
Nginx 如果没有正确处理真实来源,
它看到的往往只是“上一跳”的地址。
最容易出现的事故
于是就会出现一个很讽刺的场景。
你发现某个 IP 在疯狂请求。
你判断它是攻击者。
你把它封了。
第二天,客服来找你:
为什么一批正常用户也访问不了了?
原因很简单。
因为你封掉的,根本不是攻击者本人。
而是前面的代理层。
这就是很多 Nginx 安全配置最坑的地方:
规则本身没错,错的是你认错了人。
看起来没问题,其实风险很大
比如你这样写:
server {
listen 80;
server_name example.com;
deny 10.0.0.5;
allow all;
location / {
proxy_pass http://backend;
}
}
语法当然没问题。
Nginx 也会老老实实执行。
问题只在于一件事:
这个 10.0.0.5 到底是谁?
如果它真是攻击者,当然没问题。
但如果它是:
那你这次操作就不是“防住攻击”了。
而是:
把一堆正常流量一起挡在门外。
真正危险的误区
很多人做线上封禁时,最大的误区不是不会写 deny。
而是:
看到 IP,就默认那是用户。
可在真实生产环境里,IP 这件事远没有看起来那么直接。
尤其下面这几种场景,最容易出问题:
- 限流和封禁都按
$remote_addr 做,结果限错、封错、误伤一片
所以很多人以为自己在做“安全防护”。
其实做的是:
对代理层开火。
真正该先确认的,不是“怎么封”
真正该先确认的,是这句话:
我现在看到的这个 IP,到底是不是真人?
如果这个前提没确认,
那后面的这些动作都可能建立在错误基础上:
这也是为什么我越来越觉得:
Nginx 里最危险的安全动作,不是没拦住攻击。
而是你以为拦住了攻击,实际上误伤了正常流量。
因为没拦住,还能继续排查。
但一旦误伤,影响的是一整批正常请求。
而且最难受的是:
问题恰恰在这里。
它不是没生效。
而是生效得太对了。
只不过,你拦错了对象。
两个建议
如果以后你准备在 Nginx 上做封 IP,我建议先记住两件事。
1. 不要一看到日志里的 IP,就默认那是真实用户
尤其当前面挂了 CDN、WAF、负载均衡的时候。
先确认来源。
再决定封不封。
2. 真正危险的不是 deny 写错
而是:
你在错误的身份信息上,执行了正确的封禁动作。
这才是最容易出事故的地方。
最后一句
如果这篇文章你只记一句话,我希望是这一句:
Nginx 安全配置里,最怕的不是规则失效,而是你认错了人。
你以为自己封的是攻击者。
实际上,封掉的可能只是代理层。
而真正的攻击请求,
还在后面继续进来。
这才是最反直觉、也最容易在线上翻车的坑。
该文章在 2026/4/29 17:03:36 编辑过