Nginx配置geo封禁恶意IP时正常请求被拦截怎么办?

旗施~ 阅读 34

最近在配置Nginx服务器时,想通过geo模块封禁恶意扫描IP,但设置后正常访问也出现403了。我按网上的教程写了geo和limit_req配置,但测试时自己的IP被莫名拦截,日志显示匹配到了某个规则。检查配置发现可能是CIDR范围写错了,但改过几次还是不行…

配置片段如下(用CSS代码块包裹,但实际是Nginx配置):


geo $bad_clients {
    default 0;
    192.168.1.0/24 1;
    10.0.0.0/8      0;  // 这里可能搞反了标记值?
    172.16.0.0/12   1;
}
limit_req_zone $binary_remote_addr zone=antibots:10m rate=20r/s;

server {
    location / {
        if ($bad_clients) { return 403; }
        limit_req zone=antibots burst=5 nodelay;
    }
}

现在连本地测试访问都报403,但日志里显示请求速率并不高。难道geo的默认值设置有问题?或者CIDR范围覆盖了自己的IP?

我来解答 赞 10 收藏
二维码
手机扫码查看
2 条解答
Air-娅廷
问题在于你的geo规则里CIDR范围可能覆盖了正常IP,而且default值设为了0,这会让未明确匹配的IP都放行,但你自己的IP可能被错误标记了。先检查你的公网IP是否落在这些网段里,然后调整规则。

改一下配置试试这个:


geo $bad_clients {
default 1; # 默认拦截,安全起见
192.168.1.0/24 1;
10.0.0.0/8 0; # 内网IP放行
172.16.0.0/12 1;
你的公网IP 0; # 手动放行自己
}


记得用nginx -t测试配置文件语法,重启Nginx前确保规则改对了,别把自己也挡外面了。
点赞
2026-02-20 02:01
Good“慧娇
问题出在你的 geo 配置里,default 0 没问题,但某些 CIDR 可能覆盖了你自己的 IP。省事的话直接把你的公网 IP 加到 geo 里设为 0 就行。

geo $bad_clients {
default 0;
192.168.1.0/24 1;
10.0.0.0/8 0;
172.16.0.0/12 1;
YOUR_PUBLIC_IP 0; # 替换为你的实际公网 IP
}


如果还不行,检查 access_log 看匹配哪个规则了,直接改对应的 CIDR。
点赞 6
2026-01-30 12:04