Sukka's Blog

童话只美在真实却从不续写

之前写过一篇 如何选择适合的公共 DNS,提到了 DNS 出口的概念,因为近期有查询这个需求,所以造了个没啥技术含量的工具,出来水篇文章。


先拿点「科普性的内容」凑一下字数~ DNS 出口是一个并不严谨的概念,指递归 DNS 用来向上游 DNS 发起解析请求使用的 IP 地址。

对于单点部署的完整递归 DNS 服务来说,它的 DNS 出口就是它自己;如果是像阿里的和腾讯 DNSPod 的公共 DNS,由于全国各地各个运营商的用户都在使用他们的服务,为了能针对不同地区、不同运营商的用户返回适合他们的 CDN 节点解析结果,公共 DNS 会在不同地区(片区)设置不同运营商的出口、用于发起解析,以期获得适合的 CDN 结果返回给用户;对于 Cloudflare 和 DNS.SB 这种节点遍布全球使用 Anycast 技术的公共 DNS,用户在发起解析请求时基本会连接到距离最近、速度最快的节点,最终由收到解析请求的节点向上游发起解析请求,此时每一个节点都可以是 DNS 出口。


在那篇公共 DNS 的文章中提到了 Sukka 网络检查工具 可以查看 DNS 出口,这个工具使用的是腾讯啄木鸟接口。这种查询 DNS 出口的方法是通过让用户解析一个带有随机字符串的子域名、迫使用户发起一个新的 DNS 请求,然后再在权威 DNS 上获得请求者的 IP,从而获得用户的 DNS(如果是公共 DNS,则是 DNS 出口)。除了腾讯的啄木鸟接口、CloudXNS 网络检查工具以外,还有 IP-API 提供了公开的接口;诸多 DNSLeak 检查工具的原理也是如此。

不过,如果权威 DNS 能够获得请求 IP,那么也可以在查询时直接由权威 DNS 返回结果:

# OpenDNS
$ dig @resolver1.opendns.com ANY myip.opendns.com +short

# Akamai
$ dig @ns1-1.akamaitech.net ANY whoami.akamai.net +short

# Google
dig @ns1.google.com TXT o-o.myaddr.l.google.com +short

这里通过 @ 指定直接向权威 DNS 发起请求,可以获得本机 IP;如果不加 @ 则是通过你的递归 DNS 发起请求,那么最后返回的就是递归 DNS 的出口。


凑完字数了,正文开始(

GeoDNS 的原理就是权威 DNS 根据请求的 IP 返回不同的结果,因此我利用 CloudXNS 的 GeoDNS 做了一个类似的可以查询 DNS 出口位置的服务,使用示例如下:

$ dig geo.gds.sukkaw.net +short
na-us.g.co.

$ dig geo.gds.sukkaw.net @185.222.222.222 +short +vc
ap-hk.g.co.

$ dig geo.gds.sukkaw.net @101.6.6.6

; <<>> DiG 9.11.5-P4-1-Debian <<>> geo.gds.sukkaw.net @101.6.6.6
;; global options: +cmd
;; QUESTION SECTION:
;geo.gds.sukkaw.net. IN A

;; ANSWER SECTION:
geo.gds.sukkaw.net. 600 IN CNAME edu-default.g.cn.

;; AUTHORITY SECTION:
g.cn. 60 IN SOA ns1.google.com. dns-admin.google.com. 241198383 900 900 1800 60

;; SERVER: 101.6.6.6#53(101.6.6.6)
;; MSG SIZE rcvd: 137

通过 dig 向 geo.gds.sukkaw.net 发起请求,返回一条 CNAME 解析结果;使用 CNAME 的原因是在 dig 时不用指定 type 就可以返回结果、而且不会带引号;使用这种非常规的返回方式也有助于阻止滥用。


解释一下返回的结果的格式:

国内的结果一律以 g.cn 结尾,返回的 CNAME 格式为 {isp}-{province}.g.cn

isp 的取值可以为:

  • ct - 中国电信
  • cu - 中国联通
  • cm - 中国移动
  • crc - 中国铁通
  • cer - 教育网
  • cst - 科技网
  • changkuan - 长城宽带
  • wasu - 华数传媒
  • colnet - 东方有线
  • 21vianet - 世纪互联
  • guanghuan - 光环新网
  • default - 其他运营商

province 的取值一般是省份的拼音,只有以下例外

  • dongbei huabei huanan huadong xibei 无法确认省份、但能确认地区
  • xibei-shanxihuabei-shanxi 分别对应陕西和山西
  • shenzhen guangzhou 电信可以精确到这两个市
  • hangzhou 华数传媒只在杭州
  • huadongnan-huanan 只出现在教育网结果中,意为 华东南与华南 地区
  • default 其它省份或自治区

国外的结果一律以 g.co 结尾,返回的 CNAME 格式为 {geo}-{country}.g.co

geo 的取值可以为:

  • ap Asia Pacific 亚太地区
  • eu Europe 欧洲
  • me Middle East 中东地区
  • eu-me Europe & Middle East 欧洲和中东地区
  • af Africa 非洲
  • na North America 北美洲
  • sa South America 南美洲
  • default 其它地区

country 取值为国家和地区的二字码、和 default 用于表示其它国家和地区。


又成功水了一篇文章,耶~

本文作者 : Sukka
本文采用 CC BY-NC-SA 4.0 许可协议。转载和引用时请注意遵守协议!
本文链接 : https://blog.skk.moe/post/dns-exit-tool/

本文最后更新于 天前,文中所描述的信息可能已发生改变