DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。
主机名到IP地址的映射有两种方式:
1)静态映射,每台设备上都配置主机到IP地址的映射,各设备独立维护自己的映射表,而且只供本设备使用;
2)动态映射,建立一套域名解析系统(DNS),只在专门的DNS服务器上配置主机到IP地址的映射,网络上需要使用主机名通信的设备,首先需要到DNS服务器查询主机所对应的IP地址。
域名结构
通常 Internet 主机域名的一般结构为:主机名.三级域名.二级域名.顶级域名。 Internet 的顶级域名由 Internet网络协会域名注册查询负责网络地址分配的委员会进行登记和管理,它还为 Internet的每一台主机分配唯一的 IP 地址。全世界现有三个大的网络信息中心: 位于美国的 Inter-NIC,负责美国及其他地区; 位于荷兰的RIPE-NIC,负责欧洲地区;位于日本的APNIC ,负责亚太地区。
根域:DNS域名中使用时,规定由尾部句点(.)来指定名称位于根或者更高级别的域层次结构
顶级域:用来指示某个国家/地区或组织使用的名称的类型名称,如.com
二级域名:个人或组织在Internet上使用的注册名称,如qq.com
子域:已注册的二级域名派生的域名,通俗的讲就是网站名,如www.qq.com
主机名:通常情况下,DNS域名的最左侧的标识网络上的特定计算机,如h1.www.qq.com
常见的顶级域服务器
我国的顶级域名也只有cn
DNS的解析过程
第一步,查询本地host文件和缓存有没有这个记录,有就直接解析,没有就访问DNS服务器,如果DNS服务器上没这个域名或者域名不在你访问的DNS服务器管理区域内,那么DNS服务器就会向dot根域名服务器发递归查询,如果找到了记录了,DNS就会返回给client,并且把记录保存在自己缓存里,下次有client请求,他就会调用自己的缓存,直到这条记录的生存期结束,就会丢弃这条记录。
根域名服务器就13台域名服务器,他负责管理顶级域。顶级域负责管理二级域,我们现在申请的一般是2级域名-3级域名。
用 nslookup 这个工具详细来说一下解析步骤:
从上图我们可以看到:
第一行Server是:DNS服务器的主机名--114.114.114.114
第二行Address是: 它的IP地址--114.114.114.114#53
下面的Name是:解析的URL-- www.baidu.com
会发现百度有一个cname=www.ashifen.com的别名
用dig工具来跟踪一下(linux系统自带有)
Dig工具会在本地计算机做迭代,然后记录查询的过程。
第一步是向我这台机器的ISPDNS获取到根域服务区的13个IP和主机名
第二步是向其中的一台根域服务器(Servername就是末行小括号里面的)发送www.baidu.com的查询请求,他返回了com.顶级域的服务器IP(未显示)和名称
第三步,便向com.域的一台服务器192..5.5.241请求,www.baidu.com,他返回了baidu.com域的服务器IP(未显示)和名称,百度有四台顶级域的服务器
第四步呢,向百度的顶级域服务器(202.108.22.220)请求www.baidu.com,他发现这个www有个别名,而不是一台主机,别名是www.a.shifen.com。
使用dig +trace shifen.com,发现第三步时shifen.com这个顶级域的域名服务器和baidu.com这个域的域名服务器是同一台主机
当拿到www.baidu.com的别名www.a.shifen.com的时候,我本来需要重新到com域查找shifen.com域的NS,但是因为这两个域在同一台NS上,所以直接向本机发起了。
Linux DNS服务介绍
后台进程:named
脚本:/etc/rc.d/init.d/named
使用端口:53(tcp,udp)
配置文件:/var/named/chroot/etc/named.conf
相关路径:/var/named/
安装bind服务器
yum install bind* (先配置yum源,yum源之前的实验已经配置完成了)
- vim /etc/yum.repos.d/base.repo
- [RHEL6]
- name= base
- baseurl=file:///mnt/cdrom
- enabled=1
- gpgcheck=0
- 保持退出
BIND是一种开源的DNS(Domain Name System)协议的实现,包含对域名的查询和响应所需的所有软件。它是互联网上最广泛使用的一种DNS服务器,BIND这个缩写来自于使用的第一个域,Berkeley Internet Name Domain
BIND软件包包括三个部分:
DNS服务器。这是一个叫做named的程序,代表name daemon的简写。它根据DNS协议标准的规定,响应收到的查询。
DNS解析库(resolver library)。一个解析器是一个程序,通过发送请求到合适的服务器并且对服务器的响应做出合适的回应,来解析对一个域名的查询。一个解析库是程序组件的集合,可以在开发其它程序时使用,为这些程序提供域名解析的功能。
/etc/named.conf
named.conf是BIND使用的默认配置文件
在每一次named启动与挂起时都会被读取
一个简单的文本文件,其中记录的可以包括options(全局参数)、zone(区域定义)、access control lists(访问控制列表)等
- 常用的参数包括
- directory:指定zone file的存放位置
- forwarders:指定其上级域名服务器
- allow-query:指定允许向其提交请求的客户
- allow-transfer:指定允许复制zone数据的主机
根域
- 修改主配置文件/etc/named.conf
- listen-on port 53 { 127.0.0.1; };
- 监听端口,修改成自己的IP地址,如果有多个IP,就写多个,也可以写any,每行要以;结束。
- directory "/var/named";
- zone文件的存放目录,这里的/var/named 是相对目录,在chroot环境下/var/named目录下。
- allow-query { localhost; };
- 允许查询的client,我们修改成any
区域配置(zone )
zone 语句作用是定义DNS 区域,在此语句中可定义DNS 区域选项
zone区域设置,第一步,设置根区域
当DNS服务器处理递归查询时,如果本地区域文件不能进行查询的解析,就会转到根DNS服务器查询,所以在主配置文件named.conf文件中还要定义根区域。 (默认即可)
- “.” 意思的根区域
- IN 是internet记录
- type是类型 根的类型是hint
- file是根区域文件
指定正向解析的配置文件
修改DNS服务器的辅助区域配置文件/etc/named.rfc1912.zones
用//注销掉系统默认配置的zone信息所有行或者删除
在文件的尾部增加以下内容
配置正向解析zone文件
将范例复制到正向解析文件,-p可以将源文件的属性一起复制
- TTL是生存期,单位是秒
- $TTL是全局定义的
- 第二行 SOA记录,@取代在/etc/named.conf中指定的域名。
- SOA段中的数字,分别为:序列号、刷新、重试、过期、生存期
- 序列号:序列号用于DNS数据库文件的版本控制。每当数据被改变,这个序列号就应该被增加。
- 刷新:从服务器向主服务器查询最新数据的间隔周期。每一次检查时从服务器的数据是否需要更改,则根据序列号来判别。
- 重试:一旦从服务器尝试连接主服务器失败,下一次查询主服务器的延迟时间。
- 过期:如果从服务器无法连通主服务器,则在经过此时间后,宣告其数据过期。
- 生存期:服务器回答 ‘无此域名’ 的间隔时间。
- 数字的默认单位为秒。否则:W= 周、D= 日、H= 小时、M= 分钟。
- NS(name server):设置域名服务器的域名
- IN 是internet记录
service named restart 重新启动DNS服务
service iptables stop 关闭防火墙
测试DNS解析
使用nslookup测试下。
经过简单的了解和配置DNS服务,应该知道DNS的工作原理了。
DNS分为Client和Server,Client扮演发问的角色,也就是问Server一个Domain Name,而Server必须要回答此Domain Name的真正IP地址。而当地的DNS先会查自己的资料库。如果自己的资料库没有,则会往该DNS上所设的的DNS询问,依此得到答案之后,将收到的答案存起来,并回答客户。
DNS服务器会根据不同的授权区(Zone),记录所属该网域下的各名称资料,这个资料包括网域下的次网域名称及主机名称。
在每一个名称服务器中都有一个快取缓存区(Cache),这个快取缓存区的主要目的是将该名称服务器所查询出来的名称及相对的IP地址记录在快取缓存区中,这样当下一次还有另外一个客户端到次服务器上去查询相同的名称 时,服务器就不用在到别台主机上去寻找,而直接可以从缓存区中找到该笔名称记录资料,传回给客户端,加速客户端对名称查询的速度。
常见的DNS攻击包括:
1) 域名劫持
通过采用黑客手段控制了域名管理密码和域名管理邮箱,然后将该域名的NS纪录指向到黑客可以控制的DNS服务器,然后通过在该DNS服务器上添加相应域名纪录,从而使网民访问该域名时,进入了黑客所指向的内容。
这显然是DNS服务提供商的责任,用户束手无策。遇到dns被劫持,让dns服务提供者解决这个问题,是比较矛盾的;因为,劫持者,最有可能的就是他们;另外一种最直接的解决办法就是换用其他dns。更换dns服务器的方法非常简单,打开网络连接属性,选择Interner 协议(TCP/IP)的属性页里,不要选择自动获取DNS,而要选择“使用下面的DNS服务器地址”,推荐大家使用OpenDNS提供的DNS服务器,OpenDNS是一个提供免费DNS服务的网站,口号是更安全、更快速、更智能。
2) 缓存投毒
DNS缓存投毒攻击是指攻击者欺骗DNS服务器相信伪造的DNS响应的真实性。这种类型攻击的目的是将依赖于此DNS服务器的受害者重定向到其他的地址。随着恶意软件传播的增多,缓存投毒的方法也层出不穷。典型的一种是发送标题吸引人的垃圾邮件并诱导你去打开。点击邮件中的图片和广告条幅也会将用户指向被投毒的网站。一旦用户的电脑被恶意代码感染,他今后所有的URL请求都将被自动指向恶意IP地址-哪怕被指向的“受害”服务器已经在其网页上清除了恶意代码。
防止投毒
目前还没有更好办法阻止黑客的这种行为,只有使DNS缓存服务器发出的查询请求使用动态的UDP端口,UDP的端口号也是16位2进制,这样,与DNS的ID号相结合,号码的命中率就是1/4294967296(2的32次方)。
3)DDOS攻击
一种攻击针对DNS服务器软件本身,通常利用BIND软件程序中的漏洞,导致DNS服务器崩溃或拒绝服务;另一种攻击的目标不是DNS服务器,而是利用DNS服务器作为中间的“攻击放大器”,去攻击其它互联网上的主机,导致被攻击主机拒绝服务。
为了让DNS拒绝服务,恶意攻击者向允许递归的开放DNS解析器发送大量伪造的查询请求。目前互联网中存在着上百万开放的DNS解析器,包括很多的家庭网关。开放的DNS解析器会认为这些伪造的查询请求是真实有效的,并且会对这些请求进行处理,在处理完成之后,便会向伪造的请求者(即,受害人)返回DNS响应信息。如果查询请求的数量巨大,DNS服务器很有可能会发送大量的DNS响应信息。这也就是我们常说的放大攻击,这种方法利用的是DNS解析器中的错误配置。由于DNS服务器配置错误,那么DNS解析器很可能会在接收到一个非常小的DNS查询请求之后,向目标主机返回大量的攻击流量。在另一种类型的攻击中,是向DNS服务器发送未经许可或不符合规则的查询请求来进行攻击。
防御DDOS攻击
不允许未经过请求的DNS响应
丢弃快速重传数据包
丢弃异常来源的DNS请求和响应
创建白名单,添加允许服务器处理的合法请求信息
启动DNS客户端验证
使用ACL的权限
上面所说的攻击,其实并不在我们的可控范围之内,内网的入侵,大家首先都会想到中间人攻击,中间人攻击,也就会想到DNS欺骗和ARP欺骗了。
4) DNS欺骗
DNS欺骗就是攻击者冒充域名服务器的一种欺骗行为。
原理:如果可以冒充域名服务器,然后把查询的IP地址设为攻击者的IP地址,这样的话,用户上网就只能看到攻击者的主页,而不是用户想要取得的网站的主页了,这就是DNS欺骗的基本原理。DNS欺骗其实并不是真的“黑掉”了对方的网站,而是冒名顶替、招摇撞骗罢了。
现在的Internet上存在的DNS服务器有绝大多数都是用bind来架设的,使用的bind版本主要为bind 4.9.5+P1以前版本和bind 8.2.2-P5以前版本.这些bind有个共同的特点,就是BIND会缓存(Cache)所有已经查询过的结果,这个问题就引起了下面的几个问题的存在.
DNS欺骗就是攻击者冒充域名服务器的一种欺骗行为。 原理:如果可以冒充域名服务器,然后把查询的IP地址设为攻击者的IP地址,这样的话,用户上网就只能看到攻击者的主页,而不是用户想要取得的网站的主页了,这就是DNS欺骗的基本原理。DNS欺骗其实并不是真的“黑掉”了对方的网站,而是冒名顶替、招摇撞骗罢了。
DNS欺骗的防范
DNS欺骗是很难进行有效防御的,因为大多情况下都是被攻击之后才会发现,对于避免DNS欺骗所造成危害,本菜鸟提出以下建议
1.因为DNS欺骗前提也需要ARP欺骗成功。所以首先做好对ARP欺骗攻击的防范。
2.不要依赖于DNS,尽管这样会很不方便,可以使用hosts文件来实现相同的功能(但首先确保host文件没有被修改)
3.使用安全检测软件定期检查系统是否遭受攻击
4.使用DNSSEC。DNSSEC是替代DNS的更好选择,它使用的是数字前面DNS记录来确保查询响应的有效性,DNSSEC还没有广泛运用,但是已被公认为是DNS的未来方向,也正是如此,美国国防部已经要求所有MIL和GOV域名都必须开始使用DNSSEC。