
核心要点(TL;DR)
- fail2ban 可自动封禁频繁失败的 IP,有效缓解 SSH 暴力破解。
- 密钥登录比密码更安全,应禁用密码认证并强制使用密钥。
- 配置 fail2ban 需调整 jail.local 并设置合理的封禁时长。
- 加固后务必测试新连接,避免锁死自己。
痛点:SSH 暴力破解为何屡禁不止
如果你的服务器暴露在公网,SSH 端口每天都会遭受成千上万次暴力破解尝试。攻击者利用自动化工具扫描并尝试常见用户名和弱密码,一旦得手,轻则植入挖矿程序,重则数据泄露。仅靠强密码远远不够,你需要一套主动防御机制。本文将手把手教你使用 fail2ban 自动封禁恶意 IP,并配置 SSH 密钥登录彻底告别密码认证,从根源上加固服务器安全。
原理:fail2ban 如何阻断暴力破解
fail2ban 通过监控系统日志(如 /var/log/auth.log),匹配 SSH 登录失败的记录。当某个 IP 在指定时间内失败次数超过阈值,fail2ban 会自动调用防火墙(iptables/firewalld)将该 IP 封禁一段时间。这样攻击者无法持续尝试,大幅降低破解成功率。同时,密钥登录要求客户端持有私钥,几乎无法被暴力破解,两者结合能有效防护 SSH 安全。
实操一:安装并配置 fail2ban
1. 安装 fail2ban
根据系统类型执行:
# Debian/Ubuntu
sudo apt update && sudo apt install fail2ban -y
# CentOS/RHEL
sudo yum install epel-release -y && sudo yum install fail2ban -y2. 创建 jail.local 配置文件
不要直接修改 jail.conf,而是创建 jail.local 覆盖默认设置:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo vim /etc/fail2ban/jail.local在 [sshd] 部分确保启用并设置参数:
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600解释:10 分钟内失败 3 次即封禁 1 小时。可根据需要调整 bantime(秒)。
3. 启动并验证
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
sudo fail2ban-client status sshd输出应显示当前封禁的 IP 列表。若看到“Status for the jail: sshd”及“Banned IP list:”即表示运行正常。
实操二:配置 SSH 密钥登录并禁用密码
1. 生成密钥对(本地操作)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"按提示保存密钥(默认 ~/.ssh/id_rsa),可设置密码短语增强保护。
2. 上传公钥到服务器
ssh-copy-id -i ~/.ssh/id_rsa.pub user@server_ip或手动复制公钥内容到服务器 ~/.ssh/authorized_keys 文件。
3. 测试密钥登录
新开终端,尝试 ssh user@server_ip,应无需密码直接登录。确认成功后继续。
4. 修改 sshd_config 禁用密码认证
sudo vim /etc/ssh/sshd_config修改以下参数:
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
PubkeyAuthentication yes重要:修改前保持一个已连接的 SSH 会话不退出,以防配置错误被锁。
5. 重启 SSH 服务
sudo systemctl restart sshd再次测试新连接,确保密钥登录正常,密码登录被拒绝。
检查清单与对比
| 项目 | 推荐设置 | 检查命令 |
|---|---|---|
| fail2ban 状态 | 运行中,sshd 监狱启用 | systemctl status fail2ban |
| 封禁参数 | maxretry=3, bantime=3600 | grep -E 'maxretry|bantime' /etc/fail2ban/jail.local |
| 密钥登录 | PubkeyAuthentication yes | grep PubkeyAuthentication /etc/ssh/sshd_config |
| 密码登录 | PasswordAuthentication no | grep PasswordAuthentication /etc/ssh/sshd_config |
| root 登录 | PermitRootLogin prohibit-password | grep PermitRootLogin /etc/ssh/sshd_config |
完成以上步骤后,你的 SSH 服务已具备基础防护。建议定期检查 fail2ban 日志(/var/log/fail2ban.log)和 SSH 登录记录,及时发现异常。
行动建议:持续加固与监控
安全是一个持续过程。除了 fail2ban 和密钥登录,还可考虑修改 SSH 端口、限制访问 IP、启用双因素认证。对于需要更高级防护的场景,可以了解 AegisX 的入侵检测与响应能力,它能够实时监控异常登录行为并提供自动化阻断,与 fail2ban 形成互补。立即动手,让你的服务器远离暴力破解威胁。
常见问题(FAQ)
fail2ban 安装后需要修改哪些配置?
安装 fail2ban 后,主要修改 jail.local 文件(而非 jail.conf),启用 [sshd] 监狱并设置 maxretry、bantime、findtime 等参数。建议将 bantime 设为 1 小时以上,maxretry 设为 3-5 次。同时确保日志路径与系统一致,最后重启服务生效。
如何生成 SSH 密钥并部署到服务器?
在本地终端运行 ssh-keygen -t rsa -b 4096 生成密钥对,默认保存在 ~/.ssh/ 下。然后使用 ssh-copy-id user@server 将公钥上传至服务器,或手动将公钥内容追加到服务器的 ~/.ssh/authorized_keys 文件中,并设置正确权限(700 目录,600 文件)。
禁用密码登录后如何避免把自己锁在外面?
在修改 SSH 配置前,务必保持一个已连接的 SSH 会话不退出,并另开一个会话测试密钥登录。确认密钥登录成功后,再修改 /etc/ssh/sshd_config 设置 PasswordAuthentication no,然后重启 sshd 服务。如果配置错误,可通过当前会话恢复。
fail2ban 封禁的 IP 如何查看和解封?
使用 fail2ban-client status sshd 查看当前封禁的 IP 列表。解封单个 IP 可执行 fail2ban-client set sshd unbanip 。如果需要永久解封,需检查防火墙规则并手动删除,或调整 fail2ban 配置。
除了 fail2ban 和密钥登录,还有哪些 SSH 加固措施?
还可以修改默认 SSH 端口、限制用户登录(AllowUsers)、禁用 root 直接登录、使用双因素认证、配置防火墙只允许特定 IP 访问 SSH 端口,以及定期更新 SSH 服务端软件。综合使用这些措施能显著提升安全性。