这个脚本的基础打得很好,尤其是引入了阶梯式封禁(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 "------------------------------------------------"💡 关键改进点说明
新增 PVE 防护 (
[proxmox]):- Fail2Ban 通常自带
proxmox过滤器,它会监控/var/log/pveproxy/access.log中的登录失败记录。
- Fail2Ban 通常自带
新增 Caddy 防护 (
[caddy-auth]):- 过滤器创建:因为 Fail2Ban 没有内置 Caddy 规则,我在脚本里手动创建了
/etc/fail2ban/filter.d/caddy-auth.conf。它能识别 HTTP 401 和 403 错误。 - 前提条件:你需要在 Caddyfile 中配置日志输出,例如:
- 过滤器创建:因为 Fail2Ban 没有内置 Caddy 规则,我在脚本里手动创建了
Code snippet
log {
output file /var/log/caddy/access.log
}引入
recidive(累犯封禁):- 这是一个“监狱中的监狱”。如果一个 IP 在 3 天内被 Fail2Ban 封禁了 5 次,它会被判定为“惯犯”,直接封禁 10 周。
自动识别局域网白名单:
- 脚本会自动获取你当前的局域网段并加入
ignoreip,防止你在折腾服务器时把自己关在门外。
- 脚本会自动获取你当前的局域网段并加入
🛡️ 进一步的安全建议
除了 Fail2Ban,我还建议你考虑以下几点以达到“堡垒级”防御:
- SSH 密钥登录:这是最有效的。一旦禁用了密码登录,Fail2Ban 对 SSH 的压力会瞬间消失。
- 修改默认端口:将 8006 改成 18006,将 SSH 的 22 改成其他万位以上的端口。虽然不能阻挡专业攻击,但能过滤掉 99% 的脚本扫描。
- Caddy 限制:如果你在 Caddy 后端挂载了敏感服务,可以在 Caddyfile 里增加
remote_ip的白名单限制,或者对接 Cloudflare 的验证。 定期检查状态:
- 查看整体状态:
fail2ban-client status - 查看被封禁的 PVE 攻击者:
fail2ban-client status proxmox
- 查看整体状态: