iRedMail 1.7.4 进阶实战与运维

iRedMail 1.7.4 进阶实战与运维:DKIM/SPF/DMARC 记录生成与发布实测、iRedAdmin 加域名加用户、doveadm 改密验证、数据库备份与恢复演练、反垃圾调优入口、日志链路排障与 Fail2ban 封禁管理,全部操作在 Ubuntu 22.04 实测环境完成并附真实回显。

iRedMailiRedMailPostfixDovecotClamAVFail2banSpamAssassin邮件服务器2026/10/17

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.comTXTv=spf1 mx -all声明仅 MX 服务器可代本域发信,其余一律硬拒
_dmarc.example.comTXTv=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.logPostfix/Amavisd/Dovecot 投递主日志(排障主战场)
/var/log/dovecot/*.logdovecot.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 吃内存大户)与磁盘。

八、参考链接