Hed9eh0g

前进的路上总是孤独的

对DNS的进一步认识

本文共计有3903个字

前言

前文已经了解了DNS的一些基础内容,这一篇文用来记录一些与DNS相关的进阶性知识。

dig工具

首先,我们都知道一个域名的解析过程中,可能会有多台域名服务器给我们帮助,那么我们怎么能看到这些背后的功臣呢?这个时候就需要dig工具登场了。

dig(Domain Information Groper), 是 UNIX/BSD 系统自带的 DNS 诊断工具,linux下的安装在此就不必赘述了。

域名查询

如果要查询baidu.com这个域名的A记录,并以简短的形式返回:

《对DNS的进一步认识》

用 dig 还可以查询某一 ip 对应的域名,如下:

《对DNS的进一步认识》

不知道为什么,直接查询baidu.com和我的博客ip对应的域名都返回不了结果,希望能有大佬指教~

另外,nslookup 也是一个 DNS 诊断工具,几乎所有平台都自带该工具,使用也很简答。

解析路径查询

接下来用 dig 命令查看从根域名到指定域名中间可能经过的所有域名服务器,使用 +trace 选项即可。

例如查询baidu.com是怎样被解析的,可得到大致如下的结果:

[admin@izuf6h2050wtvhjg7sorjqz ~]$ dig baidu.com +trace @8.8.8.8

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-9.P2.el7 <<>> baidu.com +trace @8.8.8.8
;; global options: +cmd
.   74656 IN NS e.root-servers.net.
.   74656 IN NS h.root-servers.net.
.......
.   74656 IN NS m.root-servers.net.
.   74656 IN NS d.root-servers.net.
.   74656 IN RRSIG NS 8 0 518400 20191110050000 20191028040000 22545 . 

;; Received 525 bytes from 8.8.8.8#53(8.8.8.8) in 35 ms

com.   172800 IN NS g.gtld-servers.net.
com.   172800 IN NS c.gtld-servers.net.
.........
com.   172800 IN NS b.gtld-servers.net.
com.   172800 IN NS d.gtld-servers.net.
com.   86400 IN DS 30909 8 2 E2D3C916F6DEEAC73294E8268FB5885044A833FC5459588F4A9184CF C41A5766
com.   86400 IN RRSIG DS 8 1 86400 20191110050000 20191028040000 22545 . 

;; Received 1169 bytes from 192.33.4.12#53(c.root-servers.net) in 214 ms

baidu.com.  172800 IN NS ns2.baidu.com.
baidu.com.  172800 IN NS ns3.baidu.com.
baidu.com.  172800 IN NS ns4.baidu.com.
baidu.com.  172800 IN NS ns1.baidu.com.
baidu.com.  172800 IN NS ns7.baidu.com.

;; Received 757 bytes from 192.12.94.30#53(e.gtld-servers.net) in 220 ms

baidu.com.  600 IN A 220.181.38.148
baidu.com.  600 IN A 39.156.69.79
baidu.com.  86400 IN NS ns3.baidu.com.
baidu.com.  86400 IN NS ns7.baidu.com.
baidu.com.  86400 IN NS dns.baidu.com.
baidu.com.  86400 IN NS ns4.baidu.com.
baidu.com.  86400 IN NS ns2.baidu.com.
;; Received 240 bytes from 180.76.76.92#53(ns7.baidu.com) in 30 ms

注意上面的结果是经过简化的,可以看到最开始是13台顶级域名服务器的NS记录(省略了几台,下同),接下来是顶级域名com.的权威域名服务器,然后是 baidu.com 的 NS 记录,最后从 ns.baidu.com 系列服务器中找到 baidu.com 的 两个A 记录。

当然,实际查询过程中,大多时候我们在本地缓存或者本地域名服务器缓存就能直接找到需要的域名记录,不需要每次都向根域名服务器发起请求,然后重复迭代或者递归查询过程。

负载均衡

在以上的例子中发现,域名baidu.com所对应的ip不仅仅只有一个ip。另外,在查看从根域名到指定域名中间可能经过的所有域名服务器的过程中,每一级的域名服务器也不只有一个,可以理解,设置这么多个ip与多个域名服务器是为了减轻单个服务器的负担,这个处理机制称为DNS负载均衡。

负载均衡的优点是可以实现了域名与服务器一对多的关系,减轻了单个服务器的负担,另外,由于存在多个地址,DNS会将域名解析成距离用户地理最近的一个服务器地址,这样就可以加速用户访问,改善性能。

EDNS

EDNS就是在遵循已有的DNS消息格式的基础上增加一些字段,来支持更多的DNS请求业务。

EDNS与普通DNS的区别

前文提到,现在有数量庞大的服务器部署着DNS负载均衡(GSLB),这种负载均衡是根据LocalDNS的位置分配最佳区位的IP地址以提升用户访问体验。但是存在一个问题,如果用户的DNS与实际IP不在一个区位,很可能分配不合适的IP导致访问体验下降。而EDNS有一种特殊的功能,可以指定ClientIP的值便于GSLB判断用户真实区位(注意,不同于修改UDP包,这种方式不会修改向DNS服务器发送UDP时的SrcIP)。

带有 edns-client-subnet 功能的DIG

linux默认的dig没有该功能需要另行安装,网络上的安装方法较为复杂,此处搬运一种最简单的方法:

下载解压BIND

wget ftp://ftp.isc.org/isc/bind9/9.9.3/bind-9.9.3.tar.gz
tar xf bind-9.9.3.tar.gz
cd bind-9.9.3

下载补丁

wget http://wilmer.gaa.st/edns-client-subnet/bind-9.9.3-dig-edns-client-subnet-iana.diff

给代码打补丁

patch -p0 < bind-9.9.3-dig-edns-client-subnet-iana.diff

编译

./configure --without-openssl
make

–without-openssl是因为我们只需要dig,不需要其他东西。但是这样会失去DNSSEC支持。
建议还是完整configure。
make之后不要make install,这样会把bind完整安装了。直接在bin文件里找出dig的二进制文件使用。

测试

把编译好的dig文件放到/usr/bin文件夹,输入命令:

dig @8.8.8.8 baidu.com +client=157.88.0.0

这个命令的意思是在访问baidu.com的同时附加上此时访问者的ip,为157.88.0.0,也即此命令模拟的是西班牙用户访问baidu.com时服务器对域名的解析。

应用

讲了这么多,那这edns有什么具体的作用呢?这个作用来自2019 moectf的两道题的启发,由于篇幅问题,我将在另外一篇文中记录。

DNS缺陷

DNS 劫持

我们知道一个域名服务器对其区域内的用户解析请求负责,但是并没有一个机制去监督它有没有真地负责。也就是说域名服务器的权力并没有被关在笼子里,所以它既可以认真地“为人民服务”,也可以“指鹿为马”。于是有些流氓的域名服务器故意更改一些域名的解析结果,将用户引向一个错误的目标地址。这就叫作 DNS 劫持,主要用来阻止用户访问某些特定的网站,或者是将用户引导到广告页面。

《对DNS的进一步认识》

以访问Google为例,直接通过nslookup操作:

《对DNS的进一步认识》

可以看到这是一台100.100.2.136的服务器,他告诉我google.com的ip为59.24.3.174,于是用whois 一看,果真不是Google的地址。针对DNS劫持,我们可以简单地更换域名服务器,比较靠谱(并不是绝对靠谱)的一个是Google提供的8.8.8.8。

DNS 欺骗

DNS 劫持通过简单的切换域名服务器就可以绕过,不过一旦你遇上了 DNS 欺骗,就无法简单地绕过了。下面我们用不同的域名服务器来查看 facebook的 IP 地址,结果都返回了同一个地址31.13.78.65,看起来好像是真的一样,不过也仅仅是看起来而已。

《对DNS的进一步认识》

《对DNS的进一步认识》DNS 欺骗简单来说就是用一个假的 DNS 应答来欺骗用户计算机,让其相信这个假的地址,并且抛弃真正的 DNS 应答。在一台主机发出 DNS 请求后,它就开始等待应答,如果此时有一个看起来正确(拥有和DNS请求一样的序列号)的应答包,它就会信以为真,并且丢弃稍晚一点到达的应答。

《对DNS的进一步认识》

实施 DNS 欺骗的关键在于伪造一个有特定序列号的应答包,并且让其抢先一步到达发起请求的主机。这对于个人来说还有点难度,但是对于拥有骨干网节点的组织来说,实在是易如反掌,所以这么多网站都已沦陷。不过使用网上流传的那些 hosts文件,就可以在本机缓存许多网站的ip地址,进而可以和部分网站通信。但是通过hosts文件并不能完全 Cross the Great FireWall,因为人家还有很多其他手段。

参考文章

edns的简述与利用

全方位认识dns

 

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注