OpenSMTPD 7.9.0p0 介绍与选型指南
OpenSMTPD 7.9.0p0 认知与选型:OpenBSD 项目出品的极简安全 MTA(RFC 5321 服务端实现),含 ISC 许可、特权分离架构、新语法 listen/action/match 配置模型、功能特性与官方溯源数据,附 Postfix/Exim/Haraka/Maddy 量化选型对比
OpenSMTPD 7.9.0p0 介绍与选型指南
目标:讲清 OpenSMTPD 是什么、能做什么、架构与配置模型长什么样,并与 Postfix、Exim、Haraka、Maddy 等同类 MTA 做量化选型对比,帮助读者判断「什么时候该选 OpenSMTPD」。本文为认知篇,全部数据来自官方站点、官方仓库与发行版包仓库的联网溯源(查询日期 2026-10-21),命令与版本数据均标注来源。
一、环境信息
本文是联网溯源的认知篇,不依赖本地实验环境。溯源对象与来源如下:
| 项目 | 内容 |
|---|---|
| 软件名称 | OpenSMTPD(OpenBSD SMTP 守护进程的可移植版) |
| 最新稳定版 | 7.9.0p0(GitHub portable 仓库 releases,发布于 2026-09-13) |
| 官网公告版本 | 7.8 系(官网公告 7.8.0 于 2025-10-30 发布、7.8.0p1 于 2026-03-27 发布) |
| Ubuntu 22.04 (jammy) 包版本 | opensmtpd 6.8.0p2-4build1(jammy/universe,apt-cache 实查) |
| 许可证 | ISC License(官网明示「freely usable and re-usable by everyone under an ISC license」) |
| 官方站点 | https://www.opensmtpd.org/ |
| 源码仓库 | https://github.com/OpenSMTPD/OpenSMTPD/ (其他系统的 portable 版) |
| 主创人员 | Gilles Chehade、Eric Faurot(官网明示),隶属 OpenBSD Project |
💡 说明:OpenSMTPD 有两条发布线——OpenBSD 基础系统内置版随 OpenBSD 系统发布(源码在 OpenBSD CVS 的
src/usr.sbin/smtpd),其他系统(Linux 等)使用 GitHub 上的 portable 版。portable 版发布以 OpenBSD 版本为基线(如 7.9.0p0 对应「OpenBSD 7.9 errata」),版本号中的p表示 portable 补丁级(point release)。
二、软件概述
2.1 项目定位
OpenSMTPD 是 RFC 5321 定义的服务端 SMTP 协议的一个自由实现,允许普通机器之间通过 SMTP 协议交换邮件。官网原话是「A FREE implementation of the server-side SMTP protocol as defined by RFC 5321, with some additional standard extensions」。
项目的诞生动机在官网与项目宣言中写得很直白:始于对当时其他 SMTP 实现的不满(「Started out of dissatisfaction with other implementations」),目标是做一个「易于正确配置、默认即安全」的邮件守护进程,与 OpenBSD「默认安全(secure by default)」的整体哲学一脉相承。
关键定位要点:
- 纯 MTA(Mail Transfer Agent):只负责 SMTP 收发与投递(本地 Maildir/mbox、转发到上游),不提供 IMAP/POP3 收信、不提供 Webmail 管理界面——这两块需要 Dovecot 等独立组件配合。
- 配置极简:一份
smtpd.conf(默认/etc/smtpd.conf)即可描述全部行为,核心语法只有listen/action/match三类关键语句,6.4.0 起(2018 年)启用的新语法非常接近自然语言。 - 默认安全:特权分离(privilege separation)、非特权进程 chroot、默认只监听本机回环、默认拒绝向 root 投递邮件等行为都是开箱即用,无需额外加固。
2.2 版本发布节奏(实查 GitHub releases.atom,2026-10-21)
| 版本 | 发布时间(UTC) | 说明 |
|---|---|---|
| 7.9.0p0 | 2026-09-13 | 当前最新稳定版,含 OpenBSD 7.9 errata 002 与 015 |
| 7.8.0p1 | 2026-04-08 | 7.8 系补丁版(官网公告 2026-03-27) |
| 7.8.0p0 | 2025-11-04 | 7.8 系首版(官网公告 2025-10-30) |
| 7.7.0p0 | 2025-05-13 | 7.7 系 |
| 7.6.0p1 / 7.6.0p0 | 2024-10-24 | 7.6 系 |
| 7.5.0p0 | 2024-04-10 | 7.5 系 |
| 7.4.0p1 / 7.4.0p0 | 2023-10-25 / 2023-11-16 | 7.4 系 |
从上表可以读出两个事实:一是发布节奏约为「每年一个主版本、跟随 OpenBSD 半年发布周期」,二是补丁版(p1)通常在主版后数月内跟进,修复安全与正确性问题。Ubuntu 22.04 的仓库版本 6.8.0p2(2021 年代)明显落后于上游,这是发行版打包滞后,不代表上游停更——选型时应把「仓库旧版」与「上游新版」都纳入评估(详见本文第七章兼容矩阵)。
2.3 许可证与治理
OpenSMTPD 采用 ISC 许可证——与 OpenBSD 项目整体许可一致,功能上等价于简化版 BSD/MIT 许可,允许任意使用、修改与再发行,只要求保留版权声明。没有商标约束与专利条款,对商用、二进制再发行都极友好。项目治理上属于 OpenBSD Project 的一部分,由项目核心开发者(Gilles Chehade、Eric Faurot)主导,安全修复走 OpenBSD errata 通道,再同步到 portable 仓库。
三、核心架构
3.1 特权分离进程模型
OpenSMTPD 最核心的架构特征是 privilege separation(特权分离):一个 smtpd 父进程派出多个职能单一、权限最小的子进程协作完成收信流程。这是从 OpenSSH 的设计哲学移植到邮件领域的实践,目的只有一个——任何一个环节被攻破,攻击者拿到的也只是无特权沙箱,而不是整个邮件系统。
各职能进程(可在调试日志与 ps 中观察到,命名以实测观察到的 portable 版为准):
| 进程 | 职能 | 权限特征 |
|---|---|---|
| smtpd(父进程) | 监督与仲裁,绑定特权端口 25 | root,但仅做协调 |
| pony express(7.9 中亦称 dispatcher) | SMTP 会话引擎与投递执行 | 非特权 + chroot |
| queue | 队列持久化(/var/spool/smtpd) | _smtpq 用户 |
| scheduler | 投递调度与重试策略 | 非特权 + chroot /var/empty |
| lookup | 表(table)查询解析 | 非特权 + chroot /var/empty |
| control | 控制通道(smtpctl 命令接入) | 非特权 + chroot /var/empty |
| ca / crypto | TLS 证书私钥操作与加解密 | 私钥隔离,主进程不接触明文私钥 |
💡 技术拓展:特权分离是 Unix 守护进程安全设计的经典模式,同类实践对比——
实践 原理 代表实现 特权分离多进程 每个职能一个最小权限进程,攻击面隔离 OpenSSH、OpenSMTPD 单进程降权 主体逻辑运行在非特权用户下 Postfix(master+子进程组)、Nginx chroot 沙箱 进程文件系统视图限定在子树内 OpenSMTPD(全进程组合使用) capability 裁剪 仅保留必要内核 capability systemd 服务沙箱化 OpenSMTPD 属于「分离最彻底」的一档:不仅多进程降权,还叠加 chroot,且私钥单独交给 ca 进程持有。本文选型语境下采用 OpenSMTPD 自身的特权分离模型。
3.2 配置模型:listen / action / match
OpenSMTPD 6.4.0(2018 年)引入的新语法把配置从「过程式指令流」改成了「声明式三段式」,一份配置读起来像是在描述业务规则:
# 1) 监听:从哪里收信
listen on 0.0.0.0 port 25
listen on 0.0.0.0 port 587 tls-require auth <creds>
# 2) 动作:收下之后做什么
action "local" maildir alias <aliases>
action "relay" relay
# 3) 规则:什么样的信匹配到哪个动作
match from any for domain "example.org" action "local"
match auth from any for any action "relay"
三大语句族的职责边界清晰:listen 只管「收」,action 只管「怎么处理」,match 只负责「路由判断」。这相比 Sendmail 的 sendmail.mc 宏语言、Exim 的 ACL 手册式写法,学习曲线显著更平缓。
3.3 表(table)与过滤(filter)扩展机制
- 表(table):把域名、用户、凭据等查找数据抽象成「键值表」,支持三种后端——
static { }(内联)、file:(平面文件,改完smtpctl update table热加载)、db:(makemap编译的数据库),凭据表配合smtpctl encrypt生成 bcrypt 散列。 - 过滤器(filter):7.x 引入的内建过滤 DSL,可在 SMTP 各阶段(connect/helo/mail/rcpt/data/commit)按条件(
rdns、fcrdns、src、helo、auth、mail-from、rcpt-to)做disconnect/reject/junk/rewrite决策,亦可外挂进程式过滤器(proc filter)。垃圾邮件防线(RDNS/FcrDNS 校验、灰名单等)由此在 MTA 层完成。
四、功能特性
以下特性均在官方手册(man smtpd.conf / smtpd,opensmtpd.org/manual.html)与 portable 仓库中可溯源,标注查询日期 2026-10-21:
- 完整 SMTP 服务端:RFC 5321 及常见扩展——8BITMIME、ENHANCEDSTATUSCODES、SIZE、DSN、PIPELINING、STARTTLS、AUTH(PLAIN/LOGIN);支持在 25 端口做普通收信、587/465 做 Submission(
tls-require强制加密 + 表认证)。 - 投递(MDA)多样化:
maildir、mbox、lmtp(转发给 Dovecot 等)、外接 MDA 命令(mda动作);配合alias别名表与虚拟域(virtual表)支持多域名投递。 - 中继(MTA)能力:
relay动作支持via smtp://、smtp+tls://、smtp+notls://、lmtp://等上游指定,auth上游认证、helo指定 EHLO 名、src指定源地址、backup mx备份 MX 模式、tls no-verify等。 - 队列与调度:持久化队列在
/var/spool/smtpd,信封(envelope)与消息分离存储;smtpctl支持查看/暂停/恢复/重排/删除队列(show queue、pause mda、resume mda、schedule、remove),支持离线注入(offline queue,/var/spool/smtpd/offline,供 sendmail 兼容层投递本地提交)。 - sendmail 兼容层:安装后提供
sendmail、newaliases等/usr/sbin符号链接(指向smtpctl),本机程序(cron、PHPmail()等)无需改造即可继续投信。 - 加密与身份:PKI 证书声明(
pki域名 cert/key)、tls-require强制 TLS、每监听口独立证书;出站 TLS 主动升级。 - 监控与调试:
smtpctl show stats计数器、smtpctl monitor实时 TUI、smtpd -dv前台调试、smtpd -n配置语法检查、分级 trace 开关。 - 跨平台:OpenBSD 原生 + portable 版支持 Linux(Debian/Ubuntu 官方仓库打包)、FreeBSD 等其他 BSD、macOS。
明确不做的事(选型时须知晓):
- 不提供 IMAP/POP3/网页邮箱——收件人读信需 Dovecot/Cyrus 等;
- 不内置 DKIM 签名(7.x 需配合
filter dkimsign外挂或 rspamd 等前置); - 不内置反垃圾内容过滤(RSpamD/SpamAssassin 走 milter/proc-filter 集成);
- 无 Web 管理界面(管理全靠
smtpd.conf+smtpctl)。
五、快速开始(最小可用示例)
以下示例来自官方手册与发行版默认配置(opensmtpd.org/manual.html、Ubuntu jammy opensmtpd 包默认 /etc/smtpd.conf,查询日期 2026-10-21),展示 OpenSMTPD 配置的典型形态。安装步骤的完整实测流程见《Ubuntu 22.04 安装 OpenSMTPD 指南》。
发行版默认的 /etc/smtpd.conf(Ubuntu 22.04 opensmtpd 6.8.0p2 包自带):
table aliases file:/etc/aliases
listen on localhost
action "local" maildir alias <aliases>
action "relay" relay
match for local action "local"
match from local for any action "relay"
这份 6 行配置的含义:aliases 别名表从 /etc/aliases 加载;监听本机回环的 25 端口;收给本地用户的信投递到用户家目录的 Maildir 并展开别名;本机发出的对外信件直接做 DNS MX 中继。改动后用 smtpd -n 做语法检查,再 systemctl restart opensmtpd 生效。
典型提交与投递链路(本机视角):
echo "hello" | sendmail root # sendmail 兼容层提交
smtpctl show queue # 观察队列
本地用户读信位置:maildir 动作投递到 /home/<user>/Maildir/(new/cur/tmp 结构)。
六、适用场景与限制
6.1 适合的场景
- OpenBSD / 极简主义 Linux 服务器:官方原生支持、配置文件一屏读完、默认即安全,是 OpenBSD 世界的标准答案。
- 小到中型站点的 MX/SMTP 网关:收信转投 Dovecot,出站走 relay,
filterDSL 覆盖 RDNS/黑名单/限速等边缘防御。 - 中继/转发节点:
relay via+ 表认证实现 MSA/智能主机、备份 MX(relay backup mx)、域间路由。 - 嵌入式与资源受限环境:C 语言实现、内存占用小(服务常驻仅十余 MB 量级)、无解释器依赖。
- sendmail 替换:只需
sendmail命令行为兼容的场合(cron 告警、应用 mail() 调用)。
6.2 不适合的场景与限制
- 需要一站式全家桶:想要 IMAP + Webmail + DKIM + 反垃圾一体化的,直接选 Mailcow、iRedMail、docker-mailserver 这类整合套件更省事(站内对比见第七章)。
- 需要内容级反垃圾/病毒扫描原生支持:OpenSMTPD 需要外挂(rspamd 等经 proc filter 集成),不如 Postfix 的 milter 生态成熟直给。
- 高度复杂路由策略:数百条路由规则、复杂重写策略的场景,Exim 的表达力更强。
- Windows 环境:无 Windows 版本。
- 发行版仓库版本陈旧:Ubuntu 22.04 仓库仍是 6.8.0p2(2021 年代打包),如需 7.x 新特性要走源码编译或更新发行版。
七、同类选型对比
7.1 候选对象
同为 MTA/邮件服务器赛道的常见开源候选:Postfix(老牌通用 MTA)、Exim(英国剑桥出品、表达力极强的 MTA)、Haraka(Node.js 事件驱动的 SMTP 服务器)、Maddy(Go 单二进制一体化邮件服务器)、以及 OpenSMTPD 本身。本平台已有该赛道多篇实测专栏,可交叉参考:
- 《Maddy 0.9.6 介绍与选型指南》
- 《Mailcow 2026-09a 介绍与选型指南》
- 《docker-mailserver 16.0.1 介绍与选型指南》
- 《iRedMail 1.8.8 介绍与选型指南》
- 《Postal 3.3.7 介绍与选型指南》
7.2 量化对比表
数据来源与口径(查询日期 2026-10-21):GitHub 星数为 shields.io 实时徽章读取(仅对 GitHub 托管项目有效);Postfix 与 Exim 不以 GitHub 为主仓库,其事实项取自官方站点 postfix.org / exim.org;许可证取自各项目官方声明;OpenSMTPD 版本节奏取自 GitHub releases.atom(2.2 节同源)。
| 维度 | OpenSMTPD 7.9.0p0 | Postfix 3.x | Exim 4.9x | Haraka 3.x | Maddy 0.9.6 |
|---|---|---|---|---|---|
| 实现语言 | C | C | C | Node.js (JavaScript) | Go |
| 许可证 | ISC | IPL(IBM Public License)/ EPL 过渡 | GPL | MIT | MIT |
| 出品方/维护者 | OpenBSD Project(Gilles Chehade、Eric Faurot) | Wietse Venema(社区维护) | University of Cambridge / Exim 社区 | 社区(Nodemailer 生态) | foxcpp(个人主导,社区贡献) |
| GitHub 星数(shields.io,2026-10-21) | 586 | —(主仓库不在 GitHub) | —(主仓库不在 GitHub) | 5.6k | 6.1k |
| 版本节奏 | 随 OpenBSD 半年周期,年均一个主版 | 持续小步发版 | 持续发版 + 定期安全版 | 按需发版 | 按需发版 |
| 配置复杂度 | 低(声明式三段式,入门小时级) | 中(main.cf 参数多但默认可用) | 高(ACL/router/transport 手册级学习成本) | 中(JS 插件式) | 低(TOML,单文件) |
| 默认安全设计 | 特权分离 + 全进程 chroot + 私钥隔离 | 分层多进程 + 降权 | 需自行加固项较多 | 事件驱动沙箱有限 | 单进程,常规降权 |
| IMAP/收信集成 | 无(配 Dovecot/LMTP) | 无(配 Dovecot/LMTP) | 无 | 无(纯 SMTP) | 内置 IMAP |
| DKIM 签名 | 外挂 filter | 外挂(milter/opus.opendkim) | 原生支持 | 插件 | 内置 |
| Web 管理 | 无 | 无(第三方面板) | 无 | 无(有管理插件) | 无 |
| 适用规模 | 小型/中转/嵌入式 | 小到超大型、全场景通用 | 中大型、复杂路由 | 高并发消息网关/营销投递 | 个人/小型自托管 |
7.3 选型解读
关键差异与取舍逻辑如下:
- 要「默认安全 + 配置最省心」的纯 MTA:OpenSMTPD 与 Maddy 是两个最低学习成本选项。OpenSMTPD 胜在 OpenBSD 出品的特权分离设计与 sendmail 兼容层,Maddy 胜在单二进制自带 IMAP。如果收信端本来就要部署 Dovecot,OpenSMTPD + Dovecot 的组合分工最清晰。
- 要「生态与人才储备」:Postfix 仍是企业 Linux 的事实默认(RHEL/Ubuntu 默认 MTA),milter 生态(rspamd/OpenDKIM)开箱即用,运维招聘匹配度最高。OpenSMTPD 在 Linux 生态属「小众但干净」的选择。
- 要「复杂路由与策略表达力」:Exim 的 ACL/rewrite 体系无可替代,但学习成本也最高。
- 要「Node.js 生态的收信网关」:Haraka 是异步 I/O + 插件体系,适合营销/事务邮件投递平台做前端接入层( Postal 即此类架构)。
- 个人自托管一体化:Maddy(单二进制)或 Mailcow/iRedMail/docker-mailserver(容器化全家桶)更合适,OpenSMTPD 需要 DIY 组装收信侧。
一句话结论:OpenSMTPD 适合把「SMTP 收发」这一件事做到极简与极安全的团队;一旦诉求扩展到「邮件全家桶」或「复杂策略路由」,就该转向整合套件或 Postfix/Exim。
八、参考链接
- OpenSMTPD 官方站点(项目介绍、版本公告):https://www.opensmtpd.org/
- 项目目标宣言:https://www.opensmtpd.org/goals.html
- 官方手册页索引:https://www.opensmtpd.org/manual.html
- portable 版源码与发布历史:https://github.com/OpenSMTPD/OpenSMTPD/releases
- smtpd.conf 手册(OpenBSD 版):https://man.openbsd.org/smtpd.conf
- OpenSMTPD 7.9.0p0 发布说明:https://github.com/OpenSMTPD/OpenSMTPD/releases/tag/7.9.0p0
- Ubuntu jammy opensmtpd 包信息:https://packages.ubuntu.com/jammy/opensmtpd
- 站内交叉参考:《Maddy 0.9.6 介绍与选型指南》、《Mailcow 2026-09a 介绍与选型指南》、《docker-mailserver 16.0.1 介绍与选型指南》、《iRedMail 1.8.8 介绍与选型指南》、《Postal 3.3.7 介绍与选型指南》、本专栏《Ubuntu 22.04 安装 OpenSMTPD 指南》与《OpenSMTPD 7.9 配置参数详解》。