iRedMail 1.7.4 进阶实战与运维
iRedMail 1.7.4 进阶实战与运维:DKIM/SPF/DMARC 记录生成与发布实测、iRedAdmin 加域名加用户、doveadm 改密验证、数据库备份与恢复演练、反垃圾调优入口、日志链路排障与 Fail2ban 封禁管理,全部操作在 Ubuntu 22.04 实测环境完成并附真实回显。
iRedMail 1.7.4 进阶实战与运维
目标:在一台运行中的 iRedMail 1.7.4 上完成进阶运维闭环——DKIM 公钥导出与 SPF/DMARC 记录发布、加域名加用户、改密与自助改密、数据库备份与恢复演练、反垃圾调优入口、日志排障与 Fail2ban 封禁管理。所有命令与回显均为真实环境实测(Ubuntu 22.04 + iRedMail 1.7.4,演示域 example.com,续用快速入门篇创建的 zhangsan@example.com)。
一、环境信息
- 操作系统:Ubuntu 22.04,iRedMail 1.7.4(MariaDB 后端,承接安装篇与快速入门篇同一台实测主机)
- 组件:Postfix、Dovecot(LDA/Sieve)、Amavisd + SpamAssassin + ClamAV、iRedAPD(greylisting / throttle 等插件)、Fail2ban、netdata
- 域名与主机:演示域 example.com,服务器 FQDN mail.example.com;本文实测新增测试域 test.com 与测试用户 zhangsan@example.com
- DKIM:签名密钥 /var/lib/dkim/example.com.pem,选择器 dkim(Amavisd 签名用)
- 端口:25(SMTP 外发出站检查)、19999(netdata 面板,监听 127.0.0.1 时需 SSH 隧道访问)
二、DNS 记录实战:DKIM / SPF / DMARC
2.1 导出 DKIM 公钥(实测)
公钥生成于安装阶段(/var/lib/dkim/example.com.pem,Amavisd 签名用),要发布到 DNS 用官方命令导出 TXT 值(真实回显):
$ amavisd-new showkeys
; key#1 2048 bits, s=dkim, d=example.com, /var/lib/dkim/example.com.pem
dkim._domainkey.example.com. 3600 TXT (
"v=DKIM1; p="
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA14ApmmWdPdFMB5rbXxB+"
"lFAQ51NBwwy5YDL/Xdh7ZjuLn8OfzAU6I3vVD+KSOhSE6Z8gBhGBIjyl0NHwDOQ9"
"NV0E6xVFMtV+RAgvj5BHZkExjGsKxCZw6aYonX7KMGTYyOMtwU+j5Fc5oJsphCXO"
"1XlASOB/OEaaq9lfrS/bGdhgkSdMlmeZdrGvDczjs3H7a1BfuhA/NkK6nLcNPZna"
"DfskEOyQ3bTFZ2ruTdMtTZFISepQKO9Im3MNZKiz2C2sXyg9OaTvOesAom0A8wZA"
"fD9hxdDHayVzqtPLcouSY/1eFkOAUqu8vSVa0CNaE5EVRTeeU6k9DdJ1+LB8ecUi"
"IwIDAQAB")
发布方法:在 DNS 服务商处为 dkim._domainkey.example.com 添加 TXT 记录,值即上面多行引号串拼接(去掉引号与换行)。新加域名时重跑一次 showkeys 即可看到新域的密钥段(Amavisd 配置里已为每个 vmail 域生成密钥,见配置篇 6.1 节 dkim_key 定义)。
签名已在本地投递中生效(快速入门篇日志实录:dkim_new=dkim:example.com),收信方校验依赖 DNS 发布后的公钥。
2.2 本地校验 DKIM 发布状态(实测)
DNS 记录发布后用官方自检命令验证(未发布时的真实回显):
$ amavisd-new testkeys
TESTING#1 example.com: dkim._domainkey.example.com => invalid (public key: revoked)
解读:本机 DNS 尚无该 TXT 记录,testkeys 读到"无效/撤销"状态——发布生效后重跑会输出 pass。这是 DNS 未发布阶段的预期现象,不是安装故障(生产在权威 DNS 添加记录并等 TTL 生效后复测即可)。
2.3 SPF 与 DMARC 记录
发信域还需发布两条 TXT(记录值是 iRedMail 官方推荐写法,按实际服务商控制台添加):
| 记录名 | 类型 | 值 | 作用 |
|---|---|---|---|
| example.com | TXT | v=spf1 mx -all | 声明仅 MX 服务器可代本域发信,其余一律硬拒 |
| _dmarc.example.com | TXT | v=DMARC1; p=quarantine; rua=mailto:postmaster@example.com | 收件方按策略隔离未通过 SPF/DKIM 的邮件,并把报告发回 postmaster |
配套主机记录:A(mail.example.com → 服务器 IP)、MX(example.com → mail.example.com)、rDNS/PTR(服务商处把 IP 反解到 mail.example.com,影响对方信任度)。逐项说明:SPF 用 -all 硬失败比 ~all 软失败更严,新域上线初期可用 ~all 观察报告再收紧;DMARC 的 p 从 none → quarantine → reject 逐级收紧;rua 报告邮箱建议用域管理员 postmaster。
⚠️ 演示环境说明:本文实测环境无公网权威 DNS,故 1.2 节 testkeys 输出 invalid 属预期;三条记录的正确性以 DNS 商控制台实际生效与 https://mxtoolbox.com 等在线检测为准。
三、加域名与加用户(实测)
3.1 iRedAdmin 添加新域名
管理后台 → Create Domain(表单字段实测:cn / csrf_token / domainName / form_add_domain)。用 curl 实测添加 test.com(真实回显):
$ cj=/tmp/iredadmin.cookies
$ curl -skL -b $cj "https://mail.example.com/iredadmin/create/domain" -o /tmp/domform.html -w '%{http_code}\n'
200
$ tok=$(grep -oE 'csrf_token" value="[^"]+' /tmp/domform.html | head -1 | sed 's/.*value="//')
$ curl -sk -b $cj -D - -o /tmp/adddom.html \
-d "csrf_token=$tok&domainName=test.com&form_add_domain=add_domain" \
"https://mail.example.com/iredadmin/create/domain" 2>&1 | grep -iE '^location'
location: https://mail.example.com/iredadmin/profile/domain/general/test.com?msg=CREATED
$ mysql -u root -pq1w2e3r4 -N -e "SELECT domain, active FROM vmail.domain;"
example.com 1
test.com 1
msg=CREATED 且 vmail.domain 表新增行,域即生效(可立即在其下建用户、收发信)。
3.2 加用户的三种方式
| 方式 | 场景 | 说明 |
|---|---|---|
| iRedAdmin 界面 | 少量用户 | 表单字段与密码策略见快速入门篇 2.2/2.3 节实测 |
| 官方 SQL 工具 | 批量 | /root/iRedMail-1.7.4/tools/create_mail_user_SQL.sh 生成 INSERT 语句导入 vmail 库 |
| 直接 SQL | 脚本集成 | 参照 samples/iredmail/iredmail.mysql 的表结构插入 |
批量工具实测确认存在(tools 目录实录):
$ ls /root/iRedMail-1.7.4/tools/ | grep create
create_mail_user_OpenLDAP.py
create_mail_user_OpenLDAP.sh
create_mail_user_SQL.sh
用法(按脚本头部说明):bash create_mail_user_SQL.sh example.com lisi 生成 SQL 到 stdout,核对后导入 mysql -u root -p vmail。生成的默认密码需按 2.3 节哈希格式给定(工具默认生成随机密码并打印)。
3.3 改用户密码(doveadm + SQL 实测)
生成 SSHA512 哈希、更新 vmail.mailbox、立即验证(真实回显):
$ doveadm pw -s SSHA512 -p 'N3wP@ssw0rd!2026'
{SSHA512}UrSIIfggYGb...(完整哈希串)
$ HASH=$(doveadm pw -s SSHA512 -p 'N3wP@ssw0rd!2026')
$ mysql -u root -pq1w2e3r4 -e "UPDATE vmail.mailbox SET password='$HASH' WHERE username='zhangsan@example.com';"
$ doveadm auth test zhangsan@example.com 'N3wP@ssw0rd!2026'
passdb: zhangsan@example.com auth succeeded
extra fields:
user=zhangsan@example.com
$ doveadm auth test zhangsan@example.com 'Q1w2e3r4!'
passdb: zhangsan@example.com auth failed
extra fields:
user=zhangsan@example.com
解读:新密码 auth succeeded、旧密码 auth failed(退出码 77),改密即时生效,无需重启 Dovecot。用户自助改密走 Roundcube password 插件(配置篇 5.2 节实测已启用),无需管理员介入。
四、数据库备份与恢复演练(实测)
4.1 备份脚本与产物布局
iRedMail 安装时已挂每日 3:30 的 root 计划任务(crontab 实录:30 3 * * * /bin/bash /var/vmail/backup/backup_mysql.sh)。手动触发一次(真实回显):
$ bash /var/vmail/backup/backup_mysql.sh
* Starting backup: 2026-10-17-03-14-04.
* Backup directory: /var/vmail/backup/mysql/2026/10/17.
* Backing up databases: mysql vmail roundcubemail amavisd iredadmin sogo iredapd sa_bayes.
...
* Backup completed (Success? YES).
产物按「库名-时间戳.sql.bz2」分目录存放(实测清单节选):
$ ls -lh /var/vmail/backup/mysql/2026/10/17/ | head -8
-r-------- 1 root root 495 Oct 17 03:14 2026-10-17-03-14-04.log
-r-------- 1 root root 2.7K Oct 17 03:14 amavisd-2026-10-17-03-14-04.sql.bz2
-r-------- 1 root root 2.5K Oct 17 03:14 iredadmin-2026-10-17-03-14-04.sql.bz2
-r-------- 1 root root 2.5K Oct 17 03:14 iredapd-2026-10-17-03-14-04.sql.bz2
-r-------- 1 root root ... mysql-2026-10-17-03-14-04.sql.bz2
-r-------- 1 root root ... roundcubemail-2026-10-17-03-14-04.sql.bz2
-r-------- 1 root root ... vmail-2026-10-17-03-14-04.sql.bz2
解读:覆盖 mysql / vmail(核心账号库)/ roundcubemail / amavisd(邮件统计黑白名单)/ iredadmin / iredapd / sa_bayes(SpamAssassin 贝叶斯库)全部库;同名 .log 记录本次备份明细;产物权限 400 仅 root。邮件正文本身不在数据库——备份 /var/vmail/vmail1 目录(文件级,可用 rsync/快照),两路都要做。
4.2 恢复演练(真实回显)
把 vmail 备份恢复到临时库核对完整性(不覆盖生产库,验证后删除):
$ bzfile=/var/vmail/backup/mysql/2026/10/17/vmail-2026-10-17-03-30-01.sql.bz2
$ mysql -u root -pq1w2e3r4 -e "CREATE DATABASE IF NOT EXISTS vmail_restore;"
$ bunzip2 -c "$bzfile" | mysql -u root -pq1w2e3r4 vmail_restore
$ mysql -u root -pq1w2e3r4 -N -e "SELECT COUNT(*) FROM vmail_restore.domain; SELECT COUNT(*) FROM vmail_restore.mailbox;"
1
2
$ mysql -u root -pq1w2e3r4 -e "DROP DATABASE vmail_restore;"
核对点:domain=1、mailbox=2 与备份时刻的 example.com + postmaster/zhangsan 一致,恢复链路可用。真实故障恢复流程(每行一个服务动作,先停后启):
systemctl stop postfix
systemctl stop dovecot
bunzip2 -c /var/vmail/backup/mysql/<日期目录>/vmail-<时间戳>.sql.bz2 | mysql -u root -p vmail
systemctl start postfix
systemctl start dovecot
doveadm auth test postmaster@example.com 'q1w2e3r4'
⚠️ 恢复是覆盖写:vmail 库会被备份时刻的数据整体替换,恢复后新建的用户/密码改动若晚于备份点会回退,务必先确认备份时间戳。完整迁移(换服务器)再叠加 rsync /var/vmail 与 /etc/postfix /etc/dovecot /opt/www 配置。
五、反垃圾调优入口
5.1 iRedAPD 插件开关与灰名单
插件清单(/opt/iredapd/settings.py 实测):
plugins = ["reject_null_sender", "wblist_rdns", "reject_sender_login_mismatch", "greylisting", "throttle", "amavisd_wblist", "sql_alias_access_policy", "sql_ml_access_policy"]
常用调优动作:
- 灰名单误伤:新域上线初期重要客户来信被 450 临时拒时,把发件域加入灰名单白名单(iRedAdmin → Greylisting 页可按发件域名/IP 添加),或临时从 plugins 列表移除 "greylisting" 后 systemctl restart iredapd。
- 限速:throttle 插件参数走 iRedAdmin → Throttle 页(按域/用户/发送量),无需改文件。
- 黑白名单:amavisd_wblist 插件读写 Amavisd 库的 mailaddr/wblist 表,iRedAdmin → White/Blacklist 可视化管理。
5.2 SpamAssassin 打分与 ClamAV
- 打分阈值与规则在 Amavisd 50-user + SpamAssassin 本地规则(/etc/spamassassin/local.cf),调激进阈值先看 Amavisd 库 msgs 表的历史打分分布(iRedAdmin → Quarantine/ mails 界面可看)。
- 病毒库更新计划任务 clamav-freshclam 常驻(systemctl is-active clamav-freshclam 实测 active),规则更新失败优先查 /var/log/clamav/freshclam.log。
- 自定义信任网段:Amavisd 的 MYNETS 策略组(配置篇 6.1 节实测行号 47)与 Postfix mynetworks 保持一致,内网系统投递才走 ALL_TRUSTED。
💡 技术拓展:反垃圾策略调优的三条路线对比——(1)白名单优先(本文灰名单白名单/Amavisd wblist):误杀最低、维护成本低,适合企业域间邮件;(2)阈值调优(SpamAssassin 打分上下限 + required_score):平衡型,需要持续观察 quarantine 误判样本;(3)外部评分服务(RBL/DNSBL 增删、postscreen DNSBL 站点选择):拦截源头连接,零内容开销但要选可靠黑名单源。iRedMail 默认三者叠加,调优顺序建议:先白名单止血,再看阈值,最后优化 DNSBL 组合。
六、日志排障手册
6.1 日志文件地图(Ubuntu 实测)
| 日志 | 内容 |
|---|---|
| /var/log/mail.log | Postfix/Amavisd/Dovecot 投递主日志(排障主战场) |
| /var/log/dovecot/*.log | dovecot.log、imap.log、lda.log、pop3.log、sieve.log(fail2ban dovecot 监狱引用,实测文件列表见 5.3) |
| /var/log/nginx/ | Webmail/管理后台访问与错误 |
| /var/log/clamav/freshclam.log | 病毒库更新 |
| /var/log/fail2ban.log | 封禁动作 |
6.2 投递链路排障(以一封真实邮件为例)
按 Queue-ID 顺日志三段查(快速入门篇实录的完整链路,此处复述排查口诀):
postfix 收入(Queue-ID 4j66Jz48gDz3BJfP: from=... to=<zhangsan@example.com>)
↓
amavis 过滤((01788-01) Passed CLEAN {RelayedInternal} ... queued_as: 4j66K058Pjz3BK66)
↓
postfix/pipe(4j66K058Pjz3BK66: relay=dovecot, status=sent (delivered via dovecot service))
哪段缺失查哪环:收入缺失查 postscreen 拦截(mail.log 中 NOQUEUE: reject 行)与 iRedAPD 拒绝(iredapd 日志段);过滤断点查 systemctl is-active amavis;投递失败查 dovecot lda 段与 /var/vmail 磁盘空间。队列堆积与队列清理:
$ postqueue -p
Mail queue is empty
(非空时逐条看原因,清空单封用 postqueue -i <Queue-ID> 触发重投,全部清空用 postsuper -d ALL——危险操作仅限测试环境。)
6.3 Fail2ban 封禁管理(实测)
$ fail2ban-client status
Status
|- Number of jail: 6
`- Jail list: dovecot, nginx-http-auth, postfix, pregreet, roundcube, sshd
$ fail2ban-client status dovecot
Status for the jail: dovecot
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- File list: /var/log/dovecot/imap.log /var/log/dovecot/sieve.log /var/log/dovecot/lda.log /var/log/dovecot/dovecot.log /var/log/dovecot/pop3.log
`- Actions
|- Currently banned: 0
|- Total banned: 0
解读:iRedMail 预置 6 个监狱覆盖 SSH、Webmail、IMAP/SMTP 暴破面;dovecot 监狱盯 5 个日志文件。误封解除(官方工具 support/解禁脚本亦在 tools 目录,实测目录含 fail2ban_unban_ip.sh):
$ fail2ban-client set dovecot unbanip 192.0.2.10
1
阈值调整改 /etc/fail2ban/jail.local(实测默认 [DEFAULT] bantime=3600、maxretry=5)后 systemctl restart fail2ban。
七、常见问题沉淀
Q1:外发公网邮件被对方拒收或进垃圾箱? 按序检查:25 端口出站是否被云厂商封禁(telnet 对方 MX 25);rDNS 是否反解;SPF/DKIM/DMARC 是否发布并 testkeys 通过(2.2 节);本机 IP 是否在公开黑名单(mxtoolbox blacklist 检测)。演示环境无公网 DNS 时这些项均无法达标,属环境限制。
Q2:灰名单导致首次发信延迟? greylisting 插件对陌生「发件 IP+发件人+收件人」三元组首次 450 延迟,正常几分钟后重投成功;常发域名加白(5.1 节)。
Q3:忘记 iRedAdmin 管理员密码? 用 SQL 直接更新 vmail/admin 或 iredadmin 库对应表的哈希(doveadm pw -s SSHA512 生成;SQL 后端管理员在 vmail.admin 表),或重设 postmaster。
Q4:备份文件会无限增长吗? 脚本按日期目录滚动且自带清理参数(backup_mysql.sh 保留天数默认 90,头部变量可改);邮件文件备份用独立 rsync 任务另配。
Q5:如何快速看当前服务器整体健康? netdata 面板 http://<服务器IP>:19999(实测本机 200,监听 127.0.0.1 时需 SSH 隧道访问),关注邮件队列、内存(ClamAV/Amavisd 吃内存大户)与磁盘。