Shell 自动全网封禁系统

目标

将恶意 IP 的识别和封禁动作从单机扩展到多台服务器,实现统一下发、统一记录、统一回滚的轻量级安全联动。

适用场景

  • 多台 Web 服务器都暴露公网入口。
  • 某个恶意 IP 会切换访问不同节点。
  • 单机封禁不够,需要全网同步封禁。
  • 暂时没有集中式 WAF 或安全编排平台。

参数配置

参数示例说明
SERVER_LIST/etc/ban/servers.txt需要同步封禁的服务器列表
BAN_LIST/etc/ban/ip.list待封禁 IP 列表
ALLOW_LIST/etc/ban/allow.list白名单
BAN_LOG/var/log/global-ban.log操作日志
REMOTE_CMDiptables -I INPUT远端执行的封禁命令

核心逻辑

  1. 汇总待封禁 IP。
  2. 过滤白名单、内网地址、监控地址。
  3. 遍历服务器列表。
  4. 通过 SSH 在远端写入 iptables 规则。
  5. 记录每台服务器的执行结果。
  6. 提供统一解封和回滚命令。

脚本示例

#!/usr/bin/env bash
set -euo pipefail
 
SERVER_LIST="/etc/ban/servers.txt"
BAN_LIST="/etc/ban/ip.list"
ALLOW_LIST="/etc/ban/allow.list"
BAN_LOG="/var/log/global-ban.log"
DATE="$(date '+%Y-%m-%d %H:%M:%S')"
 
while read -r ip; do
  [ -z "$ip" ] && continue
  grep -qx "$ip" "$ALLOW_LIST" && continue
 
  while read -r server; do
    [ -z "$server" ] && continue
    ssh "$server" "iptables -C INPUT -s $ip -j DROP 2>/dev/null || iptables -I INPUT -s $ip -j DROP"
    echo "[$DATE] banned $ip on $server" >> "$BAN_LOG"
  done < "$SERVER_LIST"
done < "$BAN_LIST"

部署前检查

cat /etc/ban/servers.txt
cat /etc/ban/allow.list
ssh <server> 'hostname && iptables -L INPUT -n --line-numbers'

确认点:

  • SSH 账号权限可控。
  • 白名单完整。
  • 服务器列表准确。
  • 有统一回滚方式。

验证方法

tail -50 /var/log/global-ban.log
ssh <server> 'iptables -L INPUT -n --line-numbers'

确认点:

  • 每台服务器都写入封禁规则。
  • 白名单 IP 没有被封。
  • 执行失败的节点有日志记录。
  • 规则可以统一删除。

风险与回滚

风险处理方式
全网误封必须维护白名单和人工确认机制
SSH 执行失败记录失败节点并重试
规则重复写入使用 iptables -C 先检查
无法快速恢复准备统一解封脚本

统一解封示例:

ssh <server> "iptables -D INPUT -s <ip> -j DROP"

相关笔记