fail2ban集成邮件告警是最及时可靠的方案:在ip被封禁瞬间触发邮件通知,需配置mail-notify.conf动作及sshd.local启用,并补充pam登录成功告警脚本,确保系统mail工具与smtp正确配置。

核心思路是:用 Fail2ban 检测暴力破解行为,触发自定义动作(如调用邮件脚本),而不是等攻击成功后再通知。
Fail2ban 集成邮件告警(推荐方案)
Fail2ban 本身支持在封禁 IP 时执行外部命令,这是最及时、最可靠的告警方式——它发生在攻击被拦截的瞬间,而非登录成功后。
- 确保已安装并运行 Fail2ban:
sudo systemctl status fail2ban - 在
/etc/fail2ban/action.d/下新建文件mail-notify.conf,内容如下:
[Definition] actionstart = actionstop = actioncheck = actionban = printf "Subject: [FAIL2BAN ALERT] SSH brute force blocked\nTo: admin@example.com\n\nIP <ip> was banned at <time> after <failures> failed attempts.\nLog line: <matches>" | /usr/bin/sendmail -t actionunban = </matches></failures></time></ip>
- 在
/etc/fail2ban/jail.d/sshd.local中启用该动作:
[sshd] enabled = true filter = sshd logpath = /var/log/secure # CentOS/RHEL;Ubuntu 改为 /var/log/auth.log maxretry = 5 findtime = 600 bantime = 3600 action = mail-notify
- 重启服务生效:
sudo systemctl restart fail2ban - 测试:用错误密码多次 SSH 登录(如 6 次),检查邮箱是否收到封禁通知
补充登录成功告警(防御纵深)
即使暴力破解失败,也要防“撞库成功”。可在用户登录成功时发邮件,作为第二道防线。
- 编辑
/etc/pam.d/sshd,末尾添加一行:
session optional pam_exec.so /usr/local/bin/login-notify.sh
- 创建脚本
/usr/local/bin/login-notify.sh(需可执行):
#!/bin/bash [ "$PAM_TYPE" = "open_session" ] || exit 0 echo "User $PAM_USER logged in from $PAM_RHOST at $(date)" | \ mail -s "SSH Login Alert: $PAM_USER" admin@example.com
- 注意:此脚本不依赖 QQ 邮箱专用配置,只要系统
mail命令能发信即可(建议先用echo test | mail -s t admin@x.com测试)
邮件发送基础准备
无论用哪种告警方式,都需确保系统能稳定发信。
- 安装基础工具:
yum install mailx -y(CentOS)或apt install mailutils -y(Ubuntu) - 配置 SMTP(以 QQ 邮箱为例):
编辑/etc/mail.rc,追加:
set from=your@qq.com set smtp=smtp.qq.com:465 set smtp-auth-user=your@qq.com set smtp-auth-password=your_app_password # 不是登录密码,是QQ邮箱“SMTP授权码” set smtp-auth=login set ssl-verify=ignore
- 测试是否可用:
echo "ok" | mail -s "test" your@qq.com
关键细节提醒
避免告警失效的几个常见坑:
- Fail2ban 日志路径必须匹配真实路径:
/var/log/secure(CentOS) vs/var/log/auth.log(Ubuntu/Debian) - 邮件脚本中不要用
$HOSTNAME或$(hostname),PAM 环境下可能为空;改用$PAM_RHOST和$PAM_USER更可靠 - 封禁告警和登录告警应使用不同邮箱地址或主题前缀(如
[BAN]/[LOGIN]),便于快速区分事件性质 - 首次部署后,务必手动模拟攻击测试全流程,不能只看服务状态











