iptables防火墙批量拦截恶意扫描IP地址实操教程
为什么需要批量拦截恶意扫描 IP
服务器上线后,几乎每天都会收到来自不同 IP 的端口扫描、弱口令爆破等恶意请求。
手动一条条封禁效率太低,而且容易漏掉。
本文教你用 iptables 防火墙批量拦截恶意扫描 IP 地址,一次处理几百甚至几千个攻击来源,从根源降低被入侵风险。
准备工作
- 操作系统:CentOS 7+ / Ubuntu 18.04+,默认已安装 iptables(未安装可执行
yum install iptables-services或apt install iptables-persistent)。 - 权限:需要 root 或 sudo 权限。
- 日志路径:攻击日志通常位于
/var/log/auth.log(Debian/Ubuntu)或/var/log/secure(CentOS/RHEL)。 - 备份当前规则:执行
iptables-save > /root/iptables-backup-$(date +%Y%m%d).txt以防误操作。
四步完成批量拦截
第一步:从日志中提取恶意 IP
用 grep 过滤 SSH 认证失败的 IP(以 SSH 暴力破解为例):
grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head -100 > /root/bad-ip.txt
- 该命令统计尝试次数最多的前 100 个 IP。
- 如果目标是对所有端口扫描的 IP,可以用
tcpdump或iptables -N LOGDROP先记录,再分析。
第二步:编写批量封禁脚本
创建一个脚本 /root/block-ip.sh:
#!/bin/bash
# 清空之前的自定义链(如果存在)
iptables -N BLOCKLIST 2>/dev/null
iptables -F BLOCKLIST
# 读取 IP 列表并添加规则
while IFS= read -r ip
do
# 跳过空行
[ -z "$ip" ] && continue
# 提取纯 IP(如果行首有次数需要处理)
ip_clean=$(echo $ip | awk '{print $2}')
iptables -A BLOCKLIST -s $ip_clean -j DROP
done < /root/bad-ip.txt
# 将自定义链加入 INPUT 链
iptables -I INPUT -j BLOCKLIST
给脚本执行权限并运行:
chmod +x /root/block-ip.sh
bash /root/block-ip.sh
第三步:保存规则(避免重启丢失)
- CentOS/RHEL:
service iptables save或iptables-save > /etc/sysconfig/iptables - Ubuntu/Debian:
iptables-save > /etc/iptables/rules.v4(需先安装 iptables-persistent)
第四步:验证拦截效果
- 查看自定义链规则数量:
iptables -L BLOCKLIST -n | wc -l - 模拟测试:用自己另一个 IP 执行
ping,若丢包则说明已拦截;生产环境建议用iptables -L BLOCKLIST -n确认列表。 - 观察日志:
tail -f /var/log/auth.log应不再出现来自已封 IP 的尝试。
宝塔面板的快捷方式(适合不熟悉命令行的用户)
如果你使用宝塔面板,可以直接在其“防火墙”模块中批量添加黑名单:
- 登录宝塔面板 → 安全 → 防火墙。
- 点击“添加规则”,选择“IP 黑名单”,将每行一个 IP 粘贴到输入框。
- 点击“批量添加”即可生效。
- 导出列表也可在“黑名单列表”中查看。
避坑指南与高频问题
1. 为什么封禁后自己连不上服务器?
脚本中已经用自定义链 BLOCKLIST,只对从外部进来的访问生效,如果自己 IP 被误加入黑名单,需要执行:
iptables -D BLOCKLIST -s <你自己的IP> -j DROP
2. 封禁大量 IP 后性能下降?
iptables 规则是线性匹配,几千条规则会影响吞吐量。建议改用 ipset 集合:
ipset create blacklist hash:ip
ipset add blacklist 1.2.3.4
# 然后一条规则引用集合
iptables -I INPUT -m set --match-set blacklist src -j DROP
这样无论多少 IP,只对应一条规则,性能极佳。
3. 如何解封所有 IP?
清空自定义链:
iptables -F BLOCKLIST
然后执行 service iptables save 保存。
4. 重启后规则丢失怎么办?
确保已经执行了保存命令,并检查 iptables 服务是否开机自启:
- CentOS:
systemctl enable iptables - Ubuntu:
systemctl enable netfilter-persistent
结尾
通过以上步骤,你已经掌握了 防火墙批量拦截恶意扫描 IP 地址 的核心方法。
推荐先用少量 IP 测试,确认无误后再批量处理。
如果遇到异常,优先回退到备份规则,并检查日志中的 IP 准确性。
需要更深入的安全加固,可以继续查看站内关于 fail2ban 或 Cloudflare WAF 的相关教程。