

























Mox 一体化自托管邮件服务,摒弃传统邮件系统依赖众多组件拼装的复杂架构,通过单一二进制文件实现 简单、安全、现代 且真正 去中心化 的邮件服务。
核心功能特性
此外,它的资源占用极低,1vCPU、512MB RAM 即可流畅运行。

本文假设你已具备电子邮件托管的基础知识,并对 DNS 记录及邮件等基本协议有初步的了解。
选择开放邮件端口并支持 反向 DNS 解析 (rDNS) 的云服务提供商,本文使用 Netcup 的 VPS nano G11s 部署,月付仅需 13.21 元。
A/AAAA 记录分别指向服务器 IPv4/IPv6sudo hostnamectl set-hostname via.moe
sudo systemctl restart systemd-hostnamed
确保 /etc/hosts 类似这样:
127.0.0.1 localhost
# 公网 IPv4/IPv6
<IPv4 地址> via.moe
<IPv6 地址> via.moe
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
除了 SSH 端口外,Mox 需要另外开放以下端口(均为 TCP 协议)
| 端口 | 用途 |
|---|---|
80 | HTTP/ACME |
443 | HTTPS |
25 | SMTP |
465 | SMTPS |
993 | IMAP |
对于现代 Linux 操作系统,不再推荐使用 iptables + UFW 来管理网络防火墙,请考虑迁移到 nftables。
参考阅读: 配置 nftables 防火墙教程 ,下面是一个示例 nftables 配置文件:
#!/usr/sbin/nft -f
# 用途:仅用于 Mox 邮件服务 + SSH
# 开放端口:51973(SSH), 80, 443, 25, 465, 993
# 清空现有规则
flush ruleset
table inet filter {
# ============================================================
# INPUT 链:处理入站流量
# ============================================================
chain input {
# 规则外流量拒绝
type filter hook input priority filter; policy drop;
# 放行已建立连接
ct state established, related accept
# 丢弃无效包
ct state invalid drop
# 允许回环接口
iif "lo" accept
# 允许 IPv6 NDP
ip6 nexthdr icmpv6 icmpv6 type { nd-neighbor-solicit, nd-neighbor-advert, nd-router-advert } accept
# 允许 ICMP (速率限速)
ip protocol icmp limit rate 4/second accept
ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate 4/second accept
# 允许 SSH 服务(修改实际的端口号)
tcp dport 22122 accept
# 4. 允许 Mox 邮件与 Web 服务
# 80, 443: 用于 Mox Webmail 界面及自动申请 SSL 证书 (ACME)
# 25: SMTP 接收外域邮件 (必须全球开放)
# 465: SMTPS 客户端发信
# 993: IMAPS 客户端收信
tcp dport { 25, 80, 443, 465, 993 } accept
}
# ============================================================
# FORWARD 链:转发流量
# ============================================================
chain forward {
type filter hook forward priority filter; policy drop;
}
# ============================================================
# OUTPUT 链:出站流量
# ============================================================
chain output {
# 默认允许所有出站
type filter hook output priority filter; policy accept;
}
}
Mox 原生支持 RFC 标准的 DANE 和 MTA-STS ,这是现代邮件服务必备的安全特性。启用 DANE 必须先为域名开启 DNSSEC 保护。
若不清楚如何操作,建议查阅域名服务商帮助手册,或参考 Cloudflare DNSSEC 指南 。
首次设置后建议验证一下 DNSSEC 效果,可使用 DNSViz
在线工具,或 delv 命令:
delv via.moe
; fully validated
via.moe. 300 IN A <IP>
via.moe. 300 IN RRSIG A 13 2 300 20260118172803 20260116152803 34505 via.moe. /sSl/<…………签名…………>
由于 Linux 自带的 systemd-resolved 不支持本地 DNSSEC 解析,我们需要部署 Unbound 作为本地递归 DNS 服务。
Unbound 是一款高效的递归型 DNS 解析工具,主打隐私安全以及对现代开放标准的支持,在 DNSSEC 验证方面表现出色。
安装所需软件包:
sudo apt install bind9-dnsutils \
unbound \
dns-root-data \
unbound-anchor
设置信任锚点及权限
sudo unbound-anchor -a /var/lib/unbound/root.key || true
sudo chown unbound:unbound /var/lib/unbound/root.key
备份默认配置
sudo cp -r /etc/unbound/unbound.conf.d /etc/unbound/unbound.conf.d.bak
新建配置文件
sudo vim /etc/unbound/unbound.conf.d/local-resolver.conf
示例如下:
server:
# 只监听 localhost(防止公网暴露)
interface: 127.0.0.1
# 如果服务器禁用 IPv6,可注释掉此行并加 do-ip6: no
interface: ::1
# 端口默认 53,无需改
port: 53
do-ip4: yes
do-ip6: yes # 如果无 IPv6,改为 no
# 只允许本地访问(Mox 只需本地查询)
access-control: 127.0.0.0/8 allow
access-control: ::1/128 allow
# 其他 hardening(提升安全和隐私)
harden-dnssec-stripped: yes
harden-referral-path: yes
qname-minimisation: yes
use-caps-for-id: yes
aggressive-nsec: yes
# 根提示(Debian 包已提供)
root-hints: "/usr/share/dns/root.hints"
# 允许处理较大的 DNSSEC 数据包(避免截断导致的验证失败)
edns-buffer-size: 1232
# 隐私隐藏
hide-identity: yes
hide-version: yes
# chroot 和用户(Debian 默认已设,无需重复)
# chroot: "/var/lib/unbound"
# username: "unbound"
# 如果想禁用 remote-control(可选,如果你不用 unbound-control 命令)
# remote-control:
# control-enable: no
推荐设置
cat <<EOF >/etc/unbound/unbound.conf.d/ede.conf
server:
ede: yes
val-log-level: 2
EOF
检查配置
禁用 systemd-resolved 服务
sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved
sudo systemctl mask systemd-resolved
sudo rm /etc/resolv.conf
# 根据需要选择是否启用 IPv6 支持
sudo bash -c 'cat << EOF > /etc/resolv.conf
nameserver 127.0.0.1
nameserver ::1
EOF'
# 锁定文件编辑
sudo chattr +i /etc/resolv.conf
# 若需要解锁
sudo chattr +i /etc/resolv.conf
启动 Unbound 服务
sudo systemctl daemon-reload
sudo systemctl start unbound
sudo systemctl enable unbound
sudo systemctl status unbound
检查监听状态
sudo ss -tulpn | grep :53
# 就像这样
udp UNCONN 0 0 127.0.0.1:53 0.0.0.0:* users:(("unbound",pid=770,fd=3))
udp UNCONN 0 0 [::1]:53 [::]:* users:(("unbound",pid=770,fd=5))
tcp LISTEN 0 256 127.0.0.1:53 0.0.0.0:* users:(("unbound",pid=770,fd=4))
tcp LISTEN 0 256 [::1]:53 [::]:* users:(("unbound",pid=770,fd=6))
测试 DNS 递归服务器
dig blog.dejavu.moe
; <<>> DiG 9.20.15-1~deb13u1-Debian <<>> blog.dejavu.moe
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51736
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;blog.dejavu.moe. IN A
;; ANSWER SECTION:
blog.dejavu.moe. 300 IN A 172.67.174.250
blog.dejavu.moe. 300 IN A 104.21.31.49
;; Query time: 32 msec
;; SERVER: 127.0.0.1#53(127.0.0.1) (UDP) <——成功标志 127.0.0.1
;; WHEN: Sat Jan 17 16:26:17 UTC 2026
;; MSG SIZE rcvd: 76
正确配置 rDNS 与 DNSSEC 的服务器,执行以下两条命令时,输出结果应保持一致,比如
dig via.moe
dig @127.0.0.1 via.moe
其中 flag 字段的 ad 标志,是 Unbound 成功解析 DNSSEC 的标志。
sudo useradd -m -d /home/mox mox
由于在线构建 Mox 二进制文件服务持续处于 Pending 状态,建议采用手动编译。

准备 Golang 工具链
wget https://go.dev/dl/go1.26.0.linux-amd64.tar.gz
sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.26.0.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
sudo rm -rf /home/mox/go
编译安装
GOBIN=$PWD CGO_ENABLED=0 go install github.com/mjl-/mox@latest
sudo mv mox /home/mox/
sudo chown mox:mox /home/mox/mox
sudo chmod +x /home/mox/mox
清理构建环境
rm go1.26.0.linux-amd64.tar.gz
sudo rm -rf /usr/local/go go
Mox 会进行一些检测和初始化,自动进行系统检测并生成配置。
sudo -i
cd /home/mox
./mox quickstart <管理员邮箱>
输出的关键信息会同步保存在 quickstart.log 中,包含检测结果、建议操作以及初始用户凭据。
安装 Systemd 守护进程服务
sudo chmod 644 mox.service
sudo systemctl enable $PWD/mox.service
sudo systemctl start mox.service
# 查看日志
sudo journalctl -f -u mox.service
通过 SSH 隧道安全访问 Mox 服务器后台:
ssh -L 8080:localhost:80 <用户名>@<IP> -p <SSH 端口>
在浏览器打开 http://localhost:8080/admin/,即可访问后台,使用管理员密码登录。

查看你的域名

初期由于 DNS 记录尚未添加,看到大量非绿色状态属于正常现象

检查所需 DNS 记录

将 Mox 提供的 DNS 解析记录(灰色框内容)保存为本地 TXT 文件(编码为 UTF-8),可以直接在 Cloudflare DNS 解析设置里导入,减少了手动录入的步骤。

需要注意:
Mox 为兼容部分垃圾 DNS 服务商,将 2 条 DKIM 长记录拆分为多段,Cloudflare 支持标准长记录。请务必手动将 DKIM 字段拼接为完整的记录,确保邮件签名校验正常。

比如:
; Outgoing messages will be signed with the first two DKIM keys. The other two
; configured for backup, switching to them is just a config change.
; NOTE: The following is a single long record split over several lines for use
; in zone files. When adding through a DNS operator web interface, combine the
; strings into a single string, without ().
2026a._domainkey.via.moe. TXT (
"v=DKIM1;h=sha256;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwN9QmP4YkY3S7sFQ0x2JvZKZk"
"xZ9zQ3F9r4V9Z2Zx4wF2NnZ0R0X8aC4GvHnHnMZ1xQkR9mNQ0kG5zZ6yUuEJq8T8H"
"d5WZxF8Y9C2H0kFzK1c6H3F2y1JH7V6z4KxY9Jp3Y5A8ZQ9k2nP7V4E6ZQmZ3F0J"
"C7Qx9A1H3N7V8Z5G2K8C6E3X9H7N0Q5Z8F3E9K4V2QIDAQAB"
)
; NOTE: The following is a single long record split over several lines for use
; in zone files. When adding through a DNS operator web interface, combine the
; strings into a single string, without ().
2026b._domainkey.via.moe. TXT (
"v=DKIM1;h=sha256;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv7ZQK9H3R4P8xZC2M1FJ8XK"
"E7A5C9VZxN6Z8T3R7H4C2E0Y9X6MZ7F3P2R5QJ0C1H8Z9V7N5K6X3F4A2M1P8E"
"9Z4TQ6V7C8K0R2F5XH3YJ1MZ6N7P8A9E4C5H0Q2R3F6X8YVZJ1MIDAQAB"
)
拼接为:
2026a._domainkey.via.moe. TXT
"v=DKIM1;h=sha256;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwN9QmP4YkY3S7sFQ0x2JvZKZkxZ9zQ3F9r4V9Z2Zx4wF2NnZ0R0X8aC4GvHnHnMZ1xQkR9mNQ0kG5zZ6yUuEJq8T8Hd5WZxF8Y9C2H0kFzK1c6H3F2y1JH7V6z4KxY9Jp3Y5A8ZQ9k2nP7V4E6ZQmZ3F0JC7Qx9A1H3N7V8Z5G2K8C6E3X9H7N0Q5Z8F3E9K4V2QIDAQAB"
2026b._domainkey.via.moe. TXT
"v=DKIM1;h=sha256;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv7ZQK9H3R4P8xZC2M1FJ8XKE7A5C9VZxN6Z8T3R7H4C2E0Y9X6MZ7F3P2R5QJ0C1H8Z9V7N5K6X3F4A2M1P8E9Z4TQ6V7C8K0R2F5XH3YJ1MZ6N7P8A9E4C5H0Q2R3F6X8YVZJ1MIDAQAB"
验证 DNS 解析结果,预期应该像这样:

Web Admin 管理面板可以查看域名的一些报告

管理 MTA-STS 策略

此处可以检查 IP 是否在已知黑名单里(无效打码😅)

Mox 内置一个 Web Mail 客户端,你可以查看 Mox 网站的 更多截图
,我非常喜欢这个设计风格,当前可以通过 SSH 隧道访问 http://localhost:8080/webmail/。

Mox 默认遵循 最小化访问 的安全设计,将 Web 面板置于 SSH 隧道或 WireGuard 后仅限本地访问,是兼顾安全与可控的最佳实践。
若需要方便地使用 Web Mail 收发邮件,可将其移至 public 监听器下。
编辑配置文件:
sudo vim /home/mox/config/mox.conf
在 Listeners.public 部分启用 WebmailHTTPS
Listeners:
public:
IPs:
- <ipv4>
- <ipv6>
SMTP:
Enabled: true
Submissions:
Enabled: true
IMAPS:
Enabled: true
AutoconfigHTTPS:
Enabled: true
MTASTSHTTPS:
Enabled: true
# Web Mail HTTPS 公网访问
# 添加下面配置
WebmailHTTPS:
Enabled: true
修改后重启服务生效
sudo systemctl restart mox.service
其他服务都通过这种方式进行公网暴露或隐藏,具体可查询 Mox 配置手册 。


尝试和朋友发信、回信,一切没问题的话,进入 Cloudflare DNS 解析设置,将此前调试期间的 TTL 值 由 5 分钟 设置为 更高 或者 自动。
Mox 的核心哲学是 1 + 1 = 1,即 一台服务器 + 一个域名 = 一个完整的邮件服务器,这使得部署和维护的流程变得极其简单。
这意味着我们 无需:
只需要 三步即可使用自己的电子邮件服务器:
此外,尽管 Mox 支持在现有反向代理后运行,但官方最推崇的做法是 将服务器流量 (80/443) 完全交给 Mox 管理。这可以最大限度减少攻击面与配置难度,本文也遵循了这一最佳实践。
虽说没必要「踩一捧一」,但是相比较 Stalwart,我更喜欢 Mox 的设计理念,使用起来更 符合用户直觉。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。