如何通过Linux防火墙设置IP黑名单,轻松屏蔽恶意访问?
- 内容介绍
- 文章标签
- 相关推荐
至于痛点直击,恶意IP攻击让服务器陷入“资源危机”
每当有恶意IP持续暴力访问时CPU、内存、带宽会被快速耗尽。日志文件瞬间膨胀,甚至导致服务宕机。不过,程序管理员最怕的就是:
- 服务器响应变慢。使用者体验骤降,
- 关键业务被攻击流量淹没,业务中断。老实说,
- 手动逐个封禁IP耗时费力。容易漏掉,怎么说呢,
以上问题如果不及时解决。将直接影响业务的可用性和公司形象。下面教你通过Linux防火墙一次性设置IP黑名单轻松拦截这些恶意访问。
一、准备工作:确认防火墙工具
1. iptables vs firewalld
大多数发行版默认提供以下两种防火墙:
- iptables规则基于链。兼容性好,适合老旧程序,
- firewalld基于zone概念。动态管理更方便,CentOS 7+、RHEL 8+ 推荐使用。
二、使用 iptables 设置 IP 黑名单
步骤 1:创建黑名单文件
# 创建并编辑黑名单文件
sudo touch /etc/iptables-blacklist
sudo chmod 600 /etc/iptables-blacklist
# 示例内容
123.45.67.89
210.34.56.78
步骤 2:利用 ipset 提高匹配效率
# 安装 ipset
sudo yum install -y ipset # RHEL/CentOS
sudo apt-get install -y ipset # Debian/Ubuntu
# 创建名为 blacklist 的集合
sudo ipset create blacklist hash:ip
# 将文件中的 IP 导入集合
while read ip;do sudo ipset add blacklist $ip;done
步骤 3:在 INPUT 链添加 DROP 规则
# 使用 ipset 匹配
sudo iptables -I INPUT -m set --match-set blacklist src -j DROP
# 如果不使用 ipset,可直接遍历文件生成规则
while read ip;do sudo iptables -I INPUT -s $ip -j DROP;老实说,done
步骤 4:保存并持久化规则
# CentOS / RHEL 7-
sudo service iptables save # 将规则写入 /etc/sysconfig/iptables
# CentOS / RHEL 8+ / Debian / Ubuntu
sudo sh -c "iptables-save> /etc/iptables/rules.v4"
# 开机自动加载
sudo systemctl enable netfilter-persistent # Ubuntu/Debian
sudo systemctl enable iptables # RHEL/CentOS
三、使用 firewalld 设置 IP 黑名单
步骤 1:创建专用 zone “blacklist” 并设为拒绝所有流量
# 创建 zone
sudo firewall-cmd --permanent --new-zone=blacklist
# 将该 zone 的默认行为设为 reject
sudo firewall-cmd --permanent --zone=blacklist --set-target=REJECT
步骤 2:把恶意 IP 加入 blacklisting zone 中的 source 列表
# 单个 IP 示例
sudo firewall-cmd --permanent --zone=blacklist --add-source=123.45.67.89
# 批量导入
while read ip;do sudo firewall-cmd --permanent --zone=blacklist --add-source=$ip;done
步骤 3:重新加载 firewalld 并验证生效情况
# 重载配置使之生效
sudo firewall-cmd --reload
# 检查是否已加入对应 zone
sudo firewall-cmd --zone=blacklist --list-sources
四、自动化与动态更新方案
1. 使用 Fail2Ban 实时捕获攻击并写入黑名单
# 安装 Fail2Ban
sudo apt-get install -y fail2ban
# 创建本地配置覆盖原始 jail.conf
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
# 编辑 jail.local。开启 sshd 与自定义服务的监控示例:
enabled = true
port = ssh
filter = sshd
logpath = %s
maxretry = 5 # 连续失败次数阈值
bantime = 86400 # 封禁时间,这里为 24 小时
enabled = true
port = http,https
filter = http-get-dos
logpath = /var/log/nginx/access.log # 根据实际 web server 调整方法
maxretry = 100 # 每分钟请求次数阈值,可自行调节
# 启动并设为开机自启
sudo systemctl start fail2ban
sudo systemctl enable fail2ban
# 查看当前被封禁的 IP 列表:
sudo fail2ban-client status sshd # 替换为相应 jail 名称即可查看对应列表
2. 利用脚本定时同步外部黑名单源
# 示例脚本
#!/bin/bash
BLACKLIST_FILE="/etc/iptables-blacklist"
REMOTE_URL="https://example.com/malicious-ips.txt"
curl -sSf "$REMOTE_URL" | grep -Eo '{3}{1,3}'> "$BLACKLIST_FILE.tmp"
if;
n
mv "$BLACKLIST_FILE.tmp" "$BLACKLIST_FILE"
# 更新 iptables/ipset 或 firewalld
sudo ipset flush blacklist # 若使用 ipset,需要先清空再重新加载
while read ip;do sudo ipset add blacklist $ip;done <"$BLACKLIST_FILE"
sudo firewall-cmd --reload # 若使用 firewalld,只需 reload 即可
fi
将上述脚本加入 CronJob 可实现黑名单的自动更新:
# 每小时执行一次更新脚本:
0 * * * * root /usr/local/bin/update_blacklist.sh>/dev/null 2>&1
五、黑名单日常运维要点
-
定期审计:每周检查一次
/etc/iptables-blacklist是否仍然有效,避免误封合法 IP。 - CIDR 合并:If 同一段 IP 被大量封禁。可使用网段方式 ) 减少规则数量,提高性能。
- 日志监控:SNS、Slack 或邮件报警,当新 IP 被加入黑名单时立即通知运维人员。
-
临时解封:Suspend 时长过长导致误伤,可通过
sudo iptables -D INPUT …/sudo firewall-cmd --zone=blacklist --remove-source=IP` 手动删除。 - NFTables 转型:NFTables 是 Linux 内核的新一代防火墙框架。如果程序已升级,请考虑迁移,以获得更好的性能与可维护性。
六、完整示例——从零搭建到自动化全流程
a) 环境准备
# 安装必要工具
sudo dnf install -y firewalld ipset curl
# 启动并设为开机自启
sudo systemctl enable --now firewalld
sudo systemctl enable --now nftables # 若想同步到 nftables 可额外开启
b) 建立黑名单文件并导入至 firewalld + ipset
# 创建文件并写入初始恶意 IP
cat> /etc/iptables-blacklist
# 安装 Fail2Ban 并开启 sshd jail
sudo dnf install -y fail2ban
cat>/etc/fail2ban/jail.local <'EOF'
enabled = true
port = ssh
filter = sshd
logpath = %s
maxretry = 5
bantime = 43200 ; 半天封禁
ignoreip = 127.0.0.1/8 ::1
EOF
systemctl restart fail2ban && systemctl enable fail2ban
d) 自动更新脚本部署
# 保存到 /usr/local/bin/update_blacklist.sh 并赋予执行权限
chmod +x /usr/local/bin/update_blacklist.sh
# 添加 cron 条目,每日凌晨两点执行
echo "0 2 * * * root /usr/local/bin/update_blackl ist.sh>/dev/null 2>&1" | sudo tee -a /etc/crontab
# 安装 Fail2Ban 并开启 sshd jail
sudo dnf install -y fail2ban
cat>/etc/fail2ban/jail.local <'EOF'
enabled = true
port = ssh
filter = sshd
logpath = %s
maxretry = 5
bantime = 43200 ; 半天封禁
ignoreip = 127.0.0.1/8 ::1
EOF
systemctl restart fail2ban && systemctl enable fail2ban
完成以上全部步骤后你的 Linux 主机已经具备了:
- *实时拦截已知恶意 IP* —— 基于手工或第三方情报库;
- *自动识别暴力登录* —— Fail2Ban 动态写入防火墙;
- *周期性同步最新黑名单* —— Cron + 脚本实现无人值守;*统一管理与审计* —— 所有规则集中在 firewalld zone 与 ipset 中,一键查看、一键清理。
TIPS:
- A) 若服务器同时运行 IPv6,请记得在对应的 IPv6 区域或集合中添加一样的地址段。
- B) 对外提供 API 时可考虑对特定方法采用 Rate‑Limit,配合 IP 黑名单形成双层防护。
- C) 在高流量环境下建议使用 nftables + sets 替代传统的 long‑chain rules,以降低内核查找开销。
- D) 永远保留一份“白名单”,防止误伤内部业务程序或运维机器。
至于痛点直击,恶意IP攻击让服务器陷入“资源危机”
每当有恶意IP持续暴力访问时CPU、内存、带宽会被快速耗尽。日志文件瞬间膨胀,甚至导致服务宕机。不过,程序管理员最怕的就是:
- 服务器响应变慢。使用者体验骤降,
- 关键业务被攻击流量淹没,业务中断。老实说,
- 手动逐个封禁IP耗时费力。容易漏掉,怎么说呢,
以上问题如果不及时解决。将直接影响业务的可用性和公司形象。下面教你通过Linux防火墙一次性设置IP黑名单轻松拦截这些恶意访问。
一、准备工作:确认防火墙工具
1. iptables vs firewalld
大多数发行版默认提供以下两种防火墙:
- iptables规则基于链。兼容性好,适合老旧程序,
- firewalld基于zone概念。动态管理更方便,CentOS 7+、RHEL 8+ 推荐使用。
二、使用 iptables 设置 IP 黑名单
步骤 1:创建黑名单文件
# 创建并编辑黑名单文件
sudo touch /etc/iptables-blacklist
sudo chmod 600 /etc/iptables-blacklist
# 示例内容
123.45.67.89
210.34.56.78
步骤 2:利用 ipset 提高匹配效率
# 安装 ipset
sudo yum install -y ipset # RHEL/CentOS
sudo apt-get install -y ipset # Debian/Ubuntu
# 创建名为 blacklist 的集合
sudo ipset create blacklist hash:ip
# 将文件中的 IP 导入集合
while read ip;do sudo ipset add blacklist $ip;done
步骤 3:在 INPUT 链添加 DROP 规则
# 使用 ipset 匹配
sudo iptables -I INPUT -m set --match-set blacklist src -j DROP
# 如果不使用 ipset,可直接遍历文件生成规则
while read ip;do sudo iptables -I INPUT -s $ip -j DROP;老实说,done
步骤 4:保存并持久化规则
# CentOS / RHEL 7-
sudo service iptables save # 将规则写入 /etc/sysconfig/iptables
# CentOS / RHEL 8+ / Debian / Ubuntu
sudo sh -c "iptables-save> /etc/iptables/rules.v4"
# 开机自动加载
sudo systemctl enable netfilter-persistent # Ubuntu/Debian
sudo systemctl enable iptables # RHEL/CentOS
三、使用 firewalld 设置 IP 黑名单
步骤 1:创建专用 zone “blacklist” 并设为拒绝所有流量
# 创建 zone
sudo firewall-cmd --permanent --new-zone=blacklist
# 将该 zone 的默认行为设为 reject
sudo firewall-cmd --permanent --zone=blacklist --set-target=REJECT
步骤 2:把恶意 IP 加入 blacklisting zone 中的 source 列表
# 单个 IP 示例
sudo firewall-cmd --permanent --zone=blacklist --add-source=123.45.67.89
# 批量导入
while read ip;do sudo firewall-cmd --permanent --zone=blacklist --add-source=$ip;done
步骤 3:重新加载 firewalld 并验证生效情况
# 重载配置使之生效
sudo firewall-cmd --reload
# 检查是否已加入对应 zone
sudo firewall-cmd --zone=blacklist --list-sources
四、自动化与动态更新方案
1. 使用 Fail2Ban 实时捕获攻击并写入黑名单
# 安装 Fail2Ban
sudo apt-get install -y fail2ban
# 创建本地配置覆盖原始 jail.conf
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
# 编辑 jail.local。开启 sshd 与自定义服务的监控示例:
enabled = true
port = ssh
filter = sshd
logpath = %s
maxretry = 5 # 连续失败次数阈值
bantime = 86400 # 封禁时间,这里为 24 小时
enabled = true
port = http,https
filter = http-get-dos
logpath = /var/log/nginx/access.log # 根据实际 web server 调整方法
maxretry = 100 # 每分钟请求次数阈值,可自行调节
# 启动并设为开机自启
sudo systemctl start fail2ban
sudo systemctl enable fail2ban
# 查看当前被封禁的 IP 列表:
sudo fail2ban-client status sshd # 替换为相应 jail 名称即可查看对应列表
2. 利用脚本定时同步外部黑名单源
# 示例脚本
#!/bin/bash
BLACKLIST_FILE="/etc/iptables-blacklist"
REMOTE_URL="https://example.com/malicious-ips.txt"
curl -sSf "$REMOTE_URL" | grep -Eo '{3}{1,3}'> "$BLACKLIST_FILE.tmp"
if;
n
mv "$BLACKLIST_FILE.tmp" "$BLACKLIST_FILE"
# 更新 iptables/ipset 或 firewalld
sudo ipset flush blacklist # 若使用 ipset,需要先清空再重新加载
while read ip;do sudo ipset add blacklist $ip;done <"$BLACKLIST_FILE"
sudo firewall-cmd --reload # 若使用 firewalld,只需 reload 即可
fi
将上述脚本加入 CronJob 可实现黑名单的自动更新:
# 每小时执行一次更新脚本:
0 * * * * root /usr/local/bin/update_blacklist.sh>/dev/null 2>&1
五、黑名单日常运维要点
-
定期审计:每周检查一次
/etc/iptables-blacklist是否仍然有效,避免误封合法 IP。 - CIDR 合并:If 同一段 IP 被大量封禁。可使用网段方式 ) 减少规则数量,提高性能。
- 日志监控:SNS、Slack 或邮件报警,当新 IP 被加入黑名单时立即通知运维人员。
-
临时解封:Suspend 时长过长导致误伤,可通过
sudo iptables -D INPUT …/sudo firewall-cmd --zone=blacklist --remove-source=IP` 手动删除。 - NFTables 转型:NFTables 是 Linux 内核的新一代防火墙框架。如果程序已升级,请考虑迁移,以获得更好的性能与可维护性。
六、完整示例——从零搭建到自动化全流程
a) 环境准备
# 安装必要工具
sudo dnf install -y firewalld ipset curl
# 启动并设为开机自启
sudo systemctl enable --now firewalld
sudo systemctl enable --now nftables # 若想同步到 nftables 可额外开启
b) 建立黑名单文件并导入至 firewalld + ipset
# 创建文件并写入初始恶意 IP
cat> /etc/iptables-blacklist
# 安装 Fail2Ban 并开启 sshd jail
sudo dnf install -y fail2ban
cat>/etc/fail2ban/jail.local <'EOF'
enabled = true
port = ssh
filter = sshd
logpath = %s
maxretry = 5
bantime = 43200 ; 半天封禁
ignoreip = 127.0.0.1/8 ::1
EOF
systemctl restart fail2ban && systemctl enable fail2ban
d) 自动更新脚本部署
# 保存到 /usr/local/bin/update_blacklist.sh 并赋予执行权限
chmod +x /usr/local/bin/update_blacklist.sh
# 添加 cron 条目,每日凌晨两点执行
echo "0 2 * * * root /usr/local/bin/update_blackl ist.sh>/dev/null 2>&1" | sudo tee -a /etc/crontab
# 安装 Fail2Ban 并开启 sshd jail
sudo dnf install -y fail2ban
cat>/etc/fail2ban/jail.local <'EOF'
enabled = true
port = ssh
filter = sshd
logpath = %s
maxretry = 5
bantime = 43200 ; 半天封禁
ignoreip = 127.0.0.1/8 ::1
EOF
systemctl restart fail2ban && systemctl enable fail2ban
完成以上全部步骤后你的 Linux 主机已经具备了:
- *实时拦截已知恶意 IP* —— 基于手工或第三方情报库;
- *自动识别暴力登录* —— Fail2Ban 动态写入防火墙;
- *周期性同步最新黑名单* —— Cron + 脚本实现无人值守;*统一管理与审计* —— 所有规则集中在 firewalld zone 与 ipset 中,一键查看、一键清理。
TIPS:
- A) 若服务器同时运行 IPv6,请记得在对应的 IPv6 区域或集合中添加一样的地址段。
- B) 对外提供 API 时可考虑对特定方法采用 Rate‑Limit,配合 IP 黑名单形成双层防护。
- C) 在高流量环境下建议使用 nftables + sets 替代传统的 long‑chain rules,以降低内核查找开销。
- D) 永远保留一份“白名单”,防止误伤内部业务程序或运维机器。

