用宝塔「Nginx防火墙」插件封IP最稳,规则注入http或server块,优先级高、不重启即生效,支持IP段、批量导入和日志追踪;网站层IP黑名单仅作用于location块,易被覆盖且仅限单站。

直接结论:用宝塔「Nginx防火墙」插件封IP最稳,规则注入 http 或 server 块,优先级高于网站层配置,不重启即生效,且支持 IP 段、批量导入和日志追踪。
为什么别用网站层「IP 黑名单」?
网站管理页里的「安全 → 访问控制 → IP 黑名单」本质是往该站点的 location 块里加 deny 指令,层级低、易被覆盖。比如你开了反向代理、用了 CDN、或者配置里有 allow all 冲突语句,这条规则就可能失效。更糟的是,它只对当前站点起作用,恶意 IP 换个域名或直连 IP 还能打其他站。
常见错误现象:
- 填了
192.168.1.100却还能访问,查 Nginx 配置发现被自动注释掉 - 封了 IP 后,日志里仍看到该 IP 的 200 请求(说明没拦住)
- 开启 SSL 后规则突然失效——因为 HTTPS 的
server块没同步写入deny
怎么用 Nginx 防火墙插件真正封死?
这个插件是专业版功能,但免费(需登录宝塔账号授权)。它把规则直接写进全局 http 块或每个 server 块开头,拦截发生在请求解析早期,绕过大部分配置干扰。
操作要点:
- 先去「软件商店」搜
Nginx防火墙,安装并启用(状态必须是“已启动”) - 进入「Nginx防火墙 → 全局设置 → IP黑名单」,填单个 IP 就写
203.0.113.45;封 C 段就写203.0.113.0–203.0.113.255 - 支持 CIDR 格式,如
192.0.2.0/24,但注意 IPv6 要求 Nginx 编译时启用了ipv6模块 - 提交后立即生效,不用点「重载 Nginx」,也不用重启服务
- 被封 IP 访问任意站点都会返回
403 Forbidden,日志在插件页「访问日志」里可查
系统防火墙(firewalld/iptables)封 IP 有什么坑?
系统级封禁最彻底,但它封的是所有端口,不是只拦 HTTP。这意味着:如果误封了自己办公网 IP,可能连 SSH(22 端口)、FTP(21 端口)甚至数据库(3306)都进不去。
关键注意事项:
- 封 IP 前务必确认服务器上没有其他对外服务依赖同一 IP+端口组合
- 用
firewall-cmd时,--permanent参数必须带上,否则重启后规则丢失 - 执行
firewall-cmd --reload才真正加载新规则,光add-rich-rule不 reload 是无效的 - 如果同时用了云服务商安全组(如阿里云 ECS 安全组),系统防火墙规则可能被外层过滤截断,建议优先用安全组做第一道网关
封国外 IP 别只信「禁止海外访问」开关
这个功能底层靠 GeoIP 数据库匹配,但库更新慢、精度差。港澳台常被误判为境外,跨境 CDN(如 Cloudflare 日本节点、AWS 新加坡边缘)也容易被当成攻击源封掉,导致真实用户无法访问。
更靠谱的做法:
- 先用插件「访问日志」筛选出高频、无 User-Agent、大量 404 的真实恶意 IP,再手动拉黑
- 结合 CDN 提供的
X-Forwarded-For或Cf-Connecting-IP头做精准识别(需在插件配置中开启「获取真实 IP」) - 如果真要按地域控,建议在 CDN 层设置(如 Cloudflare 的 WAF 地理围栏),比宝塔内置的 GeoIP 可靠得多
最后提醒一句:Nginx 防火墙插件的规则文件默认路径是 /www/server/panel/plugin/nginxfirewall/config.json,手动改过别忘了备份——插件升级时可能被覆盖。

















