给fail2ban增加pve和http验证防护的脚本

这个脚本的基础打得很好,尤其是引入了阶梯式封禁(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}')
LOCAL_SUBNET=$(echo $LOCAL_IP | cut -d. -f1-3).0/24

cat <<EOF > /etc/fail2ban/jail.local
[DEFAULT]
# 忽略本地环回地址和检测到的局域网段
ignoreip = 127.0.0.1/8 ::1 $LOCAL_SUBNET

# --- 核心优化参数 ---
bantime  = 1d         # 初始封禁 1 天
findtime  = 1h         # 统计窗口 1 小时
maxretry = 3           # 3 次失败即封禁

# --- 阶梯式封禁 (让惯犯无处遁形) ---
bantime.increment = true
bantime.factor = 2     # 翻倍递增 (1d -> 2d -> 4d...)
bantime.maxtime = 5w   # 最高封禁 5 周
bantime.rndtime = 10m

# 使用 systemd 读取日志(现代 Linux 系统更推荐)
backend = systemd

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

[sshd]
enabled = true
port    = ssh
filter  = sshd[mode=aggressive]
# 如果你的 SSH 端口不是 22,请手动修改下方 port
# port = 2222

[proxmox]
enabled = true
port    = 8006
filter  = proxmox
# PVE 默认日志路径
logpath = /var/log/pveproxy/access.log
backend = auto
maxretry = 3

[caddy-auth]
enabled = true
port    = http,https
filter  = caddy-auth
# 注意:你需要确保 Caddy 的日志输出到了这个文件
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

# 创建 Caddy 的过滤器 (Fail2Ban 默认不带 Caddy 过滤器)
echo "正在创建 Caddy 过滤器..."
cat <<EOF > /etc/fail2ban/filter.d/caddy-auth.conf
[Definition]
# 匹配 Caddy 日志中的 401(未授权) 或 403(禁止访问) 状态码
# 假设你使用的是 JSON 格式日志或标准格式
failregex = ^.*"status":40[13].*"remote_ip":"<HOST>".*$
            ^<HOST>.*HTTP\/.* 40[13] .*$
ignoreregex =
EOF

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

echo "------------------------------------------------"
echo "安装与配置完成!"
echo "新增防护:Proxmox(8006) 和 Caddy(80/443) 认证防护。"
echo "新增机制:Recidive (针对长期骚扰者的超级封禁)。"
echo "温馨提示:请确保 Caddy 的日志已开启并记录在 /var/log/caddy/access.log"
echo "------------------------------------------------"

:light_bulb: 关键改进点说明

  1. 新增 PVE 防护 ([proxmox])
  • Fail2Ban 通常自带 proxmox 过滤器,它会监控 /var/log/pveproxy/access.log 中的登录失败记录。
  1. 新增 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 周
  1. 自动识别局域网白名单
  • 脚本会自动获取你当前的局域网段并加入 ignoreip,防止你在折腾服务器时把自己关在门外。

:shield: 进一步的安全建议

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

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