你打开服务器日志,发现 auth.log
里满是这样的信息:
textFailed password for invalid user admin from 45.XX.XX.XX port 53720 ssh2
这些不是“误输密码”,而是来自全球各地机器人的暴力破解尝试,几分钟上百次,严重时甚至影响 SSH 稳定性和系统负载。
这种攻击虽然不一定立即成功,但长期来看是巨大的安全隐患。Fail2Ban 就是针对这类攻击的利器——实时分析日志,自动识别异常IP并临时封禁,还能邮件通知你异常行为。
下面我们一步一步搭建一个轻量高效的“SSH入侵自封锁系统”。
一、Fail2Ban 是什么?为什么适合 SSH 防护?
Fail2Ban 是一款开源轻量级安全工具:
- 会监控系统日志文件,如
/var/log/auth.log
- 匹配暴力攻击特征(如登录失败次数)
- 一旦触发设定阈值,即调用
iptables
或firewalld
封禁攻击源IP - 支持发送通知邮件、自定义脚本联动
它非常适合 VPS、轻量云主机等资源有限的服务器,无需额外代理或商业防火墙服务即可实现有效防护。
二、安装 Fail2Ban(以 Debian/Ubuntu 为例)
bashsudo apt update
sudo apt install fail2ban
安装后,它会自动创建系统服务,并默认启用 sshd 的基础防护。
三、基础配置:封禁策略设定
Fail2Ban 主配置文件为 /etc/fail2ban/jail.conf
,但推荐自定义配置写在 /etc/fail2ban/jail.local
中避免更新被覆盖。
✅ 示例配置(jail.local):
ini[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = systemd
maxretry = 5
findtime = 10m
bantime = 1h
说明:
maxretry
:失败次数阈值findtime
:计算窗口时间(10分钟内失败5次)bantime
:封禁时长,单位为秒(可设为-1
永久封禁)
四、添加邮件通知(可选但推荐)
Fail2Ban 支持触发行为后发送邮件提醒,适合你实时知道谁在尝试攻击你的服务器。
✅ 修改 /etc/fail2ban/jail.local
增加:
inidestemail = your_email@example.com
sender = fail2ban@yourdomain.com
mta = sendmail
action = %(action_mwl)s
如果你使用 Gmail 发送,建议使用
msmtp
或postfix
配置外发。
五、查看封禁情况与解封命令
✅ 查看当前被封禁的 IP:
bashsudo fail2ban-client status sshd
返回示例:
textStatus for the jail: sshd
Banned IP list: 45.88.xx.xx 185.22.xx.xx
✅ 解封某个 IP:
bashsudo fail2ban-client set sshd unbanip 1.2.3.4
六、拓展防护场景:不仅限于 SSH
Fail2Ban 还可以用来防护其他服务,如:
服务类型 | 日志路径 | 匹配对象 |
---|---|---|
Nginx 登录 | /var/log/nginx/access.log | 登录失败 / POST 攻击 |
WordPress | 使用 fail2ban-wordpress 插件规则 | wp-login 攻击频率 |
FTP/SFTP | /var/log/auth.log | 登录失败 |
邮件服务器 | /var/log/mail.log | SMTP暴力破解 |
七、安全建议与实战建议
项目 | 建议操作 |
---|---|
SSH端口 | 建议更换为非默认(如2222) |
只允许密钥登录 | 禁用密码登录,增强安全性 |
配合UFW或firewalld | 限制允许国家或固定IP范围 |
使用 fail2ban + GeoIP | 按国家封锁恶意IP(需安装额外模块) |
暴力破解不可怕,可怕的是你服务器在静静挨打却毫无反应。Fail2Ban 就像一个 24小时站岗的卫兵,帮你把坏人自动请出门外。
加上邮件通知机制,你不仅可以自动封禁,还能第一时间了解谁、何时、从哪儿试图入侵。