DragonFly MTA v0.14 安装指南
DragonFly MTA v0.14 安装指南:无官方镜像与 Compose 的前提下,发行版包(0.13-1build1)与源码构建 v0.14 双形态实测,含 setgid/setuid 权限模型、cron 冲刷任务、三级验收(本地投递/中继对拍/队列退信)与五条排障实录。
DragonFly MTA v0.14 安装指南
本文为部署篇。dma(DragonFly Mail Agent)不提供官方容器镜像,也没有官方 Compose 编排,它的正确安装形态就是裸机/发行版包安装,本文以实测记录两种形态:发行版包(Ubuntu 22.04 仓库版 0.13-1build1)与源码构建(上游最新稳定版 v0.14,2025-11-21 发布),并给出三级验收清单。文中所有命令与回显均来自 2026-10-25 的实机操作。
一、两种安装形态怎么选
| 形态 | 版本 | 适合谁 | 特点 |
|---|---|---|---|
发行版包 apt install dma | 0.13-1build1(Ubuntu 22.04) | 绝大多数生产主机 | 自动配好 cron 冲刷、目录、权限,零心智负担 |
| 源码构建 v0.14 | 上游最新 | 需要 v0.14 特性(如 Received 头带主机名)或自定义编译 | 装到 /usr/local,与发行版包可共存,PATH 决定谁生效 |
先说结论:没有特殊理由就用发行版包。dma 是一个只有数万字节级别的 C 程序,0.13 与 0.14 的行为差异极小(版本差异见第三节实测)。
二、形态一:发行版包安装(实测 Ubuntu 22.04)
2.1 安装
apt update
apt install dma
安装完成后用包管理器确认版本与状态:
# dpkg -s dma | grep -E '^(Package|Version|Status)'
Package: dma
Status: install ok installed
Version: 0.13-1build1
2.2 装了什么:一套 sendmail 兼容链接 + 一个 setuid 助手
这是 dma 安装后最值得看一眼的东西——它把自己伪装成了 sendmail 体系:
# ls -la /usr/sbin/dma /usr/sbin/sendmail /usr/bin/mailq /usr/bin/newaliases /usr/lib/sendmail
lrwxrwxrwx 1 root root 11 Nov 23 2021 /usr/bin/mailq -> ../sbin/dma
lrwxrwxrwx 1 root root 11 Nov 23 2021 /usr/bin/newaliases -> ../sbin/dma
lrwxrwxrwx 1 root root 3 Nov 23 2021 /usr/lib/sendmail -> ../sbin/dma
-rwxr-sr-x 1 root mail 72072 Nov 23 2021 /usr/sbin/dma
lrwxrwxrwx 1 root root 3 Nov 23 2021 /usr/sbin/sendmail -> dma
要点:
sendmail、mailq、newaliases全部是指向 dma 的符号链接——cron、监控、各类软件里「默认调 sendmail 发信」的路径无需任何改造;/usr/sbin/dma权限为rwxr-sr-x root mail,**setgid 位(s)**是整个投递体系的根基:任何普通用户执行 dma 时,有效组自动切到mail,从而获得写队列目录与投递 mbox 的能力,不需要把用户加进mail组(实测:新建用户未加入mail组,直接发信成功);- 真正的 setuid 只有一处——本地投递助手:
# ls -la /usr/lib/dma/dma-mbox-create
-rwsr-xr-- 1 root mail 14640 Nov 23 2021 /usr/lib/dma/dma-mbox-create
它以 root 身份运行,只为「以收件人身份安全地创建/打开 mbox」这一件事,权限面被刻意压到最小。
2.3 发行版自带的队列冲刷 cron
Debian/Ubuntu 包安装时注册了一个每 5 分钟的冲刷任务,这是 dma「失败重试」机制的载体:
# cat /etc/cron.d/dma
# Flush the dma mail transfer agent's queue every five minutes.
#
*/5 * * * * root [ -x /usr/sbin/dma ] && /usr/sbin/dma -q
2.4 目录与权限基线
# ls -ld /var/spool/dma /var/mail; grep '^mail' /etc/group
drwxrwsr-x 1 root mail 4096 Oct 25 01:08 /var/mail
drwxrwsr-x 2 root mail 4096 Oct 25 01:17 /var/spool/dma
mail:x:8:
两个目录都是 setgid(s),保证新落盘的队列文件与 mbox 归 mail 组。如果接手一台手工装过 dma 的机器,先核对这四个权限点:/usr/sbin/dma 的 setgid、dma-mbox-create 的 setuid、两个目录的 2775/2770 语义。
三、形态二:源码构建 v0.14
3.1 构建依赖与下载
apt install gcc make libssl-dev curl
cd /opt
curl -sL -o dma-0.14.tar.gz https://github.com/corecode/dma/archive/refs/tags/v0.14.tar.gz
sha256sum dma-0.14.tar.gz
tar xzf dma-0.14.tar.gz && cd dma-0.14
本次实测下载产物(供校验比对):
# sha256sum /opt/dma-0.14.tar.gz
a36e77a59dd288a582dbeed7166ac4212e39120323bac75c74d7923e1d7b63e8 /opt/dma-0.14.tar.gz
# ls -la /opt/dma-0.14.tar.gz
-rw-r--r-- 1 root root 37572 Oct 25 01:16 /opt/dma-0.14.tar.gz
3.2 编译与安装
make 只需数秒。安装时把目标全部指定齐,一次拿到 sendmail/mailq 链接与 spool 目录(实测逐行回显):
# make install sendmail-link mailq-link install-spool-dirs install-etc
install -p -d /usr/local/sbin
install -p -d /usr/local/share/man/man8 /usr/local/lib
install -p -m 2755 -o root -g mail dma /usr/local/sbin
install -p -m 4754 -o root -g mail dma-mbox-create /usr/local/lib
install -p -m 0644 dma.8 /usr/local/share/man/man8/
cd /usr/local/sbin && ln -s dma sendmail
cd /usr/local/sbin && ln -s dma mailq
install -p -d -m 2775 -o root -g mail /var/spool/dma
install -p -d -m 2775 -o root -g mail /var/mail
install -p -d /etc/dma
Not overwriting /etc/dma/dma.conf.
Not overwriting /etc/dma/auth.conf.
注意最后两行:make install 不会覆盖已存在的 /etc/dma/ 配置,升级时配置是安全的。
3.3 与发行版包共存:PATH 决定谁生效
源码版装到 /usr/local/sbin,通常在 PATH 中先于 /usr/sbin,因此会遮蔽发行版包:
# command -v dma
/usr/local/sbin/dma
# ls -la /usr/local/sbin/
total 104
drwxr-xr-x 1 root root 4096 Oct 25 01:16 .
drwxr-xr-x 1 root root 4096 Sep 30 02:05 ..
-rwxr-sr-x 1 root mail 86448 Oct 25 01:16 dma
lrwxrwxrwx 1 root root 3 Oct 25 01:16 mailq -> dma
lrwxrwxrwx 1 root root 3 Oct 25 01:16 sendmail -> dma
版本归属可以靠 Received 头一眼分辨——0.13 的头不带主机名,0.14 带(同一台主机两种二进制的实测对比):
# deb 包 v0.13 投出的信
by mail.example.net (DragonFly Mail Agent v0.13);
# 源码 v0.14 投出的信
by mail.example.net (DragonFly Mail Agent v0.14 on mail01);
实测中有一个隐蔽点:cron 任务
/etc/cron.d/dma写死的是/usr/sbin/dma -q,装了源码版后冲刷的仍是 0.13。若要统一到 0.14,建议apt remove dma后保留源码版,并自建 cron 指向/usr/local/sbin/dma -q。
3.4 回退
源码版回退即删除 /usr/local/sbin/dma mailq sendmail 与 /usr/local/lib/dma-mbox-create、/usr/local/share/man/man8/dma.8,配置与队列在 /etc/dma、/var/spool/dma,不受影响。
四、初始化配置五件套
装完只是第一步,dma 需要「身份 + 去向 + 凭据 + 别名」四类信息才能干活。以下为本系列实验机的最终生效配置,可直接作为最小可用模板:
# cat /etc/mailname
mail.example.net
# cat /etc/dma/dma.conf
SMARTHOST smtp.relay.internal
PORT 8025
SECURETRANSFER
STARTTLS
AUTHPATH /etc/dma/auth.conf
MAILNAME /etc/mailname
# cat /etc/dma/auth.conf
admin|smtp.relay.internal:q1w2e3r4
# ls -la /etc/dma/
-rw-r----- 1 root mail 35 Oct 25 01:07 auth.conf
-rw-r----- 1 root mail 119 Oct 25 01:14 dma.conf
/etc/mailname:本机对外主机名(一行一个域名)。不配也可以,dma 会退回gethostname()的结果,但邮件头里的域名会变得不可控,务必显式配置;auth.conf格式为用户名|中继主机:密码,实测权限640 root:mail,比默认的 600 宽松一级是组内排障需要,保持root:mail属主不变;- 演示凭据
admin / q1w2e3r4为实验账号,生产环境请替换为中继服务商发放的真实 SMTP 凭据; - 别名与冲刷任务见上一篇介绍与 《DragonFly MTA v0.14 配置参数详解》(发布后以实际 slug 为准)。
五、三级验收清单
5.1 一级验收:本地投递
printf 'From: root@mail.example.net\nTo: root\nSubject: local-delivery-test-01\n\nhello\n' | sendmail root
tail -10 /var/mail/root
mbox 中应出现带 dma 签名的完整头(实测首封信的头部原文):
From root@mail.example.net Sun Oct 25 01:04:13 2026
Received: from root (uid 0)
(envelope-from root@mail.example.net)
id 4a47cd
by mail.example.net (DragonFly Mail Agent v0.13);
Sun, 25 Oct 2026 01:04:13 +0000
From: root@mail.example.net
To: root
Subject: local-delivery-test-01
Date: Sun, 25 Oct 2026 01:04:13 +0000
5.2 二级验收:外发中继(含 TLS 与认证)
对端中继的会话日志是唯一可信的验收依据。本次实测在中继侧抓到的关键行:
[01:16:32] AUTH accepted: mechanism=LOGIN login=b'admin'
[01:16:32] session encrypted(TLS)={... 'cipher': ('TLS_AES_256_GCM_SHA384', 'TLSv1.3', 256) ...}
[01:16:32] MAIL FROM: root@mail.example.net
三行分别证明:AUTH LOGIN 按配置生效、TLSv1.3 加密协商成功、信封发件人来自 MAILNAME 域。若手头没有现成中继,临时用一个开 STARTTLS 的测试接收器对拍即可(同网段任意主机监听一个高位端口)。
5.3 三级验收:队列与退信
制造一次失败,确认队列可见、退信可达:
# mailq
ID : 4a496d.58a74b63d200
From : root@mail.example.net
To : ops@example.com
投递彻底失败后,本地 postmaster 链条会收到退信(实测 admin 邮箱中的原文节选):
From MAILER-DAEMON Sun Oct 25 01:16:33 2026
Received: from MAILER-DAEMON
id 4a6c4c
by mail.example.net (DragonFly Mail Agent v0.13);
Sun, 25 Oct 2026 01:16:33 +0000
X-Original-To: <ops@example.com>
From: MAILER-DAEMON <>
To: root@mail.example.net
Subject: Mail delivery failed
...
There was an error delivering your mail to <ops@example.com>.
SMTP login to smtp.relay.internal failed
5.4 顺手确认 syslog
装好 rsyslog 的主机上,dma 的每一步都会进 /var/log/mail.log(实测原文,可看到「识别 STARTTLS → 认证 → 投递成功」全链路):
Oct 25 01:17:00 mail01 dma[4a6c2b]: new mail from user=root uid=8 envelope_from=<root@mail.example.net>
Oct 25 01:17:00 mail01 dma[4a6c2b]: mail to=<ops@example.com> queued as 4a6c2b.5889c3198200
Oct 25 01:17:00 mail01 dma[4a6c2b.5889c3198200]: <ops@example.com> trying delivery
Oct 25 01:17:00 mail01 dma[4a6c2b.5889c3198200]: using smarthost (smtp.relay.internal:8025)
Oct 25 01:17:00 mail01 dma[4a6c2b.5889c3198200]: trying remote delivery to smtp.relay.internal [10.89.56.2] pref 0
Oct 25 01:17:00 mail01 dma[4a6c2b.5889c3198200]: Server greeting successfully completed
Oct 25 01:17:00 mail01 dma[4a6c2b.5889c3198200]: Server supports STARTTLS
Oct 25 01:17:00 mail01 dma[4a6c2b.5889c3198200]: Server supports LOGIN authentication
Oct 25 01:17:00 mail01 dma[4a6c2b.5889c3198200]: SSL initialization successful
Oct 25 01:17:00 mail01 dma[4a6c2b.5889c3198200]: using SMTP authentication for user admin
Oct 25 01:17:00 mail01 dma[4a6c2b.5889c3198200]: <ops@example.com> delivery successful
六、安装期常见坑(实测沉淀)
- 以为它该监听 25 端口。装完
ss -ltn看不到 dma 是正常的——它从不监听网络端口,这不是故障。 /etc/mailname缺失。Debian 系软件约定俗成读这个文件,dma 不读它时退回机器 hostname,导致发件域变成root@localhost之类的脏值;先写 mailname 再配MAILNAME。- auth.conf 权限过宽。写成 644 时凭据对全员可读;按
640 root:mail收紧。 - 只有 deb 又装了源码版后 cron 冲刷「失效」。cron 仍调
/usr/sbin/dma(0.13),新邮件用/usr/local/sbin/dma(0.14)注入,版本混用本身不报错但排障时会干扰判断,按 3.3 节统一即可。 - 队列冲刷无响应先查锁。
dma -q静默退出 0 但队列不清空,几乎都是上一轮投递进程还活着并持有队列文件锁(connect 到不可达地址时能挂几分钟)。ps -ef | grep dma找到残留进程 kill 后再冲刷,实测秒级恢复——完整排障实录见 CLI 篇。
七、卸载
# deb 包
apt remove --purge dma # 加 --purge 连 /etc/dma 一起清
# 源码版
rm /usr/local/sbin/dma /usr/local/sbin/sendmail /usr/local/sbin/mailq \
/usr/local/lib/dma-mbox-create /usr/local/share/man/man8/dma.8
# 队列与邮箱按需保留或清理
rm -rf /var/spool/dma /etc/dma
参考来源(查询日期:2026-10-25)
- 上游仓库与安装目标(Makefile):https://github.com/corecode/dma
- v0.14 tarball 校验值实测采集于构建当日
- Debian/Ubuntu 包信息:https://packages.debian.org/search?keywords=dma
- 站内相关:《DragonFly MTA v0.14 介绍与选型指南》