1. DNS的本质是什么
Domain Name System = DNS(域名系统)其实就是一个数据库,适用于TCP/IP程序的分层的,分布式的数据库,同时也是一种重要的网络协议。DNS存储了网络中的IP地址与对应主机的信息,邮件路由信息和其他网络应用方面的信息,用户通过询问解决库(解决库发送询问并对DNS回应进行说明)在DNS上查询信息。
1.1 DNS的作用是什么
DNS是网络分层里的应用层协议,事实上他是为其他应用层协议工作的,简单来说就是把域名,或者说主机名转化为IP地址(同时也提供反向域名查询功能),类似字典,比如访问www.baidu.com实际访问的是它的IP地址,因为机器识别的是拥有固定格式和含义的IP地址,而域名却是千奇百怪,甚至可以是中文,不利于识别。还有比如公司内部的域验证,通过分配给员工的域账号登录内网就必须通过DNS来找到域名权限服务器,来认证身份,故有些书上说:DNS是Internet里不可缺少的东西。
1.2 使用host命令进行DNS查询
host命令用来DNS查询。如果命令参数是域名,则输出关联的IP;如果命令参数是IP,则输出关联的域名。
[root@study ~]# host www.baidu.com
www.baidu.com is an alias for www.a.shifen.com.
www.a.shifen.com has address 110.242.68.3
www.a.shifen.com has address 110.242.68.4
[root@study ~]# host 110.242.68.3
3.68.242.110.in-addr.arpa domain name pointer www.baidu.com.
1.3 为什么叫域名系统(DNS),什么是域名
人和人要相互认识,需要名字作为辅助,而对于网络世界,在Internet内也需要一种命名系统来做类似的事情,该系统使用了域来划分,任何一个网络里的主机(或者路由器)都有独一无二的域名(类似国家代码),域又能继续划分为子域(类似每个国家有不同的省份),子域还能继续划分(每个省都有自己的各个城市的代码)......在Internet内对应的就是顶级域名(com,net,cn,org等等),二级域名......注意这仅仅是一种逻辑的划分。而这些域名系统在形式上组成了一种树结构。
比如www.baidu.com其中com是顶级域名,baidu是二级域名。
名字(也叫标号)组成只能是英文或者数字,目前中文也支持了,长度不大于63个字符,总共完整的域名长度不超过255个字符,英文域名不区分大小写,从右到左,域名级别以此降低。www表示的是万维网,不属于域名。
1.4 域名空间树结构
域名被组织成一种树形结构被存储在DNS中,树的每一个节点就是一个域,域名就是这个节点到根的连接词,根没有名字,各个树叶是单台计算机的主机名(host name),不能继续划分。
1.5 域名服务器
DNS服务器管理范围的单位是区,不是域,因为区才是DNS服务器管理的实际范围,区是域的子集,同一个区里的主机节点必须互通,它们都有一个统一的访问权限,该访问权限再通过一个权限域名服务器管理。比如,公司a,有两个部门x,y,部门x又有两个分部q和r,a会设立一个区叫a.com(区和域可以同名),这是一个大的权限范围,然后下属再设立一个区,叫x.a.com,那么区a.com和x.a.com都属于域a.com。
区的起点是树形结构中的节点,终点是,从起点向下延伸到叶子结点,或者另一个节点,区中的信息都存储在DNS域名服务器中。
DNS服务器也是类似域名空间树一样的树结构,依次分为根域名服务器(知道所有的顶级域名服务器的域名和IP,最重要,它要是瘫痪,整个DNS就会完蛋),然后是顶级域名服务器(管理二级域名),其次是权威域名服务器(负责区的域名服务器)。
最后是本地域名服务器(也叫默认域名服务器),本地域名服务器离主机很近(书上说不超过几个路由器),速度很快,其实本地域名服务器本质不属于域名服务器架构。下面就是Linux的本地域名服务器配置:
cat resolv.conf
下面是Windows下本地DNS服务器配置
1.6 分布式域名系统
因为Internet规模很大,所以整个Internet网只使用一个域名服务器是不行的。为了可靠,使用了分布式的域名系统,即使单个计算机出了故障,也不会妨碍整个DNS系统的正常运行。并采用C/S方式。DNS使大多数名字都在本地解析(resolve),仅有少量解析需要在Internet网上通信,因此分布式DNS系统借助分布式的主机备份和缓存机制,非常强壮和有足够的性能。
1.7 DNS劫持及解决办法
DNS劫持又称为域名劫持,说白了就是当用户请求DNS解析的时候,对正常的DNS请求报文进行拦截,偷到请求的域名,然后做一些手脚,比如常常遇到访问某个健康的网址的时候,明明输入的是xxxx.com,结果却跳转到不可描述的网站......即把审查范围,或者权限范围以外的请求放行,否则返回假的IP地址或者什么都不做,使请求失去响应,效果就是让人误以为断网(360网络诊断里面经常说的,打得开QQ,但是无法浏览网页的现象),或者得到假网站,黑客们经常利用漏洞或者程序的缺陷对用户的DNS进行篡改,进行钓鱼网站的欺诈活动。
解决办法可以手动修改本地DNS服务器地址,首选DNS服务器:114.114.114.114,是国内第一个,全球第三个开放的DNS服务器地址,又称为114DNS。或者8.8.8.8(google提供的DNS服务器)等,然后修改宽带密码,路由器密码,主机密码。
2.域名到IP地址的解析过程
当一个应用程序需要把主机名解析为IP地址时,该应用程序就调用地址解析程序,它自己就变成DNS的一个客户,把待解析的域名放在DNS的请求报文中,以UDP方式先发送给本地域名服务器,本地域名服务器在查找域名之后,把对应的IP放在回答报文中返回,应用程序获得目的主机的IP地址后即可以进行通信。若本地域名服务器不能回答该请求,则此域名服务器就暂时成为DNS的另一个客户,并向其他域名服务器发出查询请求。这种过程直到找到能够回答该请求的域名服务器为止。
2.1 域名解析过程
查询方式一般分为两种:递归查询,迭代查询
主机向本地域名服务器的查询一般都是采用递归查询
如果主机查询的本地域名服务器不知道被查询的域名的IP地址,那么本地域名服务器就以DNS客户端的身份(递归思想),向根域名服务器继续发出查询报文(替主机查询),不让主机自己进行查询。递归查询返回的结果或者是IP,或者是报错。这是从上到下的递归查询的过程。
本地域名服务器向根域名服务器查询一般采用迭代查询
当根域名服务器收到本地域名服务器的查询请求,要么给出IP,要么通知本地域名服务器下一步应该去请求哪一个顶级域名服务器查询(并告诉本地域名服务器自己知道的顶级域名的IP),让本地域名服务器继续查询,而不是替他查询。同理,顶级域名服务器无法返回IP的时候,也会通知本地域名服务器下一步向谁查询(即查询哪一个权限域名服务器)......这是一个迭代过程。
到底采用哪种查询,取决于原始查询报文的设置,不绝对。
2.2 DNS缓存
DNS中使用了高速缓存,因为域名到地址的映射不常变,故为提高效率而设,主机再启动时候从本地域名服务器下载域名和地址的全部数据,并维护存放自己最近使用的域名的缓存,并且只在缓存中找不到名字时才使用根域名服务器发起查询。实际中,当一个DNS服务器接收到一个DNS回答后,会将其信息缓存一段时间,当再有一个对相同域名的查询时,便可直接回复,通过DNS缓存,大部分查询都只需要本地DNS服务器便可以完成解析。
DNS缓存污染,本地域名服务器在接受到DNS请求时,先查找DNS缓存,如果缓存命中直接返回结果,如果黑客攻击路由器,对部分域名的缓存进行了更改,比如将缓存的结果指向不可描述的页面,那么即导致用户的正常请求被转移......,此时可以清除各级缓存(浏览器,系统,路由器,DNS缓存)。貌似无法避免,只能是提高安全意识,即使使用了HTTPS也不行,因为DNS解析过程发生在HTTPS请求交互之前。
2.3 hosts文件
hosts文件是一个没有扩展名的系统文件,作用是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”,其实hosts文件可以看做一个小型的本地DNS服务器。
cat /etc/hosts
2.4 实际上网时域名的解析过程
优先顺序是:当用户在地址栏上输入一个URL之后,浏览器首先查询浏览器的缓存,找不到就去查询hosts文件和本地DNS缓存,如果hosts文件和本地DNS缓存都没有找到域名对应的IP,则自动进入路由器的缓存中检查,以上均为客户端DNS缓存,若在客户端DNS缓存还是没找到,则进入ISP DNS缓存中查询,还是找不到,最终才向根DNS服务器发出DNS查询报文,再找不到就报错......
3.IP地址到域名的反向域名查询
| 报文头 | |
| 问题 | 向服务器提出的查询记录 |
| 回答 | 服务器回复的资源记录 |
| 授权 | 权威的资源记录 |
| 格外的 | 格外的资源记录 |
| 哎,这个报文格式和名字也是醉了,不过不碍事,当在浏览器内输入URL时,便开始了DNS解析过程,最后会把找到后的IP地址告知浏览器客户端,方便它继续发出HTTP(s)请求,该过程中,浏览器提出的查询记录类型叫A记录(address)查询,其他查询记录类型常见的有A(地址)记录,CNAME(别名)记录,MX(邮件交换)记录等。 | |
比如问:www.baidu.com的A记录是什么?是 220.181.110.181 这个A记录意思是从域名解析得到IP地址。那么反过来,从IP地址得到域名的解析过程也需要一个记录,叫PTR记录(和A记录功能相反),可以使用nslookup命令查询,可以通过查询IP地址的PTR记录来得到该IP地址指向的域名,达到反查的目的。 |
3.1反向域名查询和垃圾邮件过滤
IP反向解析主要应用到邮件服务器中来阻拦垃圾邮件,比如用xxx@xxx.com给邮箱xxxxx@qq.com发了一封邮件,qq邮件服务器会查信头文件,信头文件显示信是由哪个IP地址发出的,然后根据IP地址反向解析,如果反向解析到这个IP所对应的域名是xxx.com(不在黑名单中)那么就接受,否则就拒绝。
3.2了解反向域名arpa
域名系统中,一个IP地址可对应多个域名,在Internet上是不会去傻傻的遍历整个域名树的。故DNS的顶级域名提供了一个特别的顶级域——arpa用来做反向域名解析,也称为反向域名。当一个主机加入网络,获得DNS授权,它的IP地址假设是192.168.1.1它也顺便获得了对应IP的in-addr.arpa(逆向解析域in-addr.arpa)空间的授权,注意DNS名由树底部向上组织,故它的DNS名字为192.168.1.1.in-addr.arpa。IP地址的第一个字节一定位于in-addr的下一级。这样欲解析的IP地址就会被表达成一种像域名一样的形式,后缀以反向解析域名in-addr.arpa结尾。
本质上:反向域名解析是将IP地址表达成一个域名,这样反向解析的很大部分可以纳入正向解析中。
4.抓包分析的具体解析过程
如上是通常情况下的DNS报文,基于UDP数据报封装(同事DNS也支持TCP),并且要知道DNS服务器的默认端口是53
4.1 ping一个主机然后开始抓包
ping www.baidu.com
观察出现的数据包
如图,第一行是DNS查询报文,第二行是DNS回答报文。
证实了,DNS确实为应用层的协议,目的端口号确实是53,传输层一般情况下采用UDP也是OK的,网络层是IP协议,数据链路层有以太网帧。
5.DNS使用的网络层协议
DNS同时支持UDP与TCP访问,当名字解析器发出一个查询请求,并且返回相应报文中的TC位置为1时,名字解析器通常使用TCP重发原来的查询请求,TCP能将用户的数据流分为一些报文段,用多个报文段来传送任意长度的用户数据,即允许返回的响应超过512个字节。
此外,为了减轻单台DNS服务器的负载,有时要将同一DNS区域的内容保存在多个DNS服务器中(主从备份,分布式存储),这时,就要用到DNS的“区域传输”功能,在分布式的DNS的数据库中,当一个域的辅助名字服务器在启动时,将从该域的主名字服务器执行区域传送。辅助服务器将定时(通常是3小时)向主服务器进行查询以便了解主服务器数据是否发生变动,如果有变动,为了数据的一致性,将执行一次区域传送,区域传送将使用TCP,因为传送的数据远比一个查询或者是响应多很多。
故DNS主要使用UDP为主,TCP为辅,如果是UDP,那么无论是名字解析器还是名字服务器都必须自己处理超时和重传。此外,DNS不像其他的使用UDP的应用一样,大部分操作集中在局域网上,DNS查询跟响应通常经过广域网。分组丢失率和往返时间的不确定性在广域网上比局域网上更大。这样对于DNS客户程序,一个好的重传和超时程序就显得尤为重要。
DNS服务器使用的熟知的端口号无论对UDP还是TCP都是53。
6.本地私有DNS服务器的搭建
BIND(Berkeley Internet Name Domain)是DNS协议的一个实现,提供了DNS主要功能的开放实现,包括
- 域名服务器
- DNS解析库函数
- DNS服务器运行调试所有的工具
BIND是一款开源的DNS服务器软件,由美国加州大学Berkeley分校开发和维护,按照ISC的调查报告,BIND是世界上使用最多最广泛的域名服务系统,通过搭建私有的DNS服务器,可以把国外的一些不可描述的IP地址放到自己的DNS服务器中畅快浏览。
接下来会写一篇详细介绍使用BIND9+MySQL搭建智能DNS的文章,CDN用的那种。