这个脚本的基础打得很好,尤其是引入了阶梯式封禁(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 "------------------------------------------------"
关键改进点说明
- 新增 PVE 防护 (
[proxmox]):
- Fail2Ban 通常自带
proxmox过滤器,它会监控/var/log/pveproxy/access.log中的登录失败记录。
- 新增 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
}
- 引入
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
- 查看整体状态: