DNS 地址填哪个?常用公共 DNS 服务器地址与选择方法
DNS 地址没有放之四海皆准的“最快”答案:国内服务器先用机房提供的 DNS,其次是 223.5.5.5、119.29.29.29 这类国内公共 DNS,海外服务器再用 8.8.8.8、1.1.1.1。首选和备选来自两家不同的服务,填之前在自己的服务器上用 dig 实测一遍。
DNS 地址填哪个,先记住优先顺序:机房或服务商提供的 DNS,其次是国内公共 DNS,最后才是境外公共 DNS。国内服务器常用的公共 DNS 地址是 223.5.5.5(阿里)、119.29.29.29(腾讯 DNSPod)、114.114.114.114(114 DNS)和 180.76.76.76(百度);香港和海外服务器常用 8.8.8.8(Google)和 1.1.1.1(Cloudflare)。至于“DNS 地址哪个最快”,答案因地而异:同一个公共 DNS,从电信机房和从移动机房测,从华北和从华南测,延迟都不一样。所以本文先给完整的地址表,再给一个在自己服务器上实测的脚本,然后讲国内服务器为什么不该默认用境外 DNS,以及首选、备选怎么搭配。
常用公共 DNS 服务器地址一览
| 服务 | IPv4 地址 | IPv6 地址 | 适合 |
|---|---|---|---|
| 阿里公共 DNS | 223.5.5.5、223.6.6.6 | 2400:3200::1、2400:3200:baba::1 | 国内服务器 |
| 腾讯 DNSPod 公共 DNS | 119.29.29.29 | 2402:4e00:: | 国内服务器 |
| 114 DNS | 114.114.114.114、114.114.115.115 | — | 国内服务器 |
| 百度公共 DNS | 180.76.76.76 | 2400:da00::6666 | 国内服务器 |
| 下一代互联网国家工程中心 | — | 240c::6666、240c::6644 | 国内纯 IPv6 主机 |
| Google Public DNS | 8.8.8.8、8.8.4.4 | 2001:4860:4860::8888、2001:4860:4860::8844 | 海外服务器 |
| Cloudflare | 1.1.1.1、1.0.0.1 | 2606:4700:4700::1111、2606:4700:4700::1001 | 海外服务器 |
| Quad9 | 9.9.9.9、149.112.112.112 | 2620:fe::fe、2620:fe::9 | 海外;默认拦截恶意域名 |
表中“—”表示本文没有列出常用地址。所有地址以各服务官方公布的为准,个别服务会调整或新增地址。
几个容易忽略的细节:
- 带过滤功能的地址不适合服务器。114 DNS 另有 114.114.114.119、114.114.115.119 等拦截恶意网站的地址,Quad9 的 9.9.9.9 默认也会拦截已知的恶意域名,它不做过滤的地址是 9.9.9.10 和 149.112.112.10。办公电脑用过滤地址有好处;服务器用了,一旦某个接口域名被误判,排查起来会绕很大的弯,服务器上应选择不做过滤的地址。
- IPv6 地址不是必填项。IPv4 地址的 DNS 照样能查出 AAAA 记录,只有没有 IPv4 的纯 IPv6 主机才必须填 IPv6 地址的 DNS。
- 同一个地址背后是很多台服务器。公共 DNS 普遍使用任播(Anycast),多个节点宣告同一个 IP,你的查询会被路由到“网络上离得近”的那个节点,所以不同机房测出的延迟不同。
需要加密查询时,可以使用这些服务的 DoT(DNS over TLS,TCP 853)或 DoH(DNS over HTTPS,TCP 443)入口:
| 服务 | DoT 主机名 | DoH 地址 |
|---|---|---|
| 阿里公共 DNS | dns.alidns.com |
https://dns.alidns.com/dns-query |
| 腾讯 DNSPod 公共 DNS | dot.pub |
https://doh.pub/dns-query |
| Google Public DNS | dns.google |
https://dns.google/dns-query |
| Cloudflare | one.one.one.one |
https://cloudflare-dns.com/dns-query |
| Quad9 | dns.quad9.net |
https://dns.quad9.net/dns-query |
DNS 地址哪个最快:用 dig 在自己的服务器上测
别人的测速排行对你的服务器参考意义不大,因为决定延迟的是你这台机器到各个任播节点的路径。测法很简单:对几个 DNS 各发若干次查询,记录 dig 输出里的 Query time,同时统计超时次数。下面的脚本需要 dig 命令,RHEL、Rocky、AlmaLinux 安装 bind-utils,Debian、Ubuntu 安装 dnsutils:
#!/bin/bash
# dns-bench.sh:对比多个 DNS 的查询延迟和超时次数
servers="223.5.5.5 119.29.29.29 114.114.114.114 180.76.76.76 8.8.8.8 1.1.1.1"
# 换成这台服务器实际要访问的域名:软件源、对接的接口、对象存储等
domains="www.example.com api.example.com mirrors.example.org"
rounds=3
for s in $servers; do
sum=0; ok=0; fail=0
for r in $(seq $rounds); do
for d in $domains; do
t=$(dig @"$s" "$d" A +tries=1 +time=2 2>/dev/null | awk '/Query time:/{print $4}')
if [ -n "$t" ]; then sum=$((sum + t)); ok=$((ok + 1)); else fail=$((fail + 1)); fi
done
done
if [ "$ok" -gt 0 ]; then avg=$((sum / ok)); else avg="-"; fi
printf "%-16s 平均 %4s ms 成功 %2d 超时 %2d\n" "$s" "$avg" "$ok" "$fail"
done
+tries=1 +time=2 让每次查询只发一次、最多等 2 秒,超时就记为失败,不会被 dig 的自动重试掩盖。怎么读结果:
- 先看超时。有超时的 DNS 不适合做首选,哪怕它的平均值很低。对服务器来说,一次超时意味着某个请求要多等几秒,比平均慢几毫秒的影响大得多。
- 连跑两遍,以第二遍为准。第一遍里有些域名不在 DNS 的缓存中,它要先去问权威服务器,会拉高平均值;第二遍大多命中缓存,平均延迟接近你到这个节点的网络往返时间。把它和
ping -c 5 223.5.5.5的结果对照,两者接近说明路径正常。 - 换个时间再测一次。晚高峰时段的跨网、跨境链路表现可能和白天差别很大,选首选 DNS 时两个时段都要看。
- 用业务实际访问的域名。脚本里的域名替换成软件源、支付或短信接口、对象存储这些服务器真正要解析的名字,测出来的才是业务会感受到的延迟。
Windows 服务器没有 dig 时,可以用 PowerShell 粗略对比,-DnsOnly 跳过 hosts 文件,-QuickTimeout 缩短超时等待:
foreach ($s in "223.5.5.5","119.29.29.29","114.114.114.114","8.8.8.8") {
$ms = (Measure-Command {
Resolve-DnsName www.example.com -Server $s -DnsOnly -QuickTimeout -ErrorAction SilentlyContinue
}).TotalMilliseconds
"{0,-16} {1,6:N0} ms" -f $s, $ms
}
Measure-Command 测的是整条命令的耗时,包含 PowerShell 自身的几毫秒开销,只适合几个 DNS 之间横向比较,不要和 dig 的数字直接对比。
国内服务器为什么不建议默认用境外 DNS
把 8.8.8.8、1.1.1.1 填进国内服务器,能用,但会带来三类问题。
一是每次缓存未命中都要出境两趟。 假设服务器在上海,要解析一个权威服务器也在国内的域名:查询先发到境外公共 DNS 的节点,节点再回头去问国内的权威服务器,拿到结果后再送回上海。境外公共 DNS 的服务节点通常不在中国内地,这一来一回都要走跨境链路,延迟比国内公共 DNS 高出一截,晚高峰时还可能丢包超时。
二是 CDN 和智能解析会把你调度到不合适的节点。 大部分网站、软件源、接口域名都接了 CDN,权威 DNS 按照“谁来问”决定返回哪个节点:它看到的是递归 DNS 的出口地址,或者递归 DNS 携带的客户端网段信息(EDNS Client Subnet)。境外公共 DNS 的出口在境外,部分服务出于隐私考虑也不传递客户端网段,权威 DNS 就可能把你当成境外访客,返回香港、新加坡甚至更远的节点,或者返回“默认线路”的地址,让电信机房的服务器去访问联通的节点。结果是解析本身不慢,下载和接口调用却慢了。
可以这样验证:
# 同一个域名,分别问国内和境外的公共 DNS,看返回的地址是否不同
dig +short mirrors.example.org @223.5.5.5
dig +short mirrors.example.org @8.8.8.8
# 把上面返回的地址分别 ping 一下,比较往返时间(203.0.113.10 换成实际返回的地址)
ping -c 4 203.0.113.10
# 查看 Google Public DNS 实际用哪个出口地址去问权威服务器
dig +short TXT o-o.myaddr.l.google.com @8.8.8.8
最后一条返回的就是权威服务器眼中“提问者”的地址;如果还多出一条 edns0-client-subnet,表示这次查询带上了你所在的网段。Cloudflare 的节点可以用 dig +short CH TXT id.server @1.1.1.1 查看,返回的机场代码代表应答节点所在城市。
三是出问题时的影响面更大。 resolv.conf 默认每个 DNS 等 5 秒,跨境链路一抖动,服务器上所有需要解析域名的操作都会一起变慢:yum、apt 更新卡住,调用外部接口超时,邮件投递排队。国内公共 DNS 和机房 DNS 的路径短,受跨境链路波动的影响小。
境外公共 DNS 适合的场景也很明确:香港、日本、美国等海外机房的服务器,优先用当地机房 DNS 或 8.8.8.8、1.1.1.1;国内服务器上,它们最多作为排在最后的兜底地址。
首选和备选 DNS 怎么搭配
搭配的核心是分散故障:两个地址不要来自同一家服务。223.5.5.5 和 223.6.6.6 虽然是两个 IP,背后是同一套系统,这家服务整体出问题时两个会一起失效;223.5.5.5 配 119.29.29.29 则是两套独立的系统。按场景可以这样填:
| 场景 | 首选 | 备选 | 第三个(可选) | 说明 |
|---|---|---|---|---|
| 国内机房,机房提供 DNS | 机房 DNS | 223.5.5.5 | 119.29.29.29 | 机房 DNS 离服务器近,查询路径短 |
| 国内机房,没有机房 DNS | 223.5.5.5 | 119.29.29.29 | 180.76.76.76 | 三家各不相同,任何一家故障都不受影响 |
| 国内双栈服务器 | 223.5.5.5 | 119.29.29.29 | 2400:3200::1 | IPv4 的 DNS 已能查出 AAAA 记录,IPv6 地址放在最后 |
| 国内纯 IPv6 服务器 | 2400:3200::1 | 2402:4e00:: | 240c::6666 | 只能填 IPv6 地址的 DNS |
| 香港、海外服务器 | 当地机房 DNS 或 8.8.8.8 | 1.1.1.1 | 9.9.9.10 | 按服务器所在地选择,而不是按你自己所在地;第三个用 Quad9 不过滤的地址 |
| 需要解析内网名称 | 内网 DNS 甲 | 内网 DNS 乙 | — | 外网域名由内网 DNS 转发到公共 DNS |
填写时注意数量和顺序:
- Linux 只认前 3 个。glibc 的解析器最多读取 resolv.conf 里的 3 条 nameserver,多写的会被忽略。
- 顺序就是优先级。系统总是先问第一个,它没有应答才问下一个。把测速结果好、从不超时的放在第一位,而不是按 IP 好记来排。
- 双栈主机别把 IPv6 地址放在第一位。本机 IPv6 出口一旦出问题,每次解析都要先等一次超时。
改完之后,用 dig www.example.com 看输出底部的 SERVER: 一行,确认实际应答的是你填的首选地址;Windows 上执行 nslookup www.example.com,看开头显示的服务器地址。
公共 DNS 不适合的几种情况
公共 DNS 免费、好记,但在下面几种情况下,应该让服务器使用机房 DNS 或自建的递归解析:
- 查询量很大的业务。爬虫、邮件群发、需要频繁回调外部接口的系统,每秒可能产生大量查询,而公共 DNS 一般对单个来源地址的查询频率有限制,超过后会被限速或拒绝,具体限额以各服务的说明为准。这类服务器至少要在本机加一层缓存(systemd-resolved、dnsmasq、nscd 都可以),使用 systemd-resolved 时,
resolvectl statistics能看到缓存命中情况。 - 邮件服务器查反垃圾黑名单。Spamhaus 等黑名单不回答经由大型公共 DNS 转来的查询,只返回 127.255.255.254 这类表示查询被拒的代码,邮件网关据此做的判断就会失真。邮件服务器应该在本机或同机房运行自己的递归解析器。
- 需要解析机房内部名称。PDU、交换机管理口、内部监控这类只在内网 DNS 里登记的名字,公共 DNS 查不到。
- 对查询内容有合规或审计要求。查询记录会经过第三方,是否允许由你所在单位的安全规定决定。
在机房里怎么落地
同一个地址段的服务器,DNS 应该填得一样。哪台填了机房 DNS、哪台被人随手填了 8.8.8.8,平时看不出区别,等到 CDN 调度异常或跨境链路抖动时,才会出现“同一批机器有的快、有的慢”。Toplink DCIM 的 IP 地址管理 把 DNS 作为地址段的属性登记,每个段可以填两个 DNS 地址。按上面的方法测速、选定首选和备选之后,把结果写进对应的地址段:装机、交付和客服回答“DNS 地址填哪个”都以它为准;以后要更换首选 DNS,先改这条记录,再按记录逐台核对服务器的实际配置。
常见问题
114.114.114.114 和 223.5.5.5 哪个快?
没有固定答案。两者都是国内常用的公共 DNS,快慢取决于你的服务器所在地区、运营商到它们节点的路径。用正文的 dig 脚本各测几轮,选平均延迟低、没有超时的作首选,另一个作备选。
ping 公共 DNS 很快,解析却很慢,是怎么回事?
ping 只反映网络往返时间。解析慢通常有两种原因:这个域名不在公共 DNS 的缓存里,它要先去问权威服务器;或者本机配置里排在前面的 DNS 已经不可达,每次都要先等它超时,再轮到能用的那个。
服务器上能用 DoT 或 DoH 加密 DNS 吗?
可以。Linux 的 systemd-resolved 支持 DoT:在 resolved.conf 里写 DNS=223.5.5.5#dns.alidns.com 并设置 DNSOverTLS=yes。Windows 11 和 Windows Server 2022 起的系统内置 DoH 客户端。加密后查询走 TCP 853 或 443,防火墙要相应放行。