Nginx限制IP访问,拉黑恶意爬虫IP配置
时间:2026-10-7 07:30 作者:emer 分类: 无
前言
网站被恶意爬虫狂刷,服务器CPU跑满?或者有人恶意攻击你的网站?可以用 Nginx 直接把这些 IP 拉黑,不让他们访问。本文讲一下怎么配置 IP 访问控制。
怎么找到恶意 IP
先看 Nginx 访问日志,找出访问最频繁的 IP:
# 统计访问次数最多的前 20 个 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -20
如果某个 IP 访问量特别大,可能就是恶意爬虫或者攻击。
拉黑单个 IP
在 Nginx 配置里加:
server {
listen 80;
server_name www.example.com;
root /var/www/html;
# 拉黑某个 IP
location / {
deny 192.168.1.100;
allow all;
}
}
被拉黑的 IP 访问会返回 403 Forbidden。
拉黑 IP 段
拉黑整个 C 段
deny 192.168.1.0/24;
就是拉黑 192.168.1.1 到 192.168.1.255。
拉黑多个 IP
deny 192.168.1.100;
deny 192.168.1.101;
deny 192.168.1.102;
白名单模式(只允许某些 IP 访问)
如果想只允许特定 IP 访问(比如后台管理页面):
# 只允许内网 IP 访问 /admin
location /admin {
allow 127.0.0.1;
allow 192.168.1.0/24;
deny all;
}
其他 IP 访问 /admin 都会返回 403。
用 include 单独管理黑名单
IP 多了不想写在主配置里,可以单独放一个文件:
第一步:创建黑名单文件
vi /etc/nginx/conf.d/blacklist.conf
内容:
deny 192.168.1.100;
deny 192.168.1.101;
deny 10.0.0.0/8;
第二步:在主配置里引入
server {
listen 80;
server_name www.example.com;
root /var/www/html;
# 引入黑名单
include /etc/nginx/conf.d/blacklist.conf;
location / {
try_files $uri $uri/ =404;
}
}
这样以后加黑名单只要改 blacklist.conf 文件,然后重载 Nginx 就行。
对某个目录单独限制
比如只对 /admin 目录限制:
location /admin {
allow 127.0.0.1;
allow 192.168.1.0/24;
deny all;
root /var/www/html;
index index.php;
}
检查配置并重载
nginx -t
nginx -s reload
用防火墙拉黑(更彻底)
如果想在系统层面拉黑,用 firewall-cmd:
# 拉黑单个 IP
firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='192.168.1.100' reject"
# 重新加载
firewall-cmd --reload
或者用 iptables:
iptables -I INPUT -s 192.168.1.100 -j DROP
常见坑
坑1:改了黑名单忘了 reload
加了黑名单,但 IP 还能访问。
原因: Nginx 没重载。
解决:
nginx -s reload
坑2:把自己 IP 拉黑了
测试的时候不小心把自己 IP 也拉黑了,自己也访问不了了。
解决: 先从服务器上用 curl 测试:
curl -I http://127.0.0.1
确认没问题再 reload。
坑3:CDN 后面拿不到真实 IP
用了 CDN 之后,日志里全是 CDN 的 IP,看不到用户真实 IP。
解决: 先配置 Nginx 获取真实 IP:
set_real_ip_from CDN的IP段;
real_ip_header X-Forwarded-For;
这样日志里才能看到用户真实 IP,才能正确拉黑。
总结
| 操作 | 命令/配置 |
|---|---|
| 拉黑单个 IP | deny 192.168.1.100; |
| 拉黑 IP 段 | deny 192.168.1.0/24; |
| 白名单模式 | allow 127.0.0.1; deny all; |
| 单独黑名单文件 | include /etc/nginx/conf.d/blacklist.conf; |
| 重载生效 | nginx -s reload |
提醒: 拉黑 IP 之前先确认是不是真的恶意,别误杀正常用户。
遇到问题加QQ23979811 协助处理