diff --git a/bash/setup_f2b.sh b/bash/setup_f2b.sh new file mode 100644 index 0000000..bac1cae --- /dev/null +++ b/bash/setup_f2b.sh @@ -0,0 +1,175 @@ +#!/bin/bash +set -euo pipefail + +# Debian 12/13 Fail2Ban SSH 硬化脚本(含旧版检测/卸载/迁移白名单/封禁测试排除自己公网IP) +# 用法: +# bash install-fail2ban-debian.sh +# 可选白名单: +# IGNORE_IPS="127.0.0.1/8 ::1 你的固定IP" bash install-fail2ban-debian.sh + +if [ "$(id -u)" -ne 0 ]; then + echo "请以 root 权限运行" + exit 1 +fi + +CONF_FILE="/etc/fail2ban/jail.d/99-sshd-hardening.local" +F2B_LOCAL="/etc/fail2ban/fail2ban.local" +TS="$(date +%Y%m%d-%H%M%S)" +IGNORE_IPS="${IGNORE_IPS:-127.0.0.1/8 ::1}" + +# 获取当前公网 IP,用于封禁测试排除 +PUB_IP=$(curl -s https://ifconfig.me || true) +if [[ -n "$PUB_IP" ]]; then + echo "检测到当前公网 IP: $PUB_IP (封禁测试将自动排除)" +else + PUB_IP="" + echo "未能检测公网 IP,封禁测试需手动注意不要封自己的 IP" +fi + +OLD_INSTALLED=false +if command -v fail2ban-client >/dev/null 2>&1; then + OLD_INSTALLED=true + echo "检测到已有 Fail2Ban 安装" + read -p "是否删除旧版并安装新版本?(y/n) " yn + case "$yn" in + [Yy]* ) + echo "停止 Fail2Ban 服务..." + systemctl stop fail2ban || true + + echo "备份旧配置..." + mkdir -p /root/fail2ban-backup-${TS} + cp -r /etc/fail2ban/* /root/fail2ban-backup-${TS}/ || true + echo "已备份到 /root/fail2ban-backup-${TS}/" + + # 自动提取旧 sshd jail ignoreip + for OLD_FILE in /etc/fail2ban/jail.local /etc/fail2ban/jail.d/sshd.local; do + if [ -f "$OLD_FILE" ]; then + OLD_IGNORE=$(grep -E '^ignoreip' "$OLD_FILE" | awk -F= '{print $2}' | xargs || true) + if [ -n "$OLD_IGNORE" ]; then + echo "检测到旧 ignoreip: $OLD_IGNORE" + IGNORE_IPS="$IGNORE_IPS $OLD_IGNORE" + fi + fi + done + + echo "卸载 Fail2Ban..." + apt-get remove --purge -y fail2ban + rm -rf /etc/fail2ban + ;; + * ) + echo "保留旧版 Fail2Ban" + echo "检测当前 sshd jail 状态:" + fail2ban-client status sshd || echo "未启用 sshd jail 或旧版不支持 systemd backend" + echo "查看旧封禁 IP(如有):" + fail2ban-client status sshd | grep "Banned IPs" || echo "无已封禁 IP" + exit 0 + ;; + esac +fi + +echo "安装 Fail2Ban 与 nftables..." +export DEBIAN_FRONTEND=noninteractive +apt-get update +apt-get install -y fail2ban nftables python3-systemd + +echo "检测 SSH 端口..." +SSHD_PORTS="$(sshd -T 2>/dev/null | awk '$1 == "port" {print $2}' | paste -sd, - || true)" +SSHD_PORTS="${SSHD_PORTS:-22}" +echo "SSH 端口:${SSHD_PORTS}" + +echo "备份已有配置(如果存在)..." +[ -f "$CONF_FILE" ] && cp "$CONF_FILE" "${CONF_FILE}.bak.${TS}" +[ -f "$F2B_LOCAL" ] && cp "$F2B_LOCAL" "${F2B_LOCAL}.bak.${TS}" +mkdir -p /etc/fail2ban/jail.d + +echo "写入 Debian 12/13 兼容配置:$CONF_FILE" +cat > "$CONF_FILE" < "$F2B_LOCAL" <