当然是出口 IP。 排除法就知道了,假设我客户端 IP 是 192.168.0.2,DNS 服务器怎么把解析结果发给我?
eastpiger
2019-11-18 19:50:31 +08:00
需要分类讨论,核心问题是你自己到 DNS 服务器之间的通路上是否支持 RFC2671 eDNS ( Extension Mechanisms for DNS )和 RFC7871 edns-client-subnet。
如果不支持上述协议,则 DNS 拿到的是直接沟通他的机器的 ip 地址,即你所说的出口 ip ; 如果均支持上述协议,则 DNS 拿到的是你的 ip ; 如果部分支持上述协议(一般内网内是无需支持的),则 DNS 拿到的是从他开始(一路支持这个协议回溯)的最早那台设备的前一个设备的 ip。
===========
RFC7871 edns-client-subnet 是扩展自 RFC2671 eDNS 的一个协议,允许在 DNS 扩展字段内传输源主机的客户端信息,包括 ip 信息。当一个主机支持 eDNS 时,他会将请求包内的扩展字段传递到下一个节点,当 edns-client-subnet 启用且上游没有相关信息时,该节点将上一个节点试作源,并打包形成客户端信息传递到下一节点。
目前大多数商业路由器均支持上述协议,至少国内联通电信大部分区域都可以用这种方法拿到源地址 ip,这也是为什么很多 DNS 解析服务支持私有线路指定解析,并且可以根据 ip 区分地区和运营商。但是这并不 100%普及,比如教育网内主干节点几乎全都不支持该协议。所以对教育网的定位基本上只能定位到运营商却定位不到地区。
eastpiger
2019-11-18 19:51:02 +08:00
另,前面的经验是我两年前查相关问题学习的,未必 100%准确。
eastpiger
2019-11-18 19:52:04 +08:00
再另,使用内网 ip 的路由器几乎都不会将内网 ip 作为源 ip 传出去,所以 dns 得到的一般至少是个公网 ip 才对。
lc7029
2019-11-18 19:54:58 +08:00
dna 服务器一般是拿到出口的 IP,因为现在的网络几乎都是经过 nat 出去的。 ipv6 拿到的是客户端的 IP
eastpiger
2019-11-18 19:56:44 +08:00
emmm 我觉得我还是要补充一下,前面说的这两个协议只需要主干网路由器支持就可以,不需要你的家用路由器支持,不需要内网的机器支持,一般企业的路由器也不需要支持。这里只需要公网内,你联网出口的上游路由器,传递你的公司 /家庭的出口 ip 即可。
这种效果在教育网很显著。教育网内的主干网都不支持该协议(也可能是某些节点不支持导致没传递好),所以 DNS 解析服务对教育网基本上只能拿到清华的教育网出口 ip 了(教育网出口之后进入商业骨干网接入,就正常多了)。对其内部很难追踪,当然最近几年有没有变化我就不知道了。
tomychen
2019-11-19 12:28:14 +08:00
协议的问题,看一下 RFC 不就很明了了吗
johnjiang85
2019-11-20 18:16:11 +08:00
一般来说权威 DNS 拿到的都是客户端设置的 DNS 的后端出口 IP,除非你使用的递归 DNS 支持 ECS,然而目前绝大部分递归 DNS 都是不支持(少数支持的有 Google 的 8.8.8.8,OpenDNS、我们的 119.29.29.29 等)。
使用以下命令可以获取 DNS 的后端出口 IP 地址
`for i in {1..20};do dig @119.29.29.29 $i.ip.dnspod.net txt +short;done`
如果结果只有一列,则表示指定 DNS 的后端出口 IP 地址; 如果结果有两列,则第一列表示 DNS 的后端出口 IP 地址,第二列表示递归 DNS 向权威 DNS 请求时携带的 ECS IP.