Nginx拒绝IP访问?5种实用方法,从简单到进阶,附配置示例
在Web服务运维中,拒绝特定IP访问是保障服务器安全的基础手段。Nginx作为主流Web服务器,提供了多种灵活的IP拒绝方式。本文将从基础到进阶,分享5种实战配置方法,帮你快速解决恶意IP骚扰问题。
一、为什么需要拒绝IP访问?
随着网站流量增长,恶意IP攻击(如爬虫抓取、DDoS、暴力破解)时有发生。Nginx的IP拒绝机制能直接拦截非法请求,避免服务器资源被滥用。常见场景包括:
- 单个恶意IP频繁发送请求(如“爬虫”);
- 某IP段的大量请求导致服务器负载过高;
- 外部IP对管理后台、API接口的非法访问。
二、5种Nginx拒绝IP的实用方法
方法1:基础单IP拒绝(最常用)
适用场景:仅需拒绝少量固定IP(如1-2个恶意IP)。
配置步骤:
在Nginx配置文件(如nginx.conf或站点配置文件example.com.conf)的server或location块中,直接使用deny指令。
server {
listen 80;
server_name example.com;
# 拒绝单个IP
deny 192.168.1.1; # 替换为目标IP
# 允许其他所有IP
allow all;
location / {
root /var/www/html;
}
}
生效验证:修改后执行nginx -t检查语法,再nginx -s reload生效。访问被拒绝的IP时,会返回403 Forbidden。
方法2:IP段批量拒绝(geo模块)
适用场景:需拒绝多个IP(如某网段、内网IP)。
配置步骤:
使用Nginx的geo模块定义IP段,通过变量匹配批量拦截。
http {
# 定义IP段黑名单
geo $block_ip {
default 0; # 默认不拦截
192.168.1.0/24 1; # 192.168.1.x网段(256个IP)
10.0.0.0/8 1; # 10.x.x.x网段(16777216个IP)
172.16.0.0/12 1; # 172.16.x.x~172.31.x.x网段
}
server {
listen 80;
server_name example.com;
# 拦截命中IP段的请求
if ($block_ip) {
return 403 "Access denied by IP segment";
}
location / {
root /var/www/html;
}
}
}
优势:无需逐个添加IP,通过网段覆盖即可批量拦截,适合内网管理或特定区域IP过滤。
方法3:限流+IP拒绝(进阶安全)
适用场景:防范高频请求攻击(如暴力破解、爬虫刷量)。
配置步骤:
结合Nginx的limit_req模块(限流)和deny指令,对超过阈值的IP直接拦截。
http {
# 定义限流规则:1秒内最多1次请求,突发允许5次
limit_req_zone $binary_remote_addr zone=ratelimit:10m rate=1r/s;
server {
listen 80;
server_name example.com;
location /login { # 假设登录接口易受攻击
limit_req zone=ratelimit burst=5 nodelay; # 限流+突发允许
root /var/www/html;
}
location / {
limit_req zone=ratelimit burst=5 nodelay;
root /var/www/html;
}
# 拦截超过限流阈值的IP
location / {
limit_req zone=ratelimit burst=5 nodelay;
if ($limit_req_status = 429) { # 429=请求频率超限
deny all; # 直接拒绝超限IP
}
root /var/www/html;
}
}
}
效果:高频IP会触发429错误,随后被永久拒绝(需注意:deny all是临时拦截,需重启Nginx才会恢复)。
方法4:外部IP列表管理(include配置)
适用场景:需频繁更新或管理大量拒绝IP(如安全团队定期提供黑名单)。
配置步骤:
将IP列表单独存入文件,通过include指令引入Nginx配置,避免主配置文件臃肿。
-
新建
blocked_ips.conf,写入需拦截的IP:# blocked_ips.conf deny 1.2.3.4; deny 5.6.7.8; deny 9.10.11.12; -
在主配置文件中引入:
http { include blocked_ips.conf; # 引入外部IP列表 # 其他配置... }
优势:IP列表独立管理,修改时仅需更新blocked_ips.conf,无需重启Nginx即可通过nginx -s reload生效。
方法5:服务器级防火墙拦截(双重保障)

适用场景:Nginx部署在物理服务器或云主机,需从底层拦截IP。
配置方式:
-
Linux服务器(iptables):
# 拒绝单个IP iptables -A INPUT -s 192.168.1.1 -j DROP # 拒绝网段 iptables -A INPUT -s 192.168.1.0/24 -j DROP -
云平台(AWS/阿里云/腾讯云):
在云服务商控制台的“安全组”或“网络ACL”中,直接添加拒绝规则,拦截特定IP访问服务器。
注意:此方法与Nginx层面拒绝IP不同,属于服务器或网络层拦截,可作为Nginx的“最后一道防线”。
三、实战建议与避坑指南
- 优先Nginx层面拦截:相比服务器防火墙,Nginx的IP拒绝更灵活(如可返回自定义页面),且不会影响其他服务。
- 测试验证:拒绝配置后,用
curl -I http://example.com或浏览器访问目标IP,确认是否返回403或被拦截。 - 避免误拦截:拒绝前确认IP来源(如通过
tail -f /var/log/nginx/access.log查看请求日志),防止误封正常用户。 - 定期更新黑名单:若恶意IP动态变化,需通过日志分析(如
grep "403" /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c)提取高频IP,及时更新拦截列表。
总结
Nginx拒绝IP的核心是通过deny、geo、限流等机制实现拦截。根据场景选择方法:少量IP用基础配置,批量IP用geo或外部列表,高频攻击用限流+拦截,服务器级拦截作为补充。合理配置后,能有效降低恶意请求对服务器的冲击,保障网站稳定运行。