DNS(Domain Name System, 域名系统),一种因特网通信协议的名称,它基于伯克利大学开发出的一套阶层式管理主机名对应IP的软件BIND,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。
这个阶层式管理软件采用目录树结构,类似Linux文件系统,顶层是root根服务器,然后第二次是
.com
、.edu
、.gov
、.mil
、.org
、.net
这些常见的,其代表意思分别如下:
名称 | 代表意义 |
---|---|
com | 公司、行号、企业 |
org | 组织、机构 |
edu | 教育单位 |
gov | 政府单位 |
net | 网络、通信 |
mil | 军事单位 |
DNS协议运行在UDP协议之上,因此使用的53号端口,当没有办法查询到完整的信息时,就会再次以TCP协议来查询,因此,防火墙需要放行TCP、UDP的53号端口,端口号可以在/etc/services
文件查看到:
一个正解或一个反解可以称为一个Zone。因为根域是root,因此一台正解DNS服务器,有两个Zone:其一就是root(.)代表的Zone->hint,其二就是关于自己域的正解Zone。
以主机www.linjk.cn为例:
命令输出主要有2部分:
* QUESTION SECTION
显示所要查询的内容,这里我是需要查询www.linjk.cn的IP地址,所以后面有一个A
* ANSWER SECTION
刚刚我查询的返回结果,A
结果为182.254.229.254
如果需要反解一个IP地址对应得主机名,如下操作:
因为这个IP地址是云服务提供商给我分配的,不被我拥有,所以无法查询到结果。
当我们想要查询某个域是被谁管的,也就是注册这个域名的用户的相关信息,不过,因为这个命令输出信息较详细,为了保护用户隐私,命令输出结果不见得完全正确,仅供参考。查询命令如下:
注意,不要有主机名www,我们是去查主机名的上一层:域。
resolv.conf
文件是ISP的DNS服务器IP记录处,我使用的Mac电脑的这个文件内容如下:
这里指定了我这台电脑解析主机名时去哪台DNS服务器查,也可以配置多一个,如增加一个通用的DNS服务器:nameserver 168.95.1.1,但是建议不要设置超过3个,在网络出现问题,电脑会向每台DNS服务器发出连接请求而每次连接都有timeout时间的等待从而导致浪费很多时间,一般两个就可以了。
这里看到第10行,说明该文件是自动生成的,因为我电脑使用的DHCP方式上网,因此系统会主动使用DHCP服务器传来的数据进行系统配置文件的修订,因此,这种情况如果自己增加了一个服务器,可能会被刷新掉,可以告诉系统不要使用DHCP传来的值进行设置。
上面介绍了DNS的一些简单概念与命令,现在就开始搭建它吧。按照我的国际惯例,都是全新安装一个最小化的Linux系统,从零开始配置,系统就使用Centos7吧,安装方式采用最小化安装,实际使用过程中缺啥包再安装就是了:
这个过程对于学习过Linux的人来说都不难了,过程就不截图了,自个安装就ok了,安装完后,为了操作方便,使用ssh登录方式进行操作:
习惯性的,安装完系统后,首先执行sudo yum update
进行系统软件更新先,另外,还需要备份系统关键命令和一些防火墙配置,这里只是演示DNS服务器的搭建,这些就略过了。
前面说到,DNS只是一种协议,真正提供服务的是bind软件,因此,现在来安装它:
sudo yum install bind-utils bind bind-chroot
为了提高安全性,通过bind-chroot来指定bind程序的根目录,centos6.x版本以上,目录为/var/named/chroot:
安装后有几个目录或文件是需要记得的:
* /etc/named.conf: 主配置文件
* /etc/sysconfig/named: 配置是否启动chroot及额外的参数
* /var/named: 数据库文件存放目录,存放主机名对应ip的文件
* /var/run/named: named程序执行时pid-file文件存放目录(在ubuntu系统中,目录为/run/named)
知道了这几个重要配置文件和目录后,下面开始配置:
* 主配置文件named.conf
修改/etc/named.conf文件为如下所示:
重点说明:
21行: 该设置值与Master/Slave DNS服务器之间的数据库传送有关,如果暂时没有Slave服务器,不要开启。
29~32行,这里增加一个centos.linjk
的Zone,指定了其类型和zone file文件名称为named.centos.linjk
,这里配置其为master DNS服务器。
接着新建并配置named.centos.linjk
这个zone file文件,其路径位于/var/named:
重点说明:
1行: 为了简化每笔RR记录的设置,将TTL挪到最前面统一设置,这里设置DNS缓存在对方服务器的时间为600秒
3行:DNS服务器名称
4行:DNS服务器的IP
7~9行:因为192.168.1.112这台主机有多个用途,这里根据CNAME别名配置了多个主机名指向同一个IP
10~11行:这里配置一个域名对应多个IP
后面根据实际需要,增加主机名到IP的映射即可,格式为
[主机名] IN A [IP地址]
如果命令
netstat
没找到,安装net-tools
包即可(也可用ss -lnt
命令)。
接着看看日志,出现如下错误信息:
因为127.0.0.1的我没配置,所以问题不大,暂时不解决。下面看看解析的结果:
对比刚刚的zone file文件named.centos.linjk
,可以看到主机名和IP映射都是对的。
注意:这里的dig命令我加了
@192.168.1.112
来指定使用指定DNS服务器来进行解析,否则会默认使用/etc/resolv.conf配置的来解析,另外也可以把192.168.0.112这台机加到/etc/resolve.conf里,这样就不用加参数了。
最后还有两点需要注意:
1. 默认DNS服务器监听在53端口,很明显,这是通用的一个协议,在网络上其他DNS主机监听到你有数据库需要更新的话,就会给你同步数据,造成网络带宽占用增加,我曾经就试过,因此,需要更改默认监听端口,这样就没事了,如下13和14行:
此时,如果使用dig命令,还需指定端口信息,加-p
参数:
到这里,一个很基本的DNS服务器就搭建完成了,当然,还有很多事情要做,这里仅仅测试,就不做了,例如:
- 为了不间断提供DNS服务,最好需要2台DNS服务器来提供查询功能,且它们最好分散在不同IP,这样不会因网络中断造成影响
- 通常会配置一台主Master,1台或1台以上Slave DNS服务器
这些用到再查看文档自己配置即可,也不是很难。