iptables防火墙批量拦截恶意扫描IP地址实操教程

为什么需要批量拦截恶意扫描 IP

服务器上线后,几乎每天都会收到来自不同 IP 的端口扫描、弱口令爆破等恶意请求。
手动一条条封禁效率太低,而且容易漏掉。
本文教你用 iptables 防火墙批量拦截恶意扫描 IP 地址,一次处理几百甚至几千个攻击来源,从根源降低被入侵风险。

准备工作

  • 操作系统:CentOS 7+ / Ubuntu 18.04+,默认已安装 iptables(未安装可执行 yum install iptables-servicesapt 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,可以用 tcpdumpiptables -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 saveiptables-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 的尝试。

宝塔面板的快捷方式(适合不熟悉命令行的用户)

如果你使用宝塔面板,可以直接在其“防火墙”模块中批量添加黑名单:

  1. 登录宝塔面板 → 安全 → 防火墙。
  2. 点击“添加规则”,选择“IP 黑名单”,将每行一个 IP 粘贴到输入框。
  3. 点击“批量添加”即可生效。
  4. 导出列表也可在“黑名单列表”中查看。

避坑指南与高频问题

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 的相关教程。

分享到:
上一篇
定时清理网站缓存文件提升访问速度
下一篇
数据库索引缺失查询缓慢批量优化:MySQL索引缺失导致查询慢
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意