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.
来源: http://server.51cto.com/sSecurity-570488.htm