一键脚本:防 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.shchmod +x security_setup.shsudo ./security_setup.sh
注意:
如果把自己 IP 封了怎么办?
解封指定 IP
sudo fail2ban-client set sshd unbanip 你的IP
直接停用
Fail2Ban sudo systemctl stop fail2ban
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END





暂无评论内容