在 Ubuntu 20.04 上,防止 SSH 爆破最稳妥的方案是安装 fail2ban 并启用 sshd 防护策略,通过监控认证日志自动封禁频繁尝试的 IP。
先说结论:对于暴露在公网的 SSH 服务,配置 fail2ban 是基础且必要的加固手段,能有效减少自动化脚本的骚扰。
- 先判断:确认服务器 SSH 端口是否直接暴露在公网,内网环境通常不需要。
- 优先做:安装 fail2ban 并创建 jail.local 配置文件启用 sshd 规则。
- 再验证:通过状态命令和日志确认防护策略已加载且能正常封禁。
命令速用版
sudo apt update
sudo apt install fail2ban
sudo systemctl enable fail2ban
sudo systemctl start fail2ban为什么会这样
SSH 爆破是指攻击者使用自动化脚本尝试大量用户名和密码组合来登录服务器。Ubuntu 默认的 SSH 服务本身没有频率限制,fail2ban 的作用是读取系统日志(如 /var/log/auth.log),当发现某个 IP 在短时间内失败次数超过阈值时,调用防火墙工具(如 iptables 或 ufw)将该 IP 暂时封禁。
这并不能防止所有攻击,但能大幅降低暴力破解的成功率,并减少日志噪音。公开资料中没有看到可靠的量化数据表明具体能阻挡多少比例的攻击,但它是行业通用的基础防御措施。
分步处理
1. 安装与启动
使用 apt 包管理器安装,Ubuntu 20.04 软件源中默认包含该工具。
sudo apt update
sudo apt install fail2ban安装完成后,设置开机自启并立即运行。
sudo systemctl enable fail2ban
sudo systemctl start fail2ban2. 创建配置文件
不要直接修改 /etc/fail2ban/jail.conf,因为软件更新时会覆盖该文件。应该创建 jail.local 文件覆盖默认配置。
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local3. 编辑配置
使用编辑器打开 /etc/fail2ban/jail.local,找到 [sshd] 部分。确保 enabled = true。可以根据实际情况调整 maxretry(最大重试次数)和 bantime(封禁时长,单位秒)。
[sshd]
enabled = true
port = ssh
logpath = /var/log/auth.log
maxretry = 5
bantime = 3600注意:Ubuntu 20.04 的 SSH 认证日志默认路径为 /var/log/auth.log,如果修改过 SSH 端口,需调整 port 参数。
4. 重启服务
配置修改后需要重启 fail2ban 服务使其生效。
sudo systemctl restart fail2ban怎么验证是否生效
1. 检查服务状态
使用 fail2ban-client 命令查看 sshd 规则是否激活。
sudo fail2ban-client status sshd输出中应包含 Status 为 OK,以及当前已封禁的 IP 列表(Initially 可能为 0)。
2. 查看运行日志
检查 fail2ban 自身的日志,确认没有报错且正常加载了 jail。
sudo tail -f /var/log/fail2ban.log3. 模拟测试(谨慎操作)
在另一台机器上尝试多次错误密码登录 SSH,然后回到服务器检查 status 命令中是否出现了该测试 IP。测试完成后记得手动解封,避免影响后续操作。
sudo fail2ban-client set sshd unbanip <测试 IP>常见坑
1. 把自己封禁了
配置 maxretry 过小时,自己输错密码也可能被锁。建议先设置较大的 bantime 测试,或者在配置文件中将管理 IP 加入 ignoreip 白名单。
ignoreip = 127.0.0.1/8 ::1 你的管理 IP2. 日志路径错误
不同 Linux 发行版日志路径不同,Ubuntu 使用 /var/log/auth.log,CentOS 通常是 /var/log/secure。配置错误会导致 fail2ban 无法读取日志而不工作。
3. 防火墙冲突
fail2ban 默认使用 iptables 后端。如果服务器同时使用了 ufw 或 firewalld,需确保 fail2ban 的链规则没有被覆盖。Ubuntu 20.04 上 fail2ban 通常能自动适配 ufw,但建议检查 iptables -L 确认 BAN 链是否存在。
4. 只依赖 fail2ban
fail2ban 是应用层防护,不能替代密钥认证。最安全的做法是禁用 SSH 密码登录,仅允许 SSH Key 登录,再配合 fail2ban 作为纵深防御。
参考来源
- Ubuntu Server Guide - Security, https://ubuntu.com/server/docs
- fail2ban Documentation - Configuration, https://github.com/fail2ban/fail2ban