安装 MOX 参考:
使用 Docker 部署 Mox Mail 邮局


在 Linux 上使用 Docker 部署 Mox 邮件服务器时,很多人会遇到:

1
DANE is inactive because MX records are not DNSSEC-signed.

但多数情况下,并不是域名没开启 DNSSEC,而是:

Mox 使用的 DNS 解析器没有真正进行 DNSSEC 验证。

本文介绍如何使用 Unbound 为 Docker 中的 Mox 提供支持 DNSSEC 的 DNS 解析。

适用环境:

1
2
3
4
Debian / Ubuntu
Docker
Mox Mail Server
Unbound

为什么会出现 DANE inactive

Mox 启用 DANE 时,会验证:

  1. MX 记录
  2. TLSA 记录
  3. DNSSEC 签名

只有 DNSSEC 验证成功,DANE 才会生效。

Docker 默认 DNS:

1
127.0.0.11

只是 Docker 的内部转发器:

  • 不验证 DNSSEC
  • 不返回 ad
  • 不适合 DANE

因此即使域名已经开启 DNSSEC,Mox 仍可能提示:

1
DANE is inactive because MX records are not DNSSEC-signed.

推荐架构

推荐:

1
2
3
4
5
Internet
Unbound
Docker Mox

不要使用:

1
2
3
Docker DNS
8.8.8.8

也不推荐:

1
2
3
systemd-resolved
Docker DNS

禁用 systemd-resolved

Ubuntu / Debian 默认启用了:

1
systemd-resolved

它会占用:

1
127.0.0.53:53

并接管 /etc/resolv.conf

这会导致:

  • Unbound 无法监听 53
  • Docker 使用错误 DNS
  • DNSSEC 验证失效

停止并禁用:

1
2
systemctl stop systemd-resolved
systemctl disable systemd-resolved

重建 /etc/resolv.conf

1
2
3
mv /etc/resolv.conf /etc/resolv.conf.bak

echo "nameserver 127.0.0.1" > /etc/resolv.conf

安装 Unbound

安装:

1
2
apt update
apt install -y unbound unbound-anchor dnsutils

确认支持 DNSSEC:

1
unbound -V

输出中应包含:

1
validator iterator

初始化 trust anchor

检查:

1
ls -l /var/lib/unbound/root.key

不存在则执行:

1
unbound-anchor -a /var/lib/unbound/root.key

配置 Unbound

创建配置:

1
nano /etc/unbound/unbound.conf.d/mox.conf

写入:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
server:
    interface: 0.0.0.0
    port: 53

    do-ip4: yes
    do-ip6: yes

    harden-dnssec-stripped: yes
    qname-minimisation: yes

    access-control: 127.0.0.0/8 allow
    access-control: 172.16.0.0/12 allow

    access-control: 0.0.0.0/0 refuse

这里使用:

1
0.0.0.0

是为了让 Docker 中的 Mox 能访问宿主机 Unbound。

公网访问则通过:

1
access-control

限制。


启动 Unbound

检查配置:

1
unbound-checkconf

启动:

1
2
systemctl enable unbound
systemctl restart unbound

确认 53 端口已经被 Unbound 接管:

1
ss -lntup | grep :53

验证 DNSSEC

普通测试:

1
dig google.com @127.0.0.1

DNSSEC 测试:

1
dig +dnssec cloudflare.com @127.0.0.1

返回结果必须包含:

1
ad

例如:

1
flags: qr rd ra ad

其中:

1
ad = Authenticated Data

测试是否生效

测试故意损坏 DNSSEC 的域名:

1
dig dnssec-failed.org @127.0.0.1

正确结果应为:

1
SERVFAIL

如果还能解析出 IP:

1
说明 DNSSEC 实际没有生效

让 Docker 中的 Mox 使用 Unbound

docker-compose.yml

1
2
3
4
services:
  mox:
    dns:
      - 172.17.0.1

这样:

1
2
3
4
5
Mox
Unbound
递归 DNS

域名侧还需要完成

开启 DNSSEC

在 DNS 服务商后台启用 DNSSEC。

添加 DS 记录

如果注册商没有 DS:

1
DNSSEC 实际不会生效

配置 TLSA

Mox 会自动生成:

1
_25._tcp.mail.example.com

对应的 TLSA 记录。


推荐检测工具

本地:

1
delv example.com MX
1
delv _25._tcp.mail.example.com TLSA

在线:


总结

DANE 是否生效,关键不只是:

1
域名开启 DNSSEC

更重要的是:

1
2
Mox 使用的 DNS
是否真正验证 DNSSEC

因此:

  • Docker 默认 DNS 不适合 DANE
  • 建议禁用 systemd-resolved
  • 使用支持 DNSSEC 的 resolver
  • 推荐使用 Unbound
  • 正确配置 DS 与 TLSA

完成后,Mox 才能真正启用:

1
DNSSEC + DANE