域名解析使MX和CNAME共存 解决域名邮箱收发件问题

dns
  1. 1. pre-post()
  2. 2. subject(‘实现目标’)
  3. 3. subject(‘当前配置’)
  4. 4. subject(‘解决方案’)
  5. 5. 参考资料

pre-post()

因为我自己搞了一个域名邮箱,用的腾讯企业邮箱,之前为了上国内CDN从Cloudflare 迁移出来换成 Cloudflare Partner,用 DNSPOD 实现 GEODNS,国内用 百度CDN,国外用 Cloudflare,通过 CNAME 解析指向,但是后面发现一个问题就是域名邮箱突然无法正常收发邮件了,网上通过谷歌和其他博主的博文得知这是DNS的特性导致的(参考5),如果想要解决就只能A+MX的共存方式,但是显然这种方式对我来说弊端很多,另一种方案就是将网站解析到www子域名,把@腾出来给MX,或者将域名邮箱解析到 mail 子域名,虽然对大部分人来说可行,但是对我有点强迫症,我就想用@,毕竟chrome都模糊化www@了,自然是@更适合一点,接下来的方法就是我自己瞎鼓捣出来的,但是又没有查询相关资料证明100%不会出问题,但到目前来看还是很稳的,也不确定放到其他DNS服务商以及其他CDN服务商是否同样有效。

subject(‘实现目标’)

能够使用 DNSPOD 使 pwecho.com 支持境内境外不同CDN服务 CloudflareBaiduCDN,同时兼容 腾讯企业邮箱

subject(‘当前配置’)

Cloudflare Partner

Name Type Record Remark
@ CNAME s-ip.pwecho.com 网站服务器

使用 s-ip.pwecho.com 方便更改IP,CDN需要CNAME指向 s-ip.pwecho.com

DNSPOD

Name Type Record Region Remark
s-ip A x.x.x.x 网站服务器源站IP
@ MX mx1.qq.com 默认 腾讯企业邮箱
@ MX mx2.qq.com 默认 腾讯企业邮箱
@ CNAME pwecho.com.cdn.cloudflare.com 境外 Cloudflare
@ CNAME pwecho.com.a.bdydns.com 境内 BaiduCDN

虽然 DNSPOD 支持MX和CNAME同时记录,会提示可能会产生不兼容问题,但可以忽略,实际测试会出现无法正常返回MX的情况

subject(‘解决方案’)

目前的解决方案是,单独剥离一个CNAME,境外让 Cloudflare 负责提供MX和A记录,境内让 DNSPOD 提供,以下是修改方案

Cloudflare Partner

Name Type Record Remark
@ CNAME s-ip.pwecho.com 网站服务器
@ MX mx1.qq.com 腾讯企业邮箱
@ MX mx2.qq.com 腾讯企业邮箱

DNSPOD

Name Type Record Region Remark
s-ip A x.x.x.x 网站服务器源站IP
root.cn-bd-cdn CNAME pwecho.com.a.bdydns.com 默认 BaiduCDN
root.cn-bd-cdn MX mx1.qq.com 默认 腾讯企业邮箱
root.cn-bd-cdn MX mx2.qq.com 默认 腾讯企业邮箱
@ CNAME pwecho.com.cdn.cloudflare.com 境外 Cloudflare
@ CNAME root.cn-bd-cdn.pwecho.com 境内

通过以上配置查询DNS记录即可得出结果

中国地区

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ dig MX pwecho.com

; <<>> DiG 9.14.8 <<>> MX pwecho.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11135
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;pwecho.com. IN MX

;; ANSWER SECTION:
pwecho.com. 597 IN CNAME root.cn-bd-cdn.pwecho.com.
root.cn-bd-cdn.pwecho.com. 597 IN MX 5 mxbiz1.qq.com.
root.cn-bd-cdn.pwecho.com. 597 IN MX 10 mxbiz2.qq.com.

;; Query time: 10 msec
;; SERVER: 192.168.50.1#53(192.168.50.1)
;; WHEN: Sat Feb 27 14:11:41 ;; MSG SIZE rcvd: 117
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ dig CNAME pwecho.com

; <<>> DiG 9.14.8 <<>> CNAME pwecho.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63349
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;pwecho.com. IN CNAME

;; ANSWER SECTION:
pwecho.com. 563 IN CNAME root.cn-bd-cdn.pwecho.com.

;; Query time: 76 msec
;; SERVER: 192.168.50.1#53(192.168.50.1)
;; WHEN: Sat Feb 27 14:12:10 ;; MSG SIZE rcvd: 57
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ dig A pwecho.com

; <<>> DiG 9.14.8 <<>> A pwecho.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12359
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;pwecho.com. IN A

;; ANSWER SECTION:
pwecho.com. 37 IN CNAME root.cn-bd-cdn.pwecho.com.
root.cn-bd-cdn.pwecho.com. 37 IN CNAME pwecho.com.a.bdydns.com.
pwecho.com.a.bdydns.com. 37 IN CNAME opencdncloud.jomodns.com.
opencdncloud.jomodns.com. 37 IN A 101.72.249.35

;; Query time: 9 msec
;; SERVER: 192.168.50.1#53(192.168.50.1)
;; WHEN: Sat Feb 27 14:15:33 ;; MSG SIZE rcvd: 153

境外地区

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ dig MX pwecho.com

; <<>> DiG 9.16.1-Ubuntu <<>> MX pwecho.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 48915
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;pwecho.com. IN MX

;; ANSWER SECTION:
pwecho.com. 600 IN MX 10 mxbiz2.qq.com.
pwecho.com. 600 IN MX 5 mxbiz1.qq.com.

;; Query time: 276 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Sat Feb 27 07:14:54 CET 2021
;; MSG SIZE rcvd: 88
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ dig CNAME pwecho.com

; <<>> DiG 9.16.1-Ubuntu <<>> CNAME pwecho.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55778
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;pwecho.com. IN CNAME

;; ANSWER SECTION:
pwecho.com. 600 IN CNAME pwecho.com.cdn.cloudflare.net.

;; Query time: 276 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Sat Feb 27 07:14:43 CET 2021
;; MSG SIZE rcvd: 82
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ dig A pwecho.com

; <<>> DiG 9.16.1-Ubuntu <<>> A pwecho.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35366
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;pwecho.com. IN A

;; ANSWER SECTION:
pwecho.com. 600 IN CNAME pwecho.com.cdn.cloudflare.net.
pwecho.com.cdn.cloudflare.net. 300 IN A 104.26.6.173
pwecho.com.cdn.cloudflare.net. 300 IN A 104.26.7.173
pwecho.com.cdn.cloudflare.net. 300 IN A 172.67.69.29

;; Query time: 280 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Sat Feb 27 07:17:11 CET 2021
;; MSG SIZE rcvd: 130

从上面结果可以看出,pwecho.com.cdn.cloudflare.net 本身返回的就是 A 记录,而它做的只是将你的 MX 记录也加到他的 CNAME 域名解析中,所以完全没有问题,而 DNSPOD 虽然还是返回 CNAME 来解析 A 记录,但是实测多次并没有发现出现查询 MX, CNAME 混乱返回的情况, 但同样我也尚未能提供资料证明不会出现这个问题

⚠️ 补充测试结果: 通过 https://www.boce.com/dns/ 测试发现全国查询的时候会有部分地区随机返回 CNAME 记录,所以这个方法还是不稳定,Cloudflare 那种实现对境外邮箱来说则完全没有问题

其实这里还有个发现,即便是国内的 QQ邮箱, 腾讯企业邮箱, 163邮箱 或者是国外的 Gmail, Outlook 都会查询出境外的MX记录,即便境内没设置MX记录也可,所以如果不放心其实可以直接干掉境内的MX记录,只让 Cloudflare 返回 MX 记录也可以稳定运作 (不打包票,境内还有很多邮箱没有做测试

参考资料

  1. 域名解析的 MX 和 CNAME 记录冲突 - 谢先斌的博客
  2. 解析记录冲突规则 - 阿里云文档
  3. 三种方法解决域名解析的主机记录冲突 - Erdong’ Blog
  4. 域名 MX 记录与 CNAME 冲突 - 老鬼的博客
  5. RCF 1034 - 下载PDF文件
  6. DNS using CNAMEs breaks MX records? - StackExchange