您的位置:首页 > 运维架构 > Linux

Linux系统下搭建DNS服务器——DNS原理总结

2017-03-09 15:40 267 查看
2017-01-07 整理

DNS原理

域名到IP地址的解析过程

IP地址到域名的反向域名解析过程

抓包分析DNS报文和具体解析过程

DNS服务器搭建和配置

这个东东也是今年博主参见校招的时候被很多公司问过的,虽然理论性比较强,但是作为一个程序员,个人认为熟悉DNS是非常重要的,要理解它并能帮助解决一些实际问题。

面试实录

打开一个URL,在网络层面都发生了哪些事情?(当中说到了DNS原理,这个是绕不过的)

用过 Linux 么?你用它平时都做什么事情啊?(首先是在该环境下写代码,搭建过一些集群,当然还有一些服务器的搭建,比如本文内容)

DNS 是基于 TCP 还是 UDP 的?端口号是多少?

具体忘了,说到了负载均衡的请求分发(聊了DNS的分发功能)

什么是DNS劫持?

虽然当时回答了,但是还是感觉得系统总结下,备忘。

DNS原理和理解

DNS的本质是什么?

Domain Name System = DNS(域名系统)其实是一个数据库,是用于 TCP/IP 程序的分布式数据库,同时也是一种重要的网络协议。DNS储存了网络中的 IP 地址与对应主机的信息,邮件路由信息和其他网络应用方面的信息,用户通过询问解决库(解决库发送询问并对DNS回应进行说明)在 DNS 上查询信息。

DNS的作用是什么?

DNS是网络分层里的应用层协议,事实上他是为其他应用层协议工作的,简单说就是把域名,或者说主机名转化为IP地址(同时也提供反向域名查询的功能),类似字典,比如访问 www.baidu.com,实际访问的是它的IP地址,因为机器识别的是拥有固定格式和含义的IP地址,而域名可以千奇百怪,甚至是中文,不利于识别。还有比如公司内部的域验证,通过分配给员工的域账号登录内网就必须通过DNS来找到域名权限服务器,来认证身份,故有些书上说:DNS是因特网世界里不可缺少的东西。

比如,使用host命令进行DNS查询

host
View Code

然后是查询的问题数

View Code
以上是12字节的DNS包头

然后是DNS的报文身体部分(问题or回答部分)

+---------------------+
| 报文头 |
+---------------------+
| 问题  | 向服务器提出的查询记录
+---------------------+
| 回答  | 服务器回复的资源记录
+---------------------+
| 授权 | 权威的资源记录
+---------------------+
| 格外的 | 格外的资源记录
+---------------------+

Queries为查询或者响应的正文,如下是请求报文里的问题部分

View Code

下面看DNS响应报文

View Code

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熟知的端口号

DNS服务器使用的熟知端口号无论对UDP还是TCP都是53

本地私有 DNS 服务器搭建

BIND (Berkeley Internet Name Domain)是DNS协议的一个实现,提供了DNS主要功能的开放实现,包括

域名服务器 (named)

DNS 解析库函数

DNS 服务器运行调试所用的工具

Bind 是一款开源的 DNS 服务器软件,由美国加州大学 Berkeley 分校开发和维护的,按照 ISC 的调查报告,BIND 是世界上使用最多最广泛的域名服务系统,通过搭建私有的 DNS 服务器,可以把国外的一些不可描述的 ip 地址放到自己的 DNS 服务器中畅快浏览。

安装环境本地ubuntu,客户端和服务器都是使用的一台机器

安装配置BIND

View Code

配置 DNS 主服务器(最好是设置主备)

View Code
ACL_百度百科

服务器环境测试

View Code

重启 BIND

View Code

配置 DNS 客户端

找一台机器作为DNS客户端,将客户端的 DNS 修改为刚刚搭建的DNS服务器的 ip 地址

View Code

使用nslookup验证

使用nslookup来查询服务器(若使用其他的客户端, ip 地址 需要加入到 "trusted" ACL 里面)。

View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: