fail2ban防爆破:自动封禁攻击IP

VPS 的 SSH 端口每天被扫描上千次。小够教你用 fail2ban 自动封禁爆破 IP,5 分钟配置好,附密钥登录的正确姿势。

我是小够。你的 VPS 上线第一天,SSH 端口就会被全世界的扫描器"光顾"——试密码、试弱口令,一天几千次是常态。今天教你用 fail2ban 自动封禁这些 IP,5 分钟配好,一劳永逸。

先看攻击有多猖獗

跑这条命令,看看你的机器正被多少 IP 骚扰:

grep "Failed password" /var/log/auth.log | wc -l

数字吓人吧?这就是不做防护的现状。fail2ban 的原理很简单:监控日志,发现某个 IP 短时间内失败次数超标,自动把它拉黑一段时间。

安装与配置

Debian/Ubuntu 一行搞定:

sudo apt install fail2ban -y

fail2ban 默认就带了 SSH 防护规则,装完即生效。想调得更严格,建个本地配置:

sudo nano /etc/fail2ban/jail.local

写入:

[sshd]
enabled = true
port = 你的SSH端口
maxretry = 5
findtime = 600
bantime = 3600

意思是:10 分钟内失败 5 次,封 1 小时。改完重启:

sudo systemctl restart fail2ban

查看封禁状态:

sudo fail2ban-client status sshd

fail2ban 之外的三层防护

fail2ban 是"事后封禁",下面三招是"事前预防",配合用效果最好:

一:改 SSH 端口。 默认 22 端口是扫描器的首选目标,改成 5 位数的高位端口,能挡掉九成以上的无脑扫描。改 /etc/ssh/sshd_config 里的 Port,记得同步改 fail2ban 配置和防火墙放行。

二:禁用密码登录,改用密钥。 这是最重要的一招:

# 本地生成密钥(本地电脑上执行)
ssh-keygen -t ed25519
# 把公钥传到服务器
ssh-copy-id -p 你的端口 user@服务器IP
# 确认密钥能登录后,关掉密码登录
sudo nano /etc/ssh/sshd_config
# 改成:
PasswordAuthentication no
PubkeyAuthentication yes
sudo systemctl restart sshd

改之前务必确认密钥能登录,否则把自己锁在门外,只能去商家面板用 VNC 救。

三:禁用 root 直接登录。 PermitRootLogin no,用普通用户+sudo。攻击者连用户名都要猜,爆破难度翻倍。

fail2ban 进阶:保护网站登录

fail2ban 不只能防 SSH,还能防网站后台爆破。以 WordPress 为例,攻击者扫 wp-login.php 试密码,同样可以自动封:

# 加到 jail.local
[wordpress]
enabled = true
filter = wordpress
logpath = /var/log/nginx/access.log
maxretry = 10
findtime = 600
bantime = 3600

再配个 filter 规则(/etc/fail2ban/filter.d/wordpress.conf):

[Definition]
failregex = ^<HOST> .* "POST /wp-login.php

Nginx/Apache 的访问日志里,POST 到登录页的 IP,10 分钟超 10 次就封。网站后台的爆破和 SSH 一个套路,fail2ban 通吃。

误封自己怎么办

手抖输错 5 次密码,把自己封了,别慌:

# 商家面板用 VNC/控制台登录(不走 SSH,不受影响)
sudo fail2ban-client set sshd unbanip 你的IP

或者把自己的 IP 加白名单,一劳永逸:

[DEFAULT]
ignoreip = 127.0.0.1/8 你的固定IP

家里是动态 IP 的,白名单写不全,那就把 maxretry 调宽松点(比如 10 次),别把自己挡在门外。

配合云防火墙:双保险

fail2ban 是"主机层"的,商家面板的"云防火墙/安全组"是"网络层"的,两层都配:

  • 云防火墙:SSH 端口只放行你的 IP 段(比如家里的宽带 IP 段),其他全关;
  • fail2ban:兜底,防的是"放行范围内"的爆破。

IP 不固定的话,云防火墙可以放行常用地区的 IP 段,或者干脆用密钥+fail2ban 也够用。两层都配,扫描器连端口都扫不到,这是最高境界。

UFW 防火墙:fail2ban 的好搭档

fail2ban 封 IP 是动态的,UFW(防火墙)是静态的,两者配合:

sudo apt install ufw -y
# 默认拒绝所有入站
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 放行 SSH(改成你的端口)、HTTP、HTTPS
sudo ufw allow 你的SSH端口/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

开防火墙前 triple-check:SSH 端口放行了没?没放行就 enable,等于把自己锁门外,只能去商家面板 VNC 救。顺序是:先 allow,再 enable。

小够的安全基线

新 VPS 到手,按这个顺序做,10 分钟:

  1. 建普通用户,配 sudo;
  2. 密钥登录配好,禁用密码登录;
  3. 改 SSH 端口,禁用 root 登录;
  4. 装 fail2ban,自动封禁爆破 IP;
  5. 开防火墙(ufw),只放行需要的端口。

做完这五步,你的 SSH 就是"扫描器看了摇头"的水平。安全这事,出事前觉得麻烦,出事后觉得晚——10 分钟,值。