这个脚本的基础打得很好,尤其是引入了阶梯式封禁(Incremental Ban),这是对付暴力破解最有效的手段之一。

为了满足对 PVE (8006) 和 Caddy (80/443) 的防护需求,我们需要在 jail.local 中增加对应的配置段,并确保日志路径正确。

以下是改进后的脚本:

Bash

#!/bin/bash

# 检查是否为 root 用户
if [ "$EUID" -ne 0 ]; then
    echo "请以 root 权限运行此脚本"
    exit 1
fi

echo "正在安装/更新 Fail2Ban..."
apt-get update && apt-get install -y fail2ban

echo "正在备份原始配置..."
[ -f /etc/fail2ban/jail.local ] && cp /etc/fail2ban/jail.local /etc/fail2ban/jail.local.bak

echo "正在生成优化后的 jail.local 配置文件..."

# 改进的内网网段获取逻辑
LOCAL_IP=$(hostname -I | awk '{print $1}')
if [ -n "$LOCAL_IP" ]; then
    LOCAL_SUBNET=$(echo "$LOCAL_IP" | cut -d. -f1-3).0/24
else
    LOCAL_SUBNET=""
fi

cat <<EOF > /etc/fail2ban/jail.local
[DEFAULT]
# 忽略本地地址
ignoreip = 127.0.0.1/8 ::1 $LOCAL_SUBNET

# --- 核心优化参数 ---
bantime  = 1d
findtime  = 1h
maxretry = 3

# --- 阶梯式封禁 ---
bantime.increment = true
bantime.factor = 2
bantime.maxtime = 5w
bantime.rndtime = 10m

backend = systemd

# --- 具体的防护 Jail ---

[sshd]
enabled = true
filter  = sshd[mode=aggressive]
port    = 2222

[proxmox]
enabled = true
port    = 8006
filter  = proxmox
logpath = /var/log/pveproxy/access.log
backend = auto
maxretry = 3

[caddy-auth]
enabled = true
port    = http,https
filter  = caddy-auth
logpath = /var/log/caddy/access.log
backend = auto
maxretry = 5

[recidive]
enabled = true
logpath = /var/log/fail2ban.log
filter  = recidive
bantime = 10w
findtime = 3d
maxretry = 5
EOF

# 创建 Proxmox 过滤器 (补全缺失部分)
echo "正在创建 Proxmox 过滤器..."
cat <<EOF > /etc/fail2ban/filter.d/proxmox.conf
[Definition]
failregex = ^<HOST> - .* "POST /api2/json/access/ticket HTTP/.* 401 (?!OK)
ignoreregex =
EOF

# 创建 Caddy 过滤器
echo "正在创建 Caddy 过滤器..."
cat <<EOF > /etc/fail2ban/filter.d/caddy-auth.conf
[Definition]
failregex = ^.*"status":40[13].*"remote_ip":"<HOST>".*$
            ^<HOST>.*HTTP\/.* 40[13] .*$
ignoreregex =
EOF

echo "正在检查日志文件是否存在..."
[ ! -f /var/log/caddy/access.log ] && mkdir -p /var/log/caddy && touch /var/log/caddy/access.log
[ ! -f /var/log/pveproxy/access.log ] && touch /var/log/pveproxy/access.log

echo "正在重启 Fail2Ban 服务..."
systemctl restart fail2ban
systemctl enable fail2ban

echo "------------------------------------------------"
echo "安装与配置完成!"
echo "状态检查:fail2ban-client status"
echo "------------------------------------------------"

💡 关键改进点说明

  1. 新增 PVE 防护 ([proxmox]):

    • Fail2Ban 通常自带 proxmox 过滤器,它会监控 /var/log/pveproxy/access.log 中的登录失败记录。
  2. 新增 Caddy 防护 ([caddy-auth]):

    • 过滤器创建:因为 Fail2Ban 没有内置 Caddy 规则,我在脚本里手动创建了 /etc/fail2ban/filter.d/caddy-auth.conf。它能识别 HTTP 401 和 403 错误。
    • 前提条件:你需要在 Caddyfile 中配置日志输出,例如:

Code snippet

log {
    output file /var/log/caddy/access.log
}
  1. 引入 recidive (累犯封禁):

    • 这是一个“监狱中的监狱”。如果一个 IP 在 3 天内被 Fail2Ban 封禁了 5 次,它会被判定为“惯犯”,直接封禁 10 周。
  2. 自动识别局域网白名单:

    • 脚本会自动获取你当前的局域网段并加入 ignoreip,防止你在折腾服务器时把自己关在门外。

🛡️ 进一步的安全建议

除了 Fail2Ban,我还建议你考虑以下几点以达到“堡垒级”防御:

  • SSH 密钥登录:这是最有效的。一旦禁用了密码登录,Fail2Ban 对 SSH 的压力会瞬间消失。
  • 修改默认端口:将 8006 改成 18006,将 SSH 的 22 改成其他万位以上的端口。虽然不能阻挡专业攻击,但能过滤掉 99% 的脚本扫描。
  • Caddy 限制:如果你在 Caddy 后端挂载了敏感服务,可以在 Caddyfile 里增加 remote_ip 的白名单限制,或者对接 Cloudflare 的验证。
  • 定期检查状态:

    • 查看整体状态:fail2ban-client status
    • 查看被封禁的 PVE 攻击者:fail2ban-client status proxmox