OpenSMTPD 是未来的邮件服务器

Lobsters Hottest 工具

摘要

Peter N. M. Hansteen 描述了他转向 OpenSMTPD 的过程,因为 OpenBSD 7.9 放弃了 exim,他认为 OpenSMTPD 是 21 世纪的邮件服务器。

<p><a href="https://lobste.rs/s/qmvgke/opensmtpd_is_mail_server_for_future">评论</a></p>
查看原文
查看缓存全文

缓存时间: 2026/05/21 06:43

# OpenSMTPD 是未来的邮件服务器 来源:https://bsdly.blogspot.com/2026/05/opensmtpd-is-mail-server-for-future.html OpenSMTPD 配置文件图片,见 https://www.opensmtpd.org/ (https://nxdomain.no/~peter/blogpix/opensmtpd.png) *图片来源:OpenSMTPD 项目 (https://www.opensmtpd.org/)* © 2026 Peter N\. M\. Hansteen *面向 21 世纪及未来的 SMTP 邮件服务器是* OpenSMTPD (https://www.opensmtpd.org/)*,它作为* OpenBSD (https://www.openbsd.org/)* 的集成组件开发,同时也提供可移植版本。* 这是我多年一直打算做的事情,但直到有了明确的截止期限才真正付诸实施。时机已到,因为*OpenBSD 7.9 (https://www.openbsd.org/79.html)* 将移除 `exim` 软件包,`exim` 用户在升级前需要寻找替代方案。本文描述了我向 OpenBSD 自带 * OpenSMTPD (https://www.opensmtpd.org/)* 邮件服务器的迁移过程。 --- *OpenBSD 7.9 (https://www.openbsd.org/79.html) 将不再提供 `exim` 软件包,`exim` 用户需要寻找替代方案。* *OpenSMTPD (https://www.opensmtpd.org/)(`smtpd`)已包含在基础系统中。* --- 早在 2009 年 10 月,*OpenBSD 4.6 (https://www.openbsd.org/46.html)* 首次将 * OpenSMTPD (https://www.opensmtpd.org/)* 引入 * OpenBSD (https://www.openbsd.org/)* 基础系统时,我已经运行邮件服务多年。彼时我仍觉得继续使用 `exim` 作为实际邮件服务器比较方便,前端由 OpenBSD 的 `spamd` 防护,并配合 `spamassassin` 和 `clamav` 进行内容过滤。当时我确实很想尝试新的 `smtpd`,但初版邮件服务器尚未完全成熟到可以投入生产环境。 --- **注:** 本文也提供*无追踪器*但*仅限经典格式*的版本,详见此链接 (https://nxdomain.no/~peter/time_for_opensmtpd.html)。 --- 早期开发节奏相当紧张,到 2014 年 11 月 * OpenBSD 5.6 (https://www.openbsd.org/56.html)* 发布时,`smtpd` 已取代经典 `sendmail` 成为 OpenBSD 的默认邮件服务器。而我当时刚刚完成 *《The Book of PF (https://nostarch.com/book-of-pf-4e)》* 的第三版编写工作,虽有兴趣,但写作已耗尽我的精力。当然,我为自己和朋友们运行的邮件服务器配置在我看来相当复杂,迁移到其他方案需要大量准备和测试。因此,我打算将深入研究新邮件服务器的事情留待日后,我确信那一天很快就会到来。 ## 一个倾注了心血的老旧配置 关于这套配置(过去和现在)的功能,在 2012 年的文章 *《以理智邮件之名:配置 OpenBSD 的 spamd(8) 并启用辅助 MX – 完整配方 (https://nxdomain.no/~peter/in_the_name_of_sane_email.html)》(另见*带追踪器、美化版 (https://bsdly.blogspot.com/2012/05/in-name-of-sane-email-setting-up-spamd.html))中已有提示,其主要特性包括: - 两个(最初是三个)独立站点,各自拥有独立域名,其他站点作为彼此的辅助 MX,每个站点都有运行 `spamd` 的 OpenBSD 机器作为面向互联网的邮件部分。 - 这些 OpenBSD 机器执行 spamd 的 *灰名单 (https://en.wikipedia.org/wiki/Greylisting_(email))* 和 *灰名单陷阱 (https://home.nuug.no/~peter/pf/en/spamd.greytrapping.html)* 功能,同时还为另一组域名提供内容过滤服务。这些域名的邮件服务器自身并不直接暴露于互联网,而是从面向互联网的邮件服务接收经过过滤的邮件。 这套配置在 OpenBSD 的 `spamd` 前端进行灰名单和灰名单陷阱过滤,第二阶段进行内容过滤,最后将邮件转发到受保护的邮件主机。其运行效果良好,我们只需进行常规的系统与软件包升级,以及根据需要微调配置。简而言之,待服务的域名来来去去,但 `spamd`、`exim`、`clamav` 和 `spamassassin` 的组合始终稳定运行在可靠的 *OpenBSD* 平台上。 ## 是时候迁移了——等等,然后终于…… 多年来,`exim` 代码库中多次发现中度至严重的安全漏洞,但 OpenBSD 的软件包通常维护良好,补丁一般在合理时间内出现。从那时 (https://marc.info/?l=openbsd-ports&m=169608032618954&w=2) 起,到那时 (https://marc.info/?l=openbsd-ports&m=177625153728067&w=2) 止,OpenBSD 开发者和软件包维护者曾多次讨论移除或停止支持 `exim`,但直到 2026 年初才最终实施。*OpenBSD 7.9 (https://www.openbsd.org/79.html)* 将不再附带官方的 `exim` 软件包。因此,即便是我们这些坚持者,也终于到了迁移的时候。 ## 当然,先来了个假动作 其他 OpenBSD 用户一直告诉我 OpenSMTPD 已经变得相当出色,于是我决定动手。我翻出一些旧笔记,开始实验。结果那些旧笔记完全没用,原因是:*OpenSMTPD 6.4 (https://www.openbsd.org/64.html)* 版本是一次重大的代码重构,同时也改变了 `smtpd.conf` 语法的重要部分。不幸的是,搜索结果中过早出现的大多数第三方指南仍在使用旧语法,因此毫无用处——至少对于 OpenBSD 或代码保持合理同步的其他平台用户而言如此。一个有用的经验法则是:如果你读到的 * OpenSMTPD (https://www.opensmtpd.org/)* 指南日期标注在 2020 年之前,为了节省时间,请直接寻找更新的资料。 --- > *如果你读到的* OpenSMTPD (https://www.opensmtpd.org/)* 指南日期标注在 2020 年之前,为了节省时间,请直接寻找更新的资料。* --- ## 手头任务:分析 但回归正题。我要迁移的配置需要应对以下场景: - 本地域用户的入站邮件,我们是该域的主邮件交换器(MX)。 - 辅助 MX 域用户的入站邮件。 - 我们是主公有邮件交换器、但实际上仅在灰名单和过滤后转发给目标域的用户入站邮件。 - 本地域的出站邮件。 - 来自我们选择信任并允许转发的网络的出站邮件。 所有相关域名的邮件交换器(MX)记录、以及 SPF (https://en.wikipedia.org/wiki/Sender_Policy_Framework)、DKIM (https://en.wikipedia.org/wiki/DomainKeys_Identified_Mail) 和 DMARC (https://en.wikipedia.org/wiki/DMARC) 等 DNS 记录均已就位。TLS 证书及其维护机制也已存在,使用 LetsEncrypt (https://letsencrypt.org/) 工具。 将该分析转换为 `smtpd.conf` 逻辑即为: - 保留现有的 `/etc/mail/aliases` 文件,格式兼容。 - OpenSMTPD 提供表格(tables),可以是简单列表或键值对。我们的表格有: - `domains_local`:列出我们接收邮件并本地处理的域名。 - `relay_for_domains`:列出我们仅过滤、然后转发的域名。 - `domain_relays`:域名与最终目标邮件交换器的键值对列表。 - `relay_from_ips`:我们允许其转发邮件的 IP 地址和网络列表。 ## 现在是具体实现 于是我开始根据上述规范进行配置。当天下午结束时,我得出了以下结论: - 设置 TLS 是最简单的,只需简单的 `pki` 语句。 - `listen` 语句在极少的空间内完成了大部分工作。 - 通过组合 `action` 和 `match` 规则,本地投递和转发变得非常容易。 - 关于过滤:`clamav` 实际上对我的用户用处不大(用户中没有 Windows 用户)。而使用 `spamassassin` 后端的过滤选项要么无法正常工作,要么是我太笨,始终无法理解。我最终测试了一个现代替代方案 `rspamd`,它可通过 OpenBSD 软件包系统获取。 - `dkimproxy` 看起来是签署出站邮件的合适候选,因此我试用了一段时间。但在 Martijn van Duren 的建议下,我切换到 `dkimsign`,该工具在 OpenBSD 上通过软件包 `opensmtpd-filter-dkimsign` 提供。 除了已在基础系统中的 `smtpd` 外,该配置还需要软件包 `opensmtpd-filter-dkimsign` 和 `opensmtpd-filter-rspamd`。使用 `pkg_add` 安装这两个包,它们会自动拉取所有所需的依赖。 先决条件就绪后,禁用并停止 `exim`: ``` doas rcctl disable exim && doas rcctl stop exim ``` 禁用并停止 `clamav`: ``` doas rcctl disable clamav && doas clamav stop clamav ``` 禁用并停止 `spamassassin`: ``` doas rcctl disable spamassassin && doas rcctl stop spamassassin ``` 之后,你可以使用 `doas pkg_delete packagename` 移除这些软件包,并按照删除消息中的指示操作。但暂时不要删除 `exim` 配置,直到你将有用的部分复制到新的 `/etc/mail/smtpd.conf` 中。 我最终得到了以下配置(为简洁起见稍作编辑): ``` ---- /etc/mail/smtpd.conf table aliases file:/etc/mail/aliases table domains_local { "bsdly.com", "bsdly.eu", "bsdly.net", "bsdly.no", "bsdly.org", "bsdly.se", "nxdomain.no", # 以及许多其他域名,为简洁起见省略 } table relay_for_domains { "nuug.no", "blug.linux.no" # 实际 smtpd.conf 中还有更多域名,此处省略 } table domain_relays { "nuug.no" = "smtp://mx1.nuug.no", "blug.linux.no" = "smtp://mail.lamasti.net" # 实际 smtpd.conf 中还有更多域名,此处省略 } table relay_from_ips { 127.0.0.1 ::1 # 其余为虚构地址,参照 RFC5737 和 RFC3849 192.0.2.0/24 198.51.100.0/24 203.0.113.0/24 2001:DB8::/32 } filter "rspamd" proc-exec "filter-rspamd" filter dkimsign_rsa proc-exec "filter-dkimsign -d bsdly.net -s x -k /etc/mail/dkim/private.rsa.key" user _dkimsign group _dkimsign pki skapet.bsdly.net cert "/etc/mail/certificate.pem" pki skapet.bsdly.net key "/etc/mail/privkey.pem" listen on socket listen on all port 25 tls pki skapet.bsdly.net filter "rspamd" listen on all port 465 smtps pki skapet.bsdly.net filter "rspamd" listen on all port submission tls pki skapet.bsdly.net action "local_mail" mbox alias action "relay_domain" relay domain filter "rspamd" action "outbound" relay filter dkimsign_rsa match from local for local action local_mail match from any for domain <domains_local> action local_mail match from any for domain <relay_for_domains> action relay_domain match from src <relay_from_ips> for any action outbound match from local for any action outbound ---- ``` 对于辅助站点,具体的域名和 IP 地址会有所不同,你所设置的任何配置也都会有所不同。 在观察日志和消息后,我还对 `rspamd` 配置进行了小幅修改: ``` ---- /etc/rspamd/local.d/actions.conf reject = 10; # 最终拒绝 discard = 15; add_header = 6; # 标记为垃圾邮件 greylist = null; # 不进行灰名单,我们有 spamd # 自定义动作(由 force_actions 引用),无自身阈值 phishing = { flags = ["no_threshold"]; } ---- ``` 这就是整个配置。加上稍长的域名和网络列表后,我的配置净长度为: ``` $ grep -vc \# /etc/mail/smtpd.conf 104 ``` 104 行,而之前的 `exim` 配置去除注释行后为: ``` $ grep -vc \# /etc/exim/configure 380 ``` `smtpd.conf` 配置的可读性堪比 `pf.conf`,具有类似的易读性特点。 安装软件包并禁用旧服务后,随时可以启用并启动新服务。要从使用 `exim` 切换为(重新)启用 `smtpd` 作为默认邮件服务器,请运行: ``` $ doas /usr/local/sbin/exim-disable ``` 以恢复 `/etc/mailer.conf` 的原始状态。如果出现问题,你可以轻松地从 OpenBSD CVS (https://www.openbsd.org/anoncvs.html) 获取一个纯净版本。 要启用新服务,请运行: ``` $ doas rcctl enable smptpd && doas rcctl start smtpd $ doas rcctl enable redis && doas rcctl start redis $ doas rcctl enable rspamd && doas rcctl start rspamd ``` 通过监控 `/var/log/maillog`,你应该很快就能看到活动,例如: ``` $ tail -n 500 -f /var/log/maillog ``` 当你确认邮件能够正常进出并被转发到期望的目标后,即可安全移除 `exim`、`clamav` 和 `spamassassin` 软件包,并按照 `pkg_delete` 消息中的指示释放空间。 当然,还可以进行更复杂的配置,尤其是在过滤方面。但让我惊喜的是,迁移过程竟然如此简单,而且未来维护和功能增强都将非常方便。迁移过程向我证明,OpenSMTPD 产品非常稳健,正如更广泛的 OpenBSD 环境一样。将 OpenSMTPD 设为默认邮件服务器软件,无疑是 OpenBSD 项目做出的极为明智的决定之一,即使是像我这样的后来者也为之喝彩。OpenSMTPD 和 OpenBSD 的共同特点是,其开发者不仅能够从操作系统和邮件服务器组件的早期迭代中学习,还能针对已知问题提出新的、有时甚至是根本不同的解决方案,从而打造出更安全、更易用的产品。在我看来,这*就是*面向未来的邮件服务器和操作系统。 如果你有兴趣使用更多过滤器或其他过滤器配置 `smtpd`,还有不少可选方案,例如 `opensmtpd-filter-dnsbl`,它可以从你指定的源拉取 DNS 黑名单。OpenSMTPD (https://www.opensmtpd.org/) 可通过其 `-portable` 版本在多种平台上使用,包括各种 Linux 发行版和 FreeBSD (https://www.freebsd.org/) 等 BSD 系统。 我保持这个配置相对简约,主要是因为根据我的经验,执行灰名单和灰名单陷阱的 `spamd` 是为任何邮件服务提供的非常高效且低维护的外层盾牌。如果你对灰名单陷阱感兴趣,不定期更新的《十八年灰名单陷阱——怪癖终于开始奏效?》 (https://nxdomain.no/~peter/eighteen_years_of_greytrapping.html) (另见带追踪器、美化版 (https://bsdly.blogspot.com/2025/08/eighteen-years-of-greytrapping-is.html))通过其众多链接提供了远超一个长夜所能消化的阅读材料。如果你更喜欢一本涵盖更多网络主题、以 OpenBSD (https://www.openbsd.org/) 和 FreeBSD (https://www.freebsd.org/) 为平台,并详细讲解 `spamd` 的书籍,那么《The Book of PF (https://nostarch.com/book-of-pf-4e)》现在是其第四版,正好适合你。 晚安,祝你好运! 我要感谢 *Martijn van Duren* 在撰写本文时提供的有用建议。 --- *OpenSMTPD 是未来邮件服务器* © 2026 Peter N\. M\. Hansteen(发布于 2026-05-15) --- 你或许还对通过《那个暴躁的 BSD 家伙:简短阅读列表 (https://nxdomain.no/~peter/the_short_reading_list.html)》(另见此处 (https://bsdly.blogspot.com/2025/05/that-grumpy-bsd-guy-short-reading-list.html))阅读精选文章感兴趣。 ---

相似文章

本可以是X.400倍更好的电子邮件

Hacker News Top

一篇回顾文章指出,基于OSI的X.400电子邮件标准提供了比SMTP更丰富的功能——加密、日程安排、已读回执、多语言文本——却因为SMTP更易于实现而败下阵来。

使用DMA的UTF-8电子邮件:DragonFly Mail Agent

Lobsters Hottest

一份技术指南,介绍如何通过创建sendmail包装器来处理来自OpenBSD上cron的UTF-8电子邮件编码问题,该包装器在将消息传递给dma之前对非ASCII头进行编码并添加Content-Type声明。

OpenBSD 7.9 发布

Lobsters Hottest

OpenBSD 7.9 已发布,包含针对 arm64、amd64、luna88k、riscv64 等架构的平台特定改进,以及各种错误修复和增强的硬件支持。