1. 防火墙IP段封禁的必要性与场景
在Linux服务器运维中,恶意IP地址段的访问是常见的安全威胁。我管理过上百台线上服务器,遇到过各种扫描爆破、CC攻击、爬虫骚扰等情况。封禁单个IP往往治标不治本,攻击者换个IP又能继续,这时候就需要对IP段进行批量封禁。
firewall-cmd作为RHEL/CentOS系统自带的防火墙管理工具,相比直接操作iptables有着更友好的语法和持久化机制。上周我们有个电商服务器就遭遇了来自58.218.0.0/16这个B类地址的持续扫描,通过firewall-cmd快速封禁了整个IP段,效果立竿见影。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. firewall-cmd核心命令解析
2.1 基础封禁命令
封禁单个IP的命令大家应该都熟悉:
bash复制firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" reject'
但封禁IP段时很多人会犯语法错误。正确的CIDR格式封禁命令是:
bash复制firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="58.218.0.0/16" reject'
关键点说明:
--permanent参数使规则永久生效family="ipv4"必须明确指定协议族- CIDR格式地址必须带引号
- 动作支持reject/drop,reject会返回拒绝包,drop直接丢弃
2.2 规则持久化与重载
添加规则后必须执行:
bash复制firewall-cmd --reload
否则规则只会在内存中临时生效,重启后丢失。我建议每次修改都立即reload,避免遗忘。
3. 高级封禁策略实践
3.1 多IP段批量封禁
当需要封禁多个连续IP段时,可以写成脚本:
bash复制for ip in 58.218.0.0/16 121.229.0.0/18 183.128.0.0/11
do
firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=$ip reject"
done
firewall-cmd --reload
3.2 临时封禁与定时解除
有时需要临时封禁:
bash复制# 不加--permanent就是临时规则
firewall-cmd --add-rich-rule='rule family="ipv4" source address="203.156.0.0/24" drop'
# 2小时后自动解除
sleep 2h && firewall-cmd --remove-rich-rule='rule family="ipv4" source address="203.156.0.0/24" drop'
3.3 端口级精细封禁
只想封禁某IP段对特定端口的访问:
bash复制firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="61.132.0.0/16" port port="3306" protocol="tcp" reject'
4. 运维经验与避坑指南
4.1 规则验证技巧
添加规则后务必验证:
bash复制# 查看所有rich rules
firewall-cmd --list-rich-rules
# 测试连通性(从其他服务器)
telnet 被封禁IP 端口
4.2 常见问题排查
-
规则不生效?
- 检查是否漏了
--reload - 确认firewalld服务正在运行:
systemctl status firewalld
- 检查是否漏了
-
误封怎么办?
- 立即移除规则:
firewall-cmd --permanent --remove-rich-rule='完整规则内容' - 紧急情况可先停用防火墙:
systemctl stop firewalld
- 立即移除规则:
-
规则太多性能下降?
- 合并相邻IP段,如将4个/24合并为1个/22
- 考虑改用ipset:
firewall-cmd --permanent --new-ipset=blacklist --type=hash:net
4.3 自动化监控方案
建议部署脚本自动封禁异常IP段:
bash复制# 监控nginx日志封禁频繁访问的/24网段
tail -f /var/log/nginx/access.log | awk '{print $1}' | cut -d. -f1-3 | sort | uniq -c | sort -nr | head -10 | while read count ip; do
[ $count -gt 1000 ] && firewall-cmd --add-rich-rule="rule family=ipv4 source address=$ip.0/24 drop"
done
5. 性能优化与替代方案
当需要管理超过500条IP段规则时,建议改用ipset:
bash复制# 创建ipset集合
firewall-cmd --permanent --new-ipset=blocklist --type=hash:net
# 添加IP段到集合
firewall-cmd --permanent --ipset=blocklist --add-entry=58.218.0.0/16
# 应用ipset规则
firewall-cmd --permanent --add-rich-rule='rule source ipset=blocklist drop'
ipset的优势:
- 哈希查找效率远高于线性规则链
- 支持快速批量更新
- 内存占用更低
对于高并发服务器,建议将ipset与硬件防火墙结合使用。我在某次电商大促时,通过ipset管理了超过2000个恶意IP段,CPU消耗仅增加2%。
