以下是一个用于防范 DOS 攻击并自动屏蔽攻击 IP 的 Shell 脚本。这个脚本通过监控系统连接状态,识别异常 IP 并使用 iptables 进行屏蔽。
脚本代码:
#!/bin/bash
# DOS攻击防范脚本 - 自动监控并屏蔽异常IP连接
# 版本: 1.0
# 创建日期: 2025-06-25
# 配置参数
LOG_FILE="/var/log/dos_attack.log" # 日志文件路径
MAX_CONNECTIONS=100 # 单个IP最大连接数阈值
CHECK_INTERVAL=30 # 检查间隔(秒)
BAN_TIME=3600 # 封禁时间(秒)
IPT_SAVE="/sbin/iptables-save" # iptables保存命令路径
IPT_RESTORE="/sbin/iptables-restore" # iptables恢复命令路径
IPTABLES="/sbin/iptables" # iptables命令路径
# 确保脚本以root权限运行
if [ "$(id -u)" != "0" ]; then
echo "此脚本必须以root权限运行" 1>&2
exit 1
fi
# 初始化日志文件
init_log() {
if [ ! -f "$LOG_FILE" ]; then
touch "$LOG_FILE"
echo "$(date '+%Y-%m-%d %H:%M:%S') - 日志文件已创建" > "$LOG_FILE"
fi
}
# 记录日志
log() {
local message="$1"
echo "$(date '+%Y-%m-%d %H:%M:%S') - $message" >> "$LOG_FILE"
}
# 创建封禁IP的链
setup_iptables() {
# 检查是否已存在DOS防御链
$IPTABLES -L DOS_BLOCK 2>/dev/null | grep -q 'Chain DOS_BLOCK'
if [ $? -ne 0 ]; then
# 创建新链
$IPTABLES -N DOS_BLOCK
# 在INPUT链中添加对DOS_BLOCK链的引用
$IPTABLES -A INPUT -j DOS_BLOCK
log "创建新的DOS防御链"
fi
}
# 检查并屏蔽可疑IP
check_and_block() {
log "开始检查异常连接..."
# 获取连接数超过阈值的IP列表
suspicious_ips=$(netstat -anp | grep :80 | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | awk -v max="$MAX_CONNECTIONS" '$1 > max {print $2}')
for ip in $suspicious_ips; do
# 检查IP是否已经被屏蔽
$IPTABLES -L DOS_BLOCK | grep -q "$ip"
if [ $? -ne 0 ]; then
# 屏蔽IP
$IPTABLES -A DOS_BLOCK -s "$ip" -j DROP
log "屏蔽异常IP: $ip (连接数超过阈值: $MAX_CONNECTIONS)"
# 设置自动解封
(sleep "$BAN_TIME"; $IPTABLES -D DOS_BLOCK -s "$ip" -j DROP; log "解封IP: $ip") &
fi
done
log "检查完成"
}
# 保存当前防火墙规则
save_firewall_rules() {
$IPT_SAVE > /etc/iptables/rules.v4
log "防火墙规则已保存"
}
# 主函数
main() {
log "===== DOS攻击防范脚本已启动 ====="
init_log
setup_iptables
# 主循环
while true; do
check_and_block
save_firewall_rules
sleep "$CHECK_INTERVAL"
done
}
# 启动脚本
main
使用说明
1.脚本功能:
- 监控系统 TCP 连接,检测异常连接数的 IP
- 自动使用 iptables 屏蔽可疑 IP 地址
- 记录所有操作到日志文件
- 设置自动解封机制,避免永久封禁
2.安装与配置:
# 将脚本保存为 dos_defense.sh
chmod +x dos_defense.sh
sudo mv dos_defense.sh /usr/local/sbin/
# 修改配置参数(可选)
sudo nano /usr/local/sbin/dos_defense.sh
3.启动脚本:
sudo /usr/local/sbin/dos_defense.sh
4.设置为系统服务(推荐):
创建服务文件:
sudo nano /etc/systemd/system/dos-defense.service
内容如下:
[Unit]
Description=DOS Attack Defense Service
After=network.target
[Service]
ExecStart=/usr/local/sbin/dos_defense.sh
Restart=always
User=root
[Install]
WantedBy=multi-user.target
启用并启动服务:
sudo systemctl enable dos-defense
sudo systemctl start dos-defense
5.查看日志:
tail -f /var/log/dos_attack.log
6.自定义配置:
你可以根据实际需求修改脚本开头的配置参数,如调整连接数阈值、检查间隔时间等。
注意事项
- 此脚本需要 root 权限运行
- 确保系统已安装 netstat 工具(通常包含在 net-tools 包中)
- 建议在测试环境验证后再部署到生产环境
- 屏蔽 IP 会影响正常用户访问,请根据实际情况调整阈值
- 如需永久封禁某些 IP,可在脚本外部手动添加 iptables 规则
这个脚本通过监控系统连接状态,能够有效识别并防范 DOS 攻击,减轻服务器压力,保障服务的可用性。



