宝塔安全页面添加IP黑名单最常用且可靠,规则写入自研防火墙(基于iptables/firewalld),对全端口生效,不依赖Nginx、无需重启;需确保系统防火墙已启动,支持单IP或CIDR网段,备注来源便于排查,提交后立即生效并可查日志;注意默认不拦截ICMP,禁ping需单独开启;精细控制须用firewall-cmd --add-rich-rule;网站层黑名单仅限HTTP请求,无法防护面板、SSH等,易被绕过;封禁后必须从外部实测验证,同时检查云厂商安全组是否同步限制。

在宝塔「安全」页面直接添加IP黑名单
这是最常用、也最不容易出错的方式,规则写入宝塔自研防火墙(基于iptables/firewalld封装),对整个服务器生效,包括面板、网站、SSH等所有端口。它不依赖Nginx配置,也不需要重启服务,保存即刻拦截。
操作路径:宝塔左侧菜单 → 安全 → 找到「系统防火墙」模块 → 确保状态为「已启动」→ 点击「屏蔽IP」按钮。
- IP输入框中填入要封禁的单个IP(如
203.203.203.203)或CIDR网段(如203.203.203.0/24),多个用换行分隔 - 备注建议写清楚来源,比如「高频扫描 203.203.203.0/24」,方便后续排查
- 点击「提交」后,规则立即写入底层防火墙,可在「防火墙日志」里实时看到匹配记录
- 注意:该功能默认只拦截TCP/UDP入站,不拦ICMP(ping),如需禁ping需单独开启「禁Ping」开关
用firewall-cmd命令手动添加更精细的rich rule
当你要封禁的IP段需要配合端口、协议甚至时间条件时,图形界面不够用,得用firewalld原生命令。比如只想封禁某IP段对8888端口的访问,但放行其对80端口的请求——这种策略只能靠firewall-cmd --add-rich-rule实现。
- 封禁特定IP段对面板端口的访问:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.203.203.0/24" port port="8888" protocol="tcp" reject' - 必须加
--permanent,否则重启失效;执行后务必firewall-cmd --reload - 不要混用
allow和reject规则顺序——firewalld按顺序匹配,先写的优先级高 - 查当前所有rich规则:
firewall-cmd --list-rich-rules,避免重复添加导致冲突
为什么不能只靠网站层IP黑名单?
网站设置里的「IP黑名单」只作用于该站点的Nginx location 或 server 块,它不碰面板本身、不拦PHP探针、不防SSH爆破,更不阻止恶意IP直连http://服务器IP:8888尝试登录。如果你的目标是封“恶意IP段”,那它大概率正拿着扫描器扫你所有开放端口,只封网站等于关前门、开后窗。
- 网站层黑名单:仅影响
server_name匹配成功的HTTP请求,对非域名访问无效 - 系统防火墙黑名单:从网络层丢包,连接根本建不起来,CPU和带宽零消耗
- 真实案例:某用户只在网站里封了
116.255.0.0/16,结果攻击者改用curl -x http://116.255.1.100:8080 http://服务器IP:8888绕过,就是因为没走网站层
封禁后验证是否真正生效
别只看宝塔界面上的“已添加”,恶意IP是否真被挡在外面,得从服务器外部实测。最容易忽略的是本地回环测试和代理中转场景。
- 从被封IP段外的机器执行:
telnet 你的服务器IP 8888,应显示“Connection refused”或超时,而不是登录页响应 - 用被封IP段内的VPS或手机热点测试:
curl -v http://你的服务器IP:8888,响应码应为0(连接失败),而非403或重定向 - 检查
iptables -L INPUT -n | grep DROP,确认有对应源IP的DROP规则(firewalld底层实际也在调用iptables) - 特别注意:如果开了云厂商安全组,得同步检查安全组规则——它比系统防火墙优先级更高,万一安全组还放行着,封了也白封
真正起效的IP封禁,从来不是点一下「屏蔽IP」就完事。关键在于封的位置够深(网络层)、范围够准(CIDR别写错)、验证够狠(必须从被封端发起实测)。很多问题其实不出在“怎么封”,而出在“以为封了”。










