DNS概述
域名
域名,即网站名称(例:www.xxx.com)。如果说互联网的本质是连接一切,域名则为“一切”提供了身份标识功能,而IP为“一切”提供了寻址功能。其关系可类比为人的姓名与身份证号。
根域、顶级域、二级域、子域
域名采用层次化的方式进行组织,每一个点代表一个层级。一个域名完整的格式为www.xxx.com.
根域:最末尾的点代表根域,常常省略;根域服务器只有13个IP地址,但机器数量却不是13台,因为这些IP地址借助了任播的技术,所以可以在全球设立镜像站点,访问根域服务器并不是唯一的主机。
顶级域:com即顶级域(TLD);有两种划分方式,一种互联网刚兴起时的按照行业性质划分的com.,net.等,一种是按国家划分的如cn.,jp.等。
二级域:xxx.com即二级域。依次类推,还有三级域、四级域等等。
子域:子域是一个相对的概念,xxx.com是com的子域,www.xxx.com是xxx.com的子域。
注:例如
xxx.com是一个顶级域名,www.xxx.com是在xxx.com 这个域里的命名为www的主机。
a.www.xxx.com,在这个网址中,www.xxx.com变成了一个三级域而不是一台主机,主机名是a。
域名系统
即DNS(Domain Name System)。DNS主要解决两方面的问题:域名本身的增删改查以及域名到IP如何映射。
正向解析
根据域名查找对应IP的过程。
反向解析
根据IP查找对应域名的过程。
解析器
处于DNS客户端的一套系统,即resolver,用于实现正向解析或反向解析。
权威DNS
处于DNS服务端的一套系统,由域名解析服务商建设,提供域名管理服务,维护域名解析记录。权威DNS即通俗上“这个域名我说了算”的服务器。
递归DNS
又叫local dns。由网络运营商建设,提供域名查询解析服务。可以理解为是一种功能复杂些的resolver,其核心功能一个是缓存、一个是递归查询。收到域名查询请求后其首先看本地缓存是否有记录,如果没有则一级一级的查询根、顶级域、二级域……直到获取到结果然后返回给用户。日常上网中运营商分配的DNS即这里所说的递归DNS。
转发DNS
转发DNS是一种特殊的递归。如果本地的缓存记录中没有相应域名结果时,其将查询请求转发给另外一台DNS服务器,由另外一台DNS服务器来完成查询请求。
公共DNS
公共DNS属于递归DNS。其典型特征为对外一个IP,为所有用户提供公共的递归查询服务。
域名查询方式
迭代查询:
A -> B(B-C) | A -> C(C-D) | A -> D | D -> A
递归查询:
A -> B -> C -> D -> C -> B -> A
递归查询,返回的结果只有两种:查询成功或查询失败。
迭代查询,又称作重指引,返回的是最佳的查询点或者主机地址。
域名查询过程
例:以用户在浏览器输入www.xxx.com为例,域名查询过程:
简要过程:
浏览器的dns缓存 > 操作系统dns缓存 > hosts文件 > dns服务器的zone文件 > dns服务器缓存 > 根dns服务器 > com.服务器 > xxx.com.服务器 > 解析结果
详细过程:
- 用户在浏览器输入www.xxx.com,浏览器先检查自身缓存中是否存在该域名的解析缓存记录;如果存在,解析结束。
- 如果浏览器缓存中没有命中,会检查操作系统缓存中是否存在该域名的解析缓存记录(域名被缓存的时间可通过TTL属性来设置);如果存在,解析结束。
- 如果操作系统缓存中没有命中,会检查hosts的设置(手动指定的解析记录);如果存在,解析结束。
- 如果hosts文件中没有命中,浏览器调用操作系统resolver向本地域名服务器(LDNS)发起域名查询(如果是linux下,先查网卡配置文件中的dns服务器地址,再查 /etc/resolv.conf);如果存在,解析结束(标记为非权威服务器的应答)。
- 如果LDNS仍然没有命中,就直接跳到Root Server 域名服务器请求解析,根域名服务器返回给LDNS一个所查询域的主域名服务器(gTLD Server,国际顶尖域名服务器,如.com .cn .org等)地址。
- LDNS再发送请求给上一步返回的gTLD,gTLD查找并返回这个域名对应的Name Server的地址(网站注册的域名服务器)。
- LDNS再发送请求给上一步返回的Name Server,Name Server根据映射关系表找到目标ip,返回给LDNS。
- LDNS缓存这个域名和对应的ip,并把解析的结果返回给用户,用户根据TTL值缓存到本地系统缓存中,域名解析过程至此结束。
注:每一层级的DNS服务器都有缓存,实际都是先查缓存,没有缓存才返回下级域。
理论上,所有域名查询都必须先查询根域名,因为只有根域名才知道某个顶级域名由哪台服务器管理。
由于根域名列表很少变化,大多数 DNS 服务商都会提供它的缓存(一般为1000小时),所以根域名的查询并不频繁。
一般情况下,从客户端到本地DNS服务器(非权威服务器)是属于递归查询,而DNS服务器之间就是的交互查询属于迭代查询。
查看缓存:
ipconfig /displaydns # Windows
nscd -f hosts;nscd dns # Linux
chrome://net-internals/#dns # Chrome
清除缓存:
ipconfig /flushdns # Windows
service nscd restart # Linux(启用了nscd 服务(Name Service Cache Daemon),才有dns 缓存)
dscacheutil -flushcache # MacOS
DNS的记录类型
优先级:
NS记录 > A记录 > CNAME记录
记录类型:
(1)A记录:地址记录(Address),将域名指向一个IPv4地址(例如:100.100.100.100)。
(2)AAAA记录: 将主机名(或域名)指向一个IPv6地址(例如:ff03:0:0:0:0:0:0:c1)。
(3)NS:域名服务器记录(Name Server),将子域名指定某个域名服务器来解析。该记录只能设置为域名,不能设置为IP地址。NS记录只对子域名生效。
(4)MX:邮件记录(Mail eXchange),建立电子邮箱服务,将指向邮件服务器地址(一般由邮箱服务商提供)
(5)CNAME:规范名称记录(Canonical Name),将域名指向另一个域名,实现与被指向域名相同的访问效果(一般由主机服务商提供)
(6)PTR:逆向查询记录(Pointer Record),A记录的逆向记录,又称做IP反查记录或指针记录,负责将IP反向解析为域名
(7)TXT:为某个主机名或域名设置说明,可任意填写,可为空。一般做一些验证记录时会使用此项,如:做SPF(反垃圾邮件)记录
(8)SRV记录: 服务记录,SRV记录了哪台计算机提供了哪个服务。格式为:服务的名字.协议的类型(例如:_example-server._tcp)。
(9)SOA记录: 起始授权机构记录,NS用于标识多台域名解析服务器,SOA记录用于在众多NS记录中那一台是主服务器
(10)显性URL转发记录: 将域名指向一个http(s)协议地址,访问域名时,自动跳转至目标地址。例如:将www.aaa.cn显性转发到www.aaa.com后,访问www.aaa.cn时,地址栏显示的地址为:www.aaa.com。
(11)隐性UR转发记录L: 将域名指向一个http(s)协议地址,访问域名时,自动跳转至目标地址,隐性转发会隐藏真实的目标地址。例如:将www.bbb.cn隐性转发到www.bbb.com后,访问www.bbb.cn时,地址栏显示的地址仍然是:www.bbb.cn。
注:一般来说,为了服务的安全可靠,至少应该有两条NS记录,而A记录和MX记录可以有多条,这样就提供了服务的冗余性,防止出现单点失败。CNAME记录主要用于域名的内部跳转,为服务器配置提供灵活性,用户感知不到。
例:
$ dig facebook.github.io ... ;; ANSWER SECTION: facebook.github.io. 3370 IN CNAME github.map.fastly.net. github.map.fastly.net. 600 IN A 103.245.222.133
上面结果显示,facebook.github.io的CNAME记录指向github.map.fastly.net。也就是说,用户查询facebook.github.io的时候,实际上返回的是github.map.fastly.net的IP地址。这样的好处是,变更服务器IP地址的时候,只要修改github.map.fastly.net这个域名就可以了,用户的facebook.github.io域名不用修改。
由于CNAME记录就是一个替换,所以域名一旦设置CNAME记录以后,就不能再设置其他记录了(比如A记录和MX记录),这是为了防止产生冲突。举例来说,foo.com指向bar.com,而两个域名各有自己的MX记录,如果两者不一致,就会产生问题。由于顶级域名通常要设置MX记录,所以一般不允许用户对顶级域名设置CNAME记录。
DNS相关工具命令
1、 dig
# 查询有哪些根DNS
dig -t ns .
# 指定域名服务器查询
dig @4.2.2.2 math.xxx.com
# 简短显示
dig math.xxx.com +short
# 反向查询(由ip查询域名)
dig -x 192.30.252.153
# 显示查询过程
dig +trace www.xxx.com
例:
-> dig +trace www.baidu.com ; <<>> DiG 9.10.6 <<>> +trace www.baidu.com ;; global options: +cmd . 517536 IN NS l.root-servers.net. . 517536 IN NS b.root-servers.net. . 517536 IN NS g.root-servers.net. . 517536 IN NS d.root-servers.net. . 517536 IN NS j.root-servers.net. . 517536 IN NS h.root-servers.net. . 517536 IN NS m.root-servers.net. . 517536 IN NS c.root-servers.net. . 517536 IN NS i.root-servers.net. . 517536 IN NS f.root-servers.net. . 517536 IN NS a.root-servers.net. . 517536 IN NS k.root-servers.net. . 517536 IN NS e.root-servers.net. ;; Received 228 bytes from 202.106.196.115#53(202.106.196.115) in 68 ms # (1) com. 172800 IN NS a.gtld-servers.net. com. 172800 IN NS b.gtld-servers.net. com. 172800 IN NS c.gtld-servers.net. com. 172800 IN NS d.gtld-servers.net. com. 172800 IN NS e.gtld-servers.net. com. 172800 IN NS f.gtld-servers.net. com. 172800 IN NS g.gtld-servers.net. com. 172800 IN NS h.gtld-servers.net. com. 172800 IN NS i.gtld-servers.net. com. 172800 IN NS j.gtld-servers.net. com. 172800 IN NS k.gtld-servers.net. com. 172800 IN NS l.gtld-servers.net. com. 172800 IN NS m.gtld-servers.net. com. 86400 IN DS 30909 8 2 E2D3C916F6DEEAC73294E8268FB5885044A833FC5459588F4A9184CF C41A5766 com. 86400 IN RRSIG DS 8 1 86400 20201006050000 20200923040000 46594 . al9AIzVdatEYNdPM/MpuP4CEePiwG+x32ZfyfDVNqOV3kxn+BJL5hcy6 K4wQHIh8D0/DYdry9YBJgifagvopUg9cpMCQy0MUXYBHLd8mZNVuAm/J dEcCPyazYcdSADwEt5g9pB0q3uHs4aOwA8WBuenXIimLj2BvmvV9D0ug ObWZ2XLUL2BsstwCCNTlOIl9Ta/eaRcFCjbBY7aYTxzEn2V4X0KSphJG PYdrueJhXWathJyRhzh19Wx8igE421dLorg0uvxtTbpd/m1SGcCXINUf uU7UVqTkmJU8ad8EMWb3w2itG0/aL97Sq6F5CQcneO532aDxyXOFVQqu qxfsVA== ;; Received 1173 bytes from 192.58.128.30#53(j.root-servers.net) in 28 ms # (2) 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. CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN NSEC3 1 1 0 - CK0Q1GIN43N1ARRC9OSM6QPQR81H5M9A NS SOA RRSIG DNSKEY NSEC3PARAM CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN RRSIG NSEC3 8 2 86400 20200930044209 20200923033209 24966 com. xChJAuWE/feHPvOG0a2fHr1qGnFCaOWXM3/MAltsC/PS/IXbtuzmgIJZ brsIJCOQZpYusZkbSOJXatbHbUWvqwPrdq8jCKBTWwoSzQZSNWAryJ9u ydKMVHxQmJoUxaiaT8UStYCLRu4bYQj6h19mELbwNwg1QNTLfO65dfvF aMyhkIJ7DkTAWDppKtouPwJ+5JkTrxry+KwJTgNfChF6Ow== HPVUSBDNI26UDNIV6R0SV14GC3KGR4JP.com. 86400 IN NSEC3 1 1 0 - HPVVMRO7OPIUUS1A7GJE2R6L39VL43TL NS DS RRSIG HPVUSBDNI26UDNIV6R0SV14GC3KGR4JP.com. 86400 IN RRSIG NSEC3 8 2 86400 20200930064054 20200923053054 24966 com. lZGe50lr3rotSMYsM6UcDIIgfYdG7yTK9Q8jVXfCuaQjj11uQQ85Yxyp NS/8cwSGsfi3e6q71sMvnR9EDiQDIcHObOhMPSLcn698vOdNICU08KxU zs7vy2uBXdhOt+FYcfbqTLPewyYL1u2wpzzqxJd++ZyGNSuP16GmgtHh piNpCgM0YirxsDLgrR3cBgWh68HiDwwSuf/FziKKIpoEPg== ;; Received 761 bytes from 192.35.51.30#53(f.gtld-servers.net) in 302 ms # (3) www.baidu.com. 1200 IN CNAME www.a.shifen.com. a.shifen.com. 1200 IN NS ns4.a.shifen.com. a.shifen.com. 1200 IN NS ns2.a.shifen.com. a.shifen.com. 1200 IN NS ns3.a.shifen.com. a.shifen.com. 1200 IN NS ns5.a.shifen.com. a.shifen.com. 1200 IN NS ns1.a.shifen.com. ;; Received 239 bytes from 14.215.178.80#53(ns4.baidu.com) in 79 ms
说明:
(1)、主机向LDNS获取到根域服务区的13个IP和主机名[a-m].root-servers.net
(2)、向其中的一台根域服务器(j.root-servers.net)发送www.baidu.com的查询请求,返回了com.顶级域的服务器IP(未显示)和名称(ns[1-4,7].baidu.com.)
【可以用dig @192.58.128.30 www.baidu.com查看返回的百度顶级域名服务器IP地址】
(3)、向百度的顶级域服务器14.215.178.80#53(ns4.baidu.com)请求www.baidu.com,发现www有个别名,而不是一台主机,别名是www.a.shifen.com。
正常情况下,当dns请求到别名的时候,查询会终止,而是重新发起查询别名的请求,所以此处应该返回的是www.a.shifen.com。
但是为什么返回a.shifen.com的这个域的NS呢?
继续尝试:dig +trace shifen.com
->dig +trace shifen.com ; <<>> DiG 9.10.6 <<>> +trace shifen.com ;; global options: +cmd . 43331 IN NS g.root-servers.net. . 43331 IN NS f.root-servers.net. . 43331 IN NS k.root-servers.net. . 43331 IN NS c.root-servers.net. . 43331 IN NS d.root-servers.net. . 43331 IN NS e.root-servers.net. . 43331 IN NS i.root-servers.net. . 43331 IN NS h.root-servers.net. . 43331 IN NS j.root-servers.net. . 43331 IN NS a.root-servers.net. . 43331 IN NS m.root-servers.net. . 43331 IN NS b.root-servers.net. . 43331 IN NS l.root-servers.net. ;; Received 228 bytes from 202.106.196.115#53(202.106.196.115) in 43 ms com. 172800 IN NS g.gtld-servers.net. com. 172800 IN NS l.gtld-servers.net. com. 172800 IN NS j.gtld-servers.net. com. 172800 IN NS i.gtld-servers.net. com. 172800 IN NS m.gtld-servers.net. com. 172800 IN NS c.gtld-servers.net. com. 172800 IN NS a.gtld-servers.net. com. 172800 IN NS b.gtld-servers.net. com. 172800 IN NS f.gtld-servers.net. com. 172800 IN NS e.gtld-servers.net. com. 172800 IN NS k.gtld-servers.net. com. 172800 IN NS h.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 20201006050000 20200923040000 46594 . al9AIzVdatEYNdPM/MpuP4CEePiwG+x32ZfyfDVNqOV3kxn+BJL5hcy6 K4wQHIh8D0/DYdry9YBJgifagvopUg9cpMCQy0MUXYBHLd8mZNVuAm/J dEcCPyazYcdSADwEt5g9pB0q3uHs4aOwA8WBuenXIimLj2BvmvV9D0ug ObWZ2XLUL2BsstwCCNTlOIl9Ta/eaRcFCjbBY7aYTxzEn2V4X0KSphJG PYdrueJhXWathJyRhzh19Wx8igE421dLorg0uvxtTbpd/m1SGcCXINUf uU7UVqTkmJU8ad8EMWb3w2itG0/aL97Sq6F5CQcneO532aDxyXOFVQqu qxfsVA== ;; Received 1170 bytes from 192.112.36.4#53(g.root-servers.net) in 236 ms shifen.com. 172800 IN NS dns.baidu.com. shifen.com. 172800 IN NS ns2.baidu.com. shifen.com. 172800 IN NS ns3.baidu.com. shifen.com. 172800 IN NS ns4.baidu.com. CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN NSEC3 1 1 0 - CK0Q1GIN43N1ARRC9OSM6QPQR81H5M9A NS SOA RRSIG DNSKEY NSEC3PARAM CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN RRSIG NSEC3 8 2 86400 20200930044209 20200923033209 24966 com. xChJAuWE/feHPvOG0a2fHr1qGnFCaOWXM3/MAltsC/PS/IXbtuzmgIJZ brsIJCOQZpYusZkbSOJXatbHbUWvqwPrdq8jCKBTWwoSzQZSNWAryJ9u ydKMVHxQmJoUxaiaT8UStYCLRu4bYQj6h19mELbwNwg1QNTLfO65dfvF aMyhkIJ7DkTAWDppKtouPwJ+5JkTrxry+KwJTgNfChF6Ow== KVGUD00PTENU4GP7E28HK3ID4MNJC2R1.com. 86400 IN NSEC3 1 1 0 - KVGV1IRKIF70G85G8F5DGSVSBS8ER9J6 NS DS RRSIG KVGUD00PTENU4GP7E28HK3ID4MNJC2R1.com. 86400 IN RRSIG NSEC3 8 2 86400 20200930054744 20200923043744 24966 com. dlWpzj7NbxJ6+7yHxPr0zBBjAZcBk7UY4q4w0V6HgppnYsDs34sg1mx1 YoXw1T+qn1CBKrmloLrokWlJyDBNljw678RxLbgw/KL3pO5Hg4SWODk2 AUvLeOHMpRV8+GAotchu/AH+/BR+/5poP2nzP7c4ObbidAzs7j0ptu0c QXTD2KrqlFIRzAe8R7T7NTB3RgZdbdaQVAUuerq0txCxIA== ;; Received 730 bytes from 192.41.162.30#53(l.gtld-servers.net) in 230 ms shifen.com. 7200 IN A 202.108.250.218 shifen.com. 86400 IN NS ns1.baidu.com. shifen.com. 86400 IN NS ns3.baidu.com. shifen.com. 86400 IN NS ns2.baidu.com. shifen.com. 86400 IN NS ns4.baidu.com. ;; Received 197 bytes from 220.181.33.31#53(ns2.baidu.com) in 36 ms
发现shifen.com这个顶级域的域名服务器和baidu.com这个域的域名服务器都包括ns[2-4].baidu.com
用一个图来说明一下解析过程(猜想):
注:图中第三步的全世界只有13台是错误的。
以下内容为在虚拟机中搭建local dns服务器得到的实验数据,纠正上述结论
在上面的分析中,用dig工具进行了追踪,但是dig没有继续追踪当从baidu.com拿到cname和ns2.a.shifen.com的IP之后的事情。
我们就所以然的下结论认为local dns会向ns2.a.shifen.com请求www.a.shifenc.om。
其实这个想法是错误,在自己的本地搭建一个local dns,抓取整个解析过程中的所有数据包。
实际的结果是虽然dns.baidu.com返回了a.shifen.com域的服务器地址和IP,但是local dns并不是直接向上述返回的IP请求www.a.shifen.com,而是再一次去请求com域,得到shifen.com域的服务器(也就是baidu.com的那几台),然后又请求www.a.shifen.com,返回a.shifen.com的域的服务器,最后才是去请求www.a.shifen.com,虽然上面已经返回了IP,但是实验的结果就是再走一遍shifen.com域的查询。
上图就是localdns在解析www.baidu.com的抓包全过程。蓝色那条就是在收到cname和响应的a.shifen.com的域名服务器IP地址之后,继续向com域请求shifen.com。
这个图充分说明了返回cname的同时也返回了ns2.a.shifen.com的IP。
因此总结一下便是
①本机向local dns请求www.baidu.com
②local dns向根域请求www.baidu.com,根域返回com.域的服务器IP
③向com.域请求www.baidu.com,com.域返回baidu.com域的服务器IP
④向baidu.com请求www.baidu.com,返回cname www.a.shifen.com和a.shifen.com域的服务器IP
⑤向root域请求www.a.shifen.com
⑥向com.域请求www.a.shifen.com
⑦向shifen.com请求
⑧向a.shifen.com域请求
⑨拿到www.a.shifen.com的IP
⑩localdns返回本机www.baidu.com cname www.a.shifen.com 以及 www.a.shifen.com的IP
2、nslookup
例:
->nslookup www.baidu.com Server: 202.106.196.115 Address: 202.106.196.115#53 Non-authoritative answer: www.baidu.com canonical name = www.a.shifen.com. Name: www.a.shifen.com Address: 61.135.169.121 Name: www.a.shifen.com Address: 61.135.185.32
说明:
(1)、www.baidu.com的一个cname(别名)是www.a.shifen.com.
(2)、解析记录标记为非权威服务器的应答。
DNS-安全相关
1、DNS Log
dns在解析的时候会留下记录。
dnslog域名一般为随机产生且对应主机名为空,因为只有解析失败才能保证递归到授权的dns。
2、DNS域传送漏洞
漏洞描述:DNS服务器分为:主服务器、备份服务器和缓存服务器。在主备服务器之间同步数据库,需要使用“DNS域传送”。域传送是指后备服务器从主服务器拷贝数据,并用得到的数据更新自身数据库。若DNS服务器配置不当,可能导致匿名用户获取某个域的所有记录。造成整个网络的拓扑结构泄露给潜在的攻击者,包括一些安全性较低的内部主机,如测试服务器。凭借这份网络蓝图,攻击者可以节省很少的扫描时间。
检测方法:nslookup命令、nmap命令、dig命令
# nslookup命令
> nslookup # 进入交互式shell 默认服务器: UnKnown Address: 211.82.100.1 > server dns1.thnu.edu.cn # 设定查询将要使用的DNS服务器 默认服务器: dns1.thnu.edu.cn Address: 125.223.168.5 > ls thnu.edu.cn # 列出某个域中的所有域名
# nmap命令
nmap --script dns-zone-transfer --script-args dns-zone-transfer.domain=thnu.edu.cn -p 53 -Pn dns1.thnu.edu.cn
# dig命令
> dig thnu.edu.cn ns # 找到解析域名的dns服务器(Server服务器) ;; ANSWER SECTION: thnu.edu.cn. 2185 IN NS DNS1.thnu.edu.cn.
> dig axfr @dns1.thnu.edu.cn thnu.edu.cn # 向该域名发送axfr 请求
注:axfr 是q-type类型的一种: axfr类型是Authoritative Transfer的缩写,指请求传送某个区域的全部记录。