Fail2ban + MSMTP 邮件告警配置指南

Fail2ban + MSMTP 邮件告警配置指南

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 发件人地址不正确 确保 fromuser 字段一致

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?

使用 reloadrestart 命令可能导致:

  • 邮件 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. 安全建议

  1. 修改 SSH 默认端口:将 SSH 端口从 22 改为其他端口
  2. 禁用 root 登录:编辑 /etc/ssh/sshd_config,设置 PermitRootLogin no
  3. 使用 SSH 密钥认证:禁用密码登录
  4. 定期更新系统sudo yum updatesudo apt update && sudo apt upgrade
  5. 监控日志:定期检查 /var/log/fail2ban.log 和 SSH 日志
  6. 备份配置:定期备份 /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+

Skill vs MCP 对比分析 2026-01-22
Paimon 分区过期机制详解 2026-03-03

评论区