fail2ban 防爆破实战:让 SSH 扫描器自动进黑名单

fail2ban 防爆破实战:让 SSH 扫描器自动进黑名单

fail2ban 教程SSH 防爆破服务器安全自动封 IP
📶 进阶 🧩 fail2ban

就算你早早禁用了密码认证、换上了 SSH 密钥登录,互联网上的自动化机器扫描器还是会天天敲击你的 22 端口。这些无休止的爆破流量不仅会刷满系统的安全日志,还会持续消耗服务器的并发连接资源。

你需要一个自动化机制,让服务器在识别到恶意试探后自动拉黑对方的网络 IP,而不是人工每天排查日志去手写防火墙规则。

安装 fail2ban:获取当前系统最新版本

fail2ban 会持续监控系统日志,匹配出异常的登录失败行为,并动态修改本地防火墙(如 iptables)以阻断恶意请求。Ubuntu 24.04 的官方软件库中提供了稳定的安装包。

sudo apt update
sudo apt install fail2ban

安装完成后,服务会自动作为后台进程注册,但默认处于禁用状态。我们可以用 systemctl 检查它的初始状态:

systemctl status fail2ban.service

输出会显示 inactive (dead),说明服务尚未激活。这是因为直接运行出厂规则容易造成意料之外的阻断,我们需要先为 SSH 服务定制防御策略。

配置 jail.local:3 分钟建立定制防御网

不要直接修改 /etc/fail2ban/jail.conf 原厂配置。软件在后续更新时会覆盖这个文件,导致你的自定义策略全部丢失。官方推荐的做法是复制一份 jail.local 用于存放本地策略。

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

使用编辑器打开 /etc/fail2ban/jail.local 文件,找到 [sshd] 区域。Ubuntu 24.04 默认使用 systemd 接管了系统日志,fail2ban 1.0.2 及以上版本的 sshd jail 必须显式指定 backend = systemd。

在文件中写入或修改以下配置块:

[sshd]
enabled = true
port = ssh
filter = sshd
backend = systemd
maxretry = 5
findtime = 10m
bantime = 10m
ignoreip = 127.0.0.1/8 192.168.1.0/24

各项参数规定了防御行为的具体边界:

  • maxretry = 5 和 findtime = 10m 限定了容忍度门槛。10 分钟内只要同一个来源 IP 连续触发 5 次认证失败,就会踩中红线。
  • bantime = 10m 规定了拉黑的时长。10 分钟的物理隔绝足以打断绝大多数脚本小子的自动化攻击节奏。
  • ignoreip 划定了绝对信任的白名单。除了本地环回地址,务必将你常用的管理 IP(如公司出口 IP 或内网跳板机网段)追加在后面,用空格分隔开。

保存配置后,激活服务并设置开机自启:

sudo systemctl enable fail2ban
sudo systemctl start fail2ban

验证拦截:查看防火墙底层阻断规则

配置生效后,fail2ban 会默默在底层创建专用的过滤链。通过打印当前系统的 iptables 规则,我们能直接看到它设下的防线。

sudo iptables -S | grep f2b

如果服务运行正常,输出会呈现如下结构:

-N f2b-sshd
-A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd
-A f2b-sshd -j RETURN

存在 -j f2b-sshd 规则,证明流量过滤已经被成功接管。当有恶意扫描器踩中 maxretry 红线时,fail2ban 会自动在这条规则链中插拔一条包含对方 IP 的 REJECT 语句。

运维速查表:用客户端命令管理黑名单

日常运维时,人工去改写底层防火墙极易引发断网事故。官方提供了 fail2ban-client 工具包,用以安全交互。

执行命令实际作用
sudo fail2ban-client status打印当前系统所有启用的防护模块(jail)列表
sudo fail2ban-client status sshd统计 sshd 模块当前的封禁总数,并列出所有处于拉黑状态的 IP 地址
sudo fail2ban-client set sshd unbanip 1.1.1.1将特定 IP 强行从 sshd 黑名单中摘除,恢复其访问权限
sudo fail2ban-client set sshd banip 1.1.1.1无视容忍度阈值,立即对指定的恶意源发起精确封禁

常见问题(FAQ)

Q:我已经全盘禁用了密码登录,只用密钥认证,还需要防爆破吗? 需要。哪怕攻击脚本猜不出你的私钥,持续高频的认证握手依然会长期挤占 SSH 守护进程的连接数,甚至拖累 CPU。把它阻挡在网络协议层能有效降低系统负载。

Q:服务启动失败,报错提示「have not found any log file for sshd jail」,这是为什么? Ubuntu 24.04 已经把传统文本日志全面迁移到了 systemd journal。检查你的 jail.local 配置文件,确认 [sshd] 区域是否漏写了 backend = systemd。

Q:由于调试错误,我不小心把自己的电脑 IP 封禁了,该怎么自救? 利用云服务商提供的 Web VNC 控制台,或是通过手机热点换一个 IP 重新连入服务器。登录后执行 sudo fail2ban-client set sshd unbanip 你的旧IP 即可解除限制。随后应当立即更新 ignoreip 参数并重启服务。

运维服务器的底线是让机器去对抗机器。部署并配置好 fail2ban、锁定 sshd 拦截规则、把管理员网段写入白名单,这三个操作把防御机制前置到了网络访问端。它省下了你每天对付垃圾流量的时间,把服务器算力留给真正的业务应用。

参考链接:

  • Fail2ban 官方文档
  • Ubuntu Server 文档