一键脚本服务器安装UFW + Fail2Ban

一键脚本服务器安装UFW + Fail2Ban

一键脚本:防 SSH 爆破 + 端口扫描自动封禁#

实现效果
 SSH 登录失败 3 次 → 封 IP
 短时间扫描多个端口 → 直接封 IP
 多次被封的 IP → 封更久(递进惩罚)
 和 UFW 联动,真正断流量
 不影响正常用户
[补充]:实测原来脚本直接执行可能会启动失败,于是添加了如果启动失败,自动禁用 portscan 再重启。

手动开放ufw端口:sudo ufw allow 14725

手动删除ufw端口:sudo ufw delete allow 14725

查询ssh连接端口 : ss -ntlp | grep ssh

查询ufw防火墙开放状态:sudo ufw status numbered

查询脚本安装后的状态:sudo systemctl status fail2ban
查询组件工作状态:fail2ban-client status

设置VPS连接ssh端口(要记得先放行端口号)

sudo nano /etc/ssh/sshd_config
然后修改
Port 2222

然后重启SSH:

sudo systemctl restart ssh 

脚本说明(你只需要改 1 个地方)

SSH_PORT="${SSH_PORT:12222}   # 改成你自己的 SSH 端口

一键脚本(保存为 security_setup.sh)

#!/usr/bin/env bash
set -euo pipefail

# =========================
# Fail2Ban + UFW 一键配置(含 portscan,适配 systemd/journald)
# 适用:Debian/Ubuntu(systemd)
# =========================

# 你要放行的 SSH 端口(按需改)
SSH_PORT="${SSH_PORT:-12222}"

echo "[INFO] SSH_PORT=${SSH_PORT}"

# 1) 安装依赖
export DEBIAN_FRONTEND=noninteractive
apt-get update -y
apt-get install -y ufw fail2ban

# 2) 配置并启用 UFW(先放行 SSH,避免把自己锁外面)
ufw allow "${SSH_PORT}/tcp" >/dev/null || true
ufw --force enable >/dev/null || true

# 3) Fail2Ban 日志目录(保险起见)
mkdir -p /var/log
touch /var/log/fail2ban.log
chmod 640 /var/log/fail2ban.log || true

# 4) 写入 portscan filter:匹配 UFW BLOCK 日志
cat > /etc/fail2ban/filter.d/portscan.conf << 'EOF'
[Definition]
failregex = .*UFW BLOCK.*SRC=<HOST>.*
ignoreregex =
EOF

# 5) 写入 jail.local(关键:portscan 使用 backend=systemd,logpath 留空)
cat > /etc/fail2ban/jail.local << EOF
[DEFAULT]
# 默认封禁策略(可按需调整)
bantime   = 7200
findtime  = 600
maxretry  = 3

# 关键:使用 systemd/journald 作为日志后端,避免 /var/log/syslog 不存在导致启动失败
backend   = systemd

# 使用 UFW 封禁(与 portscan 搭配)
banaction = ufw

[sshd]
enabled = true
port    = ${SSH_PORT}

[portscan]
enabled  = true
filter   = portscan
backend  = systemd
logpath  =
maxretry = 1
findtime = 300
bantime  = 86400

[recidive]
enabled  = true
# recidive 读 fail2ban 自己的日志即可
logpath  = /var/log/fail2ban.log
bantime  = 604800
findtime = 86400
maxretry = 3
EOF

# 6) 配置自检(Fail2Ban 自带语法检查)
echo "[INFO] fail2ban config test..."
fail2ban-client -t

# 7) 重启并做“兜底回退”:如果因为任何原因启动失败,自动禁用 portscan 再重启
echo "[INFO] restarting fail2ban..."
if ! systemctl restart fail2ban; then
  echo "[WARN] fail2ban 启动失败,自动禁用 portscan 后重试"
  # 只在 [portscan] 段落里把 enabled 改成 false
  sed -i '/^\[portscan\]/,/^\[/{s/^enabled\s*=\s*true/enabled = false/}' /etc/fail2ban/jail.local
  systemctl restart fail2ban
fi

# 8) 输出状态
echo "[INFO] fail2ban status:"
fail2ban-client ping || true
fail2ban-client status || true

echo "[INFO] Done."
echo "      - UFW: $(ufw status | head -n 1 || true)"
echo "      - SSH allowed: ${SSH_PORT}/tcp"
echo "      - Fail2Ban jails: $(fail2ban-client status 2>/dev/null | sed -n 's/.*Jail list:\s*//p' || true)"

使用方法

nano security_setup.sh
chmod +x security_setup.sh
sudo ./security_setup.sh

注意:

如果把自己 IP 封了怎么办?

解封指定 IP

sudo fail2ban-client set sshd unbanip 你的IP

直接停用

Fail2Ban sudo systemctl stop fail2ban

© 版权声明
THE END
喜欢就支持一下吧
评论 抢沙发

请登录后发表评论

    暂无评论内容