nginx拒绝ip
Nginx如何拉黑恶意IP?3步实操+避坑指南,新手也能看懂
你的网站突然弹出403错误?后台日志里频繁出现陌生IP的攻击请求?别慌!Nginx作为“服务器门卫”,只需简单配置就能把恶意IP直接“拉黑”。今天用3步教会你从原理到实操,还附赠新手必看的避坑指南。
为什么要拒绝恶意IP?
恶意IP就像“不请自来的访客”:可能是恶意爬虫疯狂抓取数据拖垮服务器,也可能是黑客扫描漏洞尝试入侵。Nginx通过deny指令配置“黑名单”,能快速拦截这些IP,让网站访问更安全稳定。
3步实操:从定位到生效,零门槛上手
第一步:找到“黑名单”IP
先确定需要拒绝的IP来源。通过Nginx的访问日志(通常在/var/log/nginx/access.log)筛选异常请求:
- 查看高频访问IP:
grep -i "403\|500" /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -n 10 - 重点关注来源不明、访问频率异常的IP,比如
192.168.1.100
第二步:配置Nginx拒绝规则
在Nginx的站点配置文件(如/etc/nginx/sites-available/yourdomain.conf)中添加deny指令,分3种场景:
- 全局拒绝(所有网站生效):
在http块或server块末尾添加:
deny 192.168.1.100;(单个IP)
或批量拒绝IP段:deny 10.0.0.0/8;(网段) - 单站点拒绝:
仅针对某个网站生效,在对应server块中添加:server { listen 80; server_name yourdomain.com; deny 192.168.1.100; # 仅拒绝该IP访问yourdomain.com location / { root /var/www/html; } } - 动态拒绝(结合防火墙):
若需临时封禁,可直接在iptables中添加规则:
iptables -A INPUT -s 192.168.1.100 -j DROP(但需重启生效)
检查配置:输入nginx -t验证语法,无报错则重启Nginx:systemctl restart nginx
第三步:验证拒绝是否生效
- 命令测试:用
curl模拟请求:
curl -I http://yourdomain.com
若返回HTTP/1.1 403 Forbidden,说明拒绝成功。 - 日志验证:在
access.log中搜索被拒绝的IP,若无该IP的访问记录,说明拦截生效。
避坑指南:新手最容易踩的3个坑
1. 配置不生效?先查Nginx语法
修改配置后,务必执行nginx -t检查语法。若提示nginx: [emerg] unknown directive "deny",说明配置位置错误(比如deny不能放在http块外)。
2. 拒绝IP后访问仍正常?检查位置
deny指令必须放在server或location块内,放在http块中会导致所有请求被拦截(除非仅允许特定IP)。
3. 高频IP自动更新?写个脚本更省心

如果恶意IP持续出现,可写个简单脚本自动从日志提取高频IP:
#!/bin/bash
# 提取访问量前10的IP加入Nginx黑名单
top_ips=$(awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 10 | awk '{print $2}')
for ip in $top_ips; do
echo "deny $ip;" >> /etc/nginx/blocked.conf
done
nginx -s reload
进阶:让防护更智能
- 动态黑名单:结合
fail2ban工具,自动封禁多次失败的IP。 - 地域拦截:用
ngx_http_geoip_module根据IP地理信息拒绝境外IP(需提前安装GeoIP数据库)。
Nginx的IP拒绝功能看似简单,却能解决90%的基础安全问题。记住:配置后务必重启Nginx,并定期更新黑名单,你的网站就能像装了“智能门卫”一样,稳稳挡住恶意访客。
提示:若需拦截所有非白名单IP,可在location块中先写allow 白名单IP; deny all;,实现更严格的访问控制。

上一篇





