Fail2ban + MSMTP 邮件告警配置指南
目录
1. 简介
1.1 什么是 Fail2ban
Fail2ban 是一个入侵防御软件,通过监控系统日志文件来检测恶意行为(如多次 SSH 登录失败),并通过防火墙规则临时或永久封禁攻击者 IP。
1.2 什么是 MSMTP
MSMTP 是一个轻量级的 SMTP 客户端,用于在 Linux 系统中发送邮件。相比 sendmail 和 postfix,配置更简单,资源占用更少。
1.3 配置目标
- 监控 SSH 登录失败次数
- 自动封禁失败次数过多的 IP
- 通过 MSMTP 发送邮件告警
2. 环境准备
2.1 系统要求
- Ubuntu 系统(18.04+)
- Root 或 sudo 权限
- 一个可用的腾讯企业邮箱账号
2.2 安装必要软件
安装命令:
sudo apt update
sudo apt install -y fail2ban msmtp msmtp-mta bsd-mailx
2.3 验证安装
fail2ban-client --version
msmtp --version
3. MSMTP 配置
3.1 创建 MSMTP 配置文件
创建全局配置文件:
sudo vim /etc/msmtprc
3.2 配置文件内容
3.2.1 腾讯企业邮箱配置
# 默认配置
defaults
auth on
tls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile /var/log/msmtp.log
# 腾讯企业邮箱账户配置
account tencent
host smtp.exmail.qq.com
port 465
tls_starttls off
from your-email@yourdomain.com
user your-email@yourdomain.com
password your-password
# 设置默认账户
account default : tencent
注意:
- 腾讯企业邮箱使用 smtp.exmail.qq.com 作为 SMTP 服务器
- 端口 465 使用 SSL 加密(tls_starttls off),也可以使用端口 587(tls_starttls on)
- from 和 user 字段填写您的企业邮箱完整地址
- password 填写您的邮箱密码(建议开启安全登录后使用客户端专用密码)
3.3 设置文件权限
重要: MSMTP 配置文件包含敏感密码信息,必须设置严格权限:
sudo chmod 600 /etc/msmtprc
sudo chown root:root /etc/msmtprc
3.4 创建日志文件
sudo touch /var/log/msmtp.log
sudo chmod 666 /var/log/msmtp.log
3.5 配置系统邮件命令
创建符号链接,让系统的 mail 命令使用 msmtp:
sudo ln -sf /usr/bin/msmtp /usr/sbin/sendmail
sudo ln -sf /usr/bin/msmtp /usr/bin/sendmail
3.6 测试 MSMTP 配置
3.6.1 测试 MSMTP 连接
echo "Test mail from MSMTP" | msmtp --debug --from=your-email@example.com -t recipient@example.com
如果配置正确,会显示 SMTP 连接和发送过程。
3.6.2 使用 mail 命令测试
echo "Test mail content" | mail -s "Test Subject" recipient@example.com
3.6.3 发送带正文的测试邮件
cat <<EOF | mail -s "Fail2ban Test Mail" recipient@example.com
This is a test email from fail2ban server.
Server: $(hostname)
Date: $(date)
EOF
3.7 常见 MSMTP 问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
tls_trust_file: not found |
CA 证书路径错误 | Ubuntu 使用 /etc/ssl/certs/ca-certificates.crt |
authentication failed |
密码错误或未开启授权 | 检查是否使用授权码/应用专用密码 |
cannot connect to server |
网络或端口问题 | 检查防火墙,尝试使用端口 465(SSL) |
recipient rejected |
发件人地址不正确 | 确保 from 和 user 字段一致 |
4. Fail2ban 配置
4.1 备份原始配置
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.conf.bak
4.2 创建本地配置文件
重要: 不要直接修改 jail.conf,应该创建 jail.local 来覆盖默认配置:
sudo vim /etc/fail2ban/jail.local
4.3 jail.local 配置内容
[DEFAULT]
# 封禁时间(秒):1小时 = 3600秒,1天 = 86400秒
bantime = 3600
# 查找失败的时间窗口(秒):10分钟
findtime = 600
# 在 findtime 时间内允许的最大失败次数
maxretry = 5
# 发件人邮箱
sender = your-email@example.com
# 收件人邮箱(可以是多个,用逗号分隔)
destemail = admin@example.com
# 邮件发送命令(使用 msmtp)
mta = mail
# Action 配置:封禁 + 发送邮件
# action_mw = 封禁 + 发送邮件(包含 whois 信息)
# action_mwl = 封禁 + 发送邮件(包含 whois 信息和日志)
action = %(action_mwl)s
[sshd]
# 启用 SSH 监控
enabled = true
# 使用 systemd 后端(推荐用于 Ubuntu 16.04+)
backend = systemd
# 监控的端口(如果 SSH 使用非标准端口,需要修改)
port = ssh
# 日志路径
logpath = /var/log/auth.log
# 使用的 filter
filter = sshd
# 最大重试次数(覆盖 DEFAULT 设置,可选)
maxretry = 3
# 封禁时间(覆盖 DEFAULT 设置,可选)
bantime = 7200
4.4 日志路径配置说明
Ubuntu 系统日志路径:
logpath = /var/log/auth.log
验证日志路径:
ls -lh /var/log/auth.log
### 4.5 自定义邮件 Action(可选)
如果需要自定义邮件内容,可以创建自定义 action:
```bash
sudo vim /etc/fail2ban/action.d/mail-custom.conf
内容示例:
[Definition]
actionstart = echo "Fail2ban <name> jail started on $(hostname)" | mail -s "[Fail2ban] <name> Jail Started" <dest>
actionstop = echo "Fail2ban <name> jail stopped on $(hostname)" | mail -s "[Fail2ban] <name> Jail Stopped" <dest>
actioncheck =
actionban = echo "The IP <ip> has been banned for <bantime> seconds due to <failures> failed attempts in the last <findtime> seconds.\n\nServer: $(hostname)\nJail: <name>\nTime: $(date)" | mail -s "[Fail2ban] IP <ip> Banned" <dest>
actionunban = echo "The IP <ip> has been unbanned.\n\nServer: $(hostname)\nJail: <name>\nTime: $(date)" | mail -s "[Fail2ban] IP <ip> Unbanned" <dest>
[Init]
name = default
dest = root
在 jail.local 中使用自定义 action:
[sshd]
enabled = true
action = mail-custom[dest="admin@example.com"]
4.6 验证配置文件
sudo fail2ban-client -t
如果配置正确,会显示:
OK: configuration test is successful
5. 启动与测试
5.1 启动 Fail2ban
⚠️ 重要:修改配置后必须完全重启,不能只 reload!
# 停止服务
sudo systemctl stop fail2ban
# 完全重启服务
sudo systemctl start fail2ban
# 设置开机自启
sudo systemctl enable fail2ban
# 检查服务状态
sudo systemctl status fail2ban
5.2 为什么不能用 reload?
使用 reload 或 restart 命令可能导致:
- 邮件 action 配置不生效
- 新的 jail 配置未加载
- 旧的 iptables 规则残留
正确的重启流程:
sudo fail2ban-client stop
sudo systemctl stop fail2ban
sudo systemctl start fail2ban
sudo fail2ban-client start
或者直接使用:
sudo systemctl stop fail2ban && sudo systemctl start fail2ban
5.3 验证 Fail2ban 状态
5.3.1 查看所有 jail 状态
sudo fail2ban-client status
输出示例:
Status
|- Number of jail: 1
`- Jail list: sshd
5.3.2 查看 sshd jail 详细状态
sudo fail2ban-client status sshd
输出示例:
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 5
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 1
|- Total banned: 2
`- Banned IP list: 192.168.1.100
5.4 测试封禁功能
⚠️ 注意:不要在生产环境的主 IP 上测试,可能会锁住自己!
5.4.1 从另一台机器测试
从另一台机器多次尝试错误密码登录:
ssh wrong-user@your-server-ip
连续失败 3 次后(根据你的 maxretry 设置),IP 应该被封禁。
5.4.2 查看封禁日志
sudo tail -f /var/log/fail2ban.log
应该看到类似输出:
2026-02-13 10:30:45,123 fail2ban.actions [12345]: NOTICE [sshd] Ban 192.168.1.100
5.4.3 检查 iptables 规则
sudo iptables -L f2b-sshd -n -v
或者查看所有 fail2ban 链:
sudo iptables -L -n | grep f2b
5.5 测试邮件发送
5.5.1 手动触发测试邮件
封禁一个测试 IP(邮件应该会自动发送):
sudo fail2ban-client set sshd banip 1.2.3.4
解封测试 IP:
sudo fail2ban-client set sshd unbanip 1.2.3.4
5.5.2 检查邮件日志
# 检查 msmtp 日志
sudo tail -f /var/log/msmtp.log
# 检查 fail2ban 日志中的邮件相关信息
sudo grep -i mail /var/log/fail2ban.log
5.6 查看实时日志
# 实时监控 fail2ban 日志
sudo tail -f /var/log/fail2ban.log
# 实时监控 SSH 登录日志(Ubuntu)
sudo tail -f /var/log/auth.log
6. 故障排查
6.1 常见问题排查流程
6.1.1 Fail2ban 服务无法启动
# 查看详细错误信息
sudo systemctl status fail2ban -l
# 查看日志
sudo journalctl -u fail2ban -n 50
# 测试配置文件
sudo fail2ban-client -t
6.1.2 邮件未发送
步骤 1:检查 action 配置
sudo fail2ban-client get sshd actions
应该包含邮件相关的 action(如 mail-whois-lines)。
步骤 2:查看 fail2ban 日志
sudo grep -i "mail\|action" /var/log/fail2ban.log
步骤 3:测试 MSMTP
echo "Test" | mail -s "Test" your-email@example.com
步骤 4:检查 MSMTP 日志
sudo cat /var/log/msmtp.log
6.1.3 IP 未被封禁
步骤 1:检查 jail 是否启用
sudo fail2ban-client status | grep sshd
步骤 2:检查日志路径是否正确
sudo fail2ban-client get sshd logpath
步骤 3:手动测试 filter
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
步骤 4:检查失败记录
sudo fail2ban-client status sshd
6.2 常见错误及解决方案
| 错误信息 | 可能原因 | 解决方案 |
|---|---|---|
Failed to start fail2ban.service |
配置文件语法错误 | 运行 fail2ban-client -t 检查配置 |
Unable to find a corresponding IP address |
日志格式不匹配 | 检查 filter 规则,使用 fail2ban-regex 测试 |
command mail -s ... returned |
MSMTP 配置错误 | 检查 /etc/msmtprc 和权限 |
[Errno 13] Permission denied: '/var/log/fail2ban.log' |
权限问题 | sudo chmod 640 /var/log/fail2ban.log |
timed out |
邮件服务器连接超时 | 检查防火墙,尝试其他端口(587/465) |
6.3 调试模式
启用 fail2ban 调试日志:
编辑 /etc/fail2ban/fail2ban.local(如果不存在则创建):
[Definition]
loglevel = DEBUG
logtarget = /var/log/fail2ban.log
重启服务:
sudo systemctl stop fail2ban && sudo systemctl start fail2ban
6.4 完全卸载并重新配置
如果配置混乱,可以完全重置:
# 停止服务
sudo systemctl stop fail2ban
# 备份配置
sudo cp -r /etc/fail2ban /etc/fail2ban.backup
# 删除所有自定义配置
sudo rm /etc/fail2ban/jail.local
sudo rm /etc/fail2ban/jail.d/*.local
# 重新安装(可选)
sudo apt install --reinstall fail2ban
# 从本文档重新配置
7. 高级配置
7.1 配置多个收件人
在 jail.local 中:
[DEFAULT]
destemail = admin1@example.com,admin2@example.com,admin3@example.com
7.2 配置白名单 IP
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 10.0.0.5
7.3 永久封禁
[sshd]
bantime = -1
7.4 配置递增封禁时间
创建 /etc/fail2ban/jail.d/recidive.local:
[recidive]
enabled = true
filter = recidive
logpath = /var/log/fail2ban.log
action = %(action_mwl)s
bantime = 604800 ; 7 天
findtime = 86400 ; 1 天
maxretry = 3
8. 维护与监控
8.1 定期检查
添加到 crontab 每日检查:
sudo crontab -e
添加:
# 每天早上 8 点检查 fail2ban 状态
0 8 * * * /usr/bin/fail2ban-client status > /var/log/fail2ban-daily.log 2>&1
8.2 查看封禁历史
# 查看所有封禁记录
sudo zgrep "Ban" /var/log/fail2ban.log*
# 统计封禁次数最多的 IP
sudo zgrep "Ban" /var/log/fail2ban.log* | awk '{print $NF}' | sort | uniq -c | sort -rn | head -10
8.3 手动管理 IP
# 封禁 IP
sudo fail2ban-client set sshd banip 1.2.3.4
# 解封 IP
sudo fail2ban-client set sshd unbanip 1.2.3.4
# 查看当前封禁的 IP
sudo fail2ban-client status sshd
9. 安全建议
- 修改 SSH 默认端口:将 SSH 端口从 22 改为其他端口
- 禁用 root 登录:编辑
/etc/ssh/sshd_config,设置PermitRootLogin no - 使用 SSH 密钥认证:禁用密码登录
- 定期更新系统:
sudo yum update或sudo apt update && sudo apt upgrade - 监控日志:定期检查
/var/log/fail2ban.log和 SSH 日志 - 备份配置:定期备份
/etc/fail2ban/jail.local和/etc/msmtprc
10. 参考资源
- Fail2ban 官方文档:https://www.fail2ban.org/
- MSMTP 官方文档:https://marlam.de/msmtp/
- Fail2ban GitHub:https://github.com/fail2ban/fail2ban
附录 A:完整配置文件示例
A.1 /etc/msmtprc(腾讯企业邮箱示例)
defaults
auth on
tls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile /var/log/msmtp.log
account tencent
host smtp.exmail.qq.com
port 465
tls_starttls off
from alerts@yourdomain.com
user alerts@yourdomain.com
password your-password
account default : tencent
A.2 /etc/fail2ban/jail.local(完整示例)
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5
sender = alerts@yourdomain.com
destemail = admin@example.com
mta = mail
action = %(action_mwl)s
ignoreip = 127.0.0.1/8 ::1
[sshd]
enabled = true
backend = systemd
port = ssh
logpath = /var/log/auth.log
filter = sshd
maxretry = 3
bantime = 7200
将以下脚本保存为 setup-fail2ban.sh,修改邮箱配置后执行:
#!/bin/bash
# 变量配置
SENDER_EMAIL="your-email@yourdomain.com"
SENDER_PASSWORD="your-password"
RECIPIENT_EMAIL="admin@example.com"
SMTP_HOST="smtp.exmail.qq.com"
SMTP_PORT="465"
# 安装软件
sudo apt update
sudo apt install -y fail2ban msmtp msmtp-mta bsd-mailx
# 配置 MSMTP
sudo cat > /etc/msmtprc <<MSMTPEOF
defaults
auth on
tls on
tls_starttls off
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile /var/log/msmtp.log
account default
host ${SMTP_HOST}
port ${SMTP_PORT}
from ${SENDER_EMAIL}
user ${SENDER_EMAIL}
password ${SENDER_PASSWORD}
account default : default
MSMTPEOF
sudo chmod 600 /etc/msmtprc
sudo touch /var/log/msmtp.log
sudo chmod 666 /var/log/msmtp.log
# 配置 Fail2ban
sudo cat > /etc/fail2ban/jail.local <<JAILEOF
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5
sender = ${SENDER_EMAIL}
destemail = ${RECIPIENT_EMAIL}
mta = mail
action = %(action_mwl)s
[sshd]
enabled = true
backend = systemd
port = ssh
logpath = /var/log/auth.log
filter = sshd
maxretry = 3
bantime = 7200
JAILEOF
# 测试配置
sudo fail2ban-client -t
# 启动服务
sudo systemctl stop fail2ban
sudo systemctl start fail2ban
sudo systemctl enable fail2ban
echo "配置完成!请测试邮件发送:"
echo "echo 'Test' | mail -s 'Test' ${RECIPIENT_EMAIL}"
文档版本: v2.0
最后更新: 2026-02-13
适用系统: Ubuntu 18.04+