1、什么是DNS
输入域名,输出ip地址的一个系统
2、直观过程
用dig工具来查看查询的过程
应答部分:
QUESTION SECTION: 查询内容
IN代表Internet协议。A代表A解析,即IPV4(AAA为ipv6)。
ANSWER SECTION: 响应内容
紧接着A后面的是ip地址,即输出结果
这里显示help.deadfishcrypto.com有两个A解析
如果显示的不是A,而是NS(name server),就代表右边接着的服务器中,能查询到最左边的域名的下一级域名信息(也就是托管了左边这个域名)
其他信息
如查询时间,本地DNS地址端口等。
3、域名层级
我们用DNS的最终目的都是要知道我们要访问背后的服务器地址具体是多少,因此第一步都是向DNS服务器发起请求,问它要地址。但是一台DNS服务器不可能保存全世界所有域名ip对,因此要有域名的层级管理
示例图中的
help.deadfishcrypto.com.
多了一个‘.’在最后,这里是省略了.root,原本的样子应该是:
help.deadfishcrypto.com.root
用'.'来给域名分级别,具体如下:
help.deadfishcrypto.com.root
主机名.次级域名.顶级域名.根域名`
4、查询过程
- 向根域名服务器发起查询请求,查到顶级域名的NS记录跟A记录。
- 向顶级域名服务器发起查询请求,查到次级域名的NS记录跟A记录。
- 向次级域名服务器发起查询请求,查到主机名的A记录
上两张别人的图,方法不绝对,都有可能:
然后阿里云就是权威DNS:
5、根域名服务器
保存顶级域名(DNS根区)解析信息的服务器。
那DNS服务器怎么知道一开始的根域名服务器的地址呢?
答:
hard code。一般DNS服务器最少写死一个或以上根域名服务器信息,不然就会陷入循环查询。
6、name server
NS代表托管这一级域名的服务器域名,例如.com下的次级域名的解析信息,能通过*.gtld-server.net.中任意一个服务器查询到
- 例如第一个根域名的托管,问本地要到了根域名服务器的信息(那么本地的配置就相当于NS);
- 然后问根域名服务器要了com.的NS:*.gtld-server.net.;
- 然后问*.gtld-server.net.要到了deadfishercrypto.com.的NS(dns15.hichina.com)
- 最后问dns15.hichina.com药到了help.deadfishcrypto.com的A解析。
7、DNS根区
保存所有(1000多个)顶级域名信息的文件,而管理这个文件的组织:ICANN
例如.com的name server就有:
为了防止循环查询,DNS根区还保存了对应的IP地址,因为顶级域名的NS也是需要通过顶级域名去查到IP的,如果不知道任何一个顶级域名NS的IP,那就会陷入循环查询。
因此DNS根区里面存的是:
a.gtld-servers.net. 172800 IN A 192.5.6.30
a.gtld-servers.net. 172800 IN AAAA 2001:503:a83e:0:0:0:2:30
b.gtld-servers.net. 172800 IN A 192.33.14.30
b.gtld-servers.net. 172800 IN AAAA 2001:503:231d:0:0:0:2:30
c.gtld-servers.net. 172800 IN A 192.26.92.30
c.gtld-servers.net. 172800 IN AAAA 2001:503:83eb:0:0:0:0:30
... ...
8、DNS劫持
就是我想访问china.com,但是回来的内容是一些不可描述的东西。
正常的客户端请求流程是这样的:
客户端---(请求域名)--->DNS---(解析得到IP地址)--->返回给客户端,然后客户端访问IP
被劫持的请求是这样的
攻击者---(从内部修改了解析对或缓存)--->某DNS服务器
客户端---(请求域名)--->被攻击的DNS---(解析得到攻击期望的IP地址)--->返回给客户端,然后客户端访问IP
换句话说:
DNS劫持就是:你问DNS:“银行怎么走,我要去存钱”,DNS翻了翻地图(一本无意间被修改过的),然后指了一条通往劫匪巢穴的道路。
HTTP劫持(例如中间人攻击)就是:你想买一包薯片结果回来了一袋屎。原因就是钱出去的路跟薯片回来的路中间多了一个黑客做中间转发,黑客就把薯片换掉,装了一袋shit给你。
9、DNS缓存投毒
就是攻击者在外部修改了DNS缓存服务器的记录,达到黑客的目的。
方式:
攻击者---(向DNS服务器要一个不存在的域名的解析:如abc.xxx.com)--->DNS缓存服务器
那么此时缓存服务器肯定是找不到abc.xxx.com这个域名的,因为abc.不存在,于是DNS缓存服务器就问xxx.com的name server要解析信息了
DNS缓存服务器---(请求abc.xxx.com的解析是什么)--->xxx.com的nameserver
由于DNS系统用的是UDP包通信,所以攻击者在xxx.com的nameserver应答返回之前,
疯狂给DNS缓存服务器发包,告诉它:abc.xxx.com的ip是x.x.x.x
攻击者---(是我是我是我)--->DNS缓存服务器,收到后缓存了,收到第一个包之后,后面的都不要了
DNS缓存服务器缓存了攻击者的记录,攻击目的达成
上面是个人理解,下面是华为的图解(输了输了
然后防御方法很简单,就是在缓存服务器和授权DNS服务器之间加一个用户不知道的queryid,然后DNS缓存服务器出入口加多一个防御,用于验证queryid就行了。