DNS(domain name system)是用户上网的基础服务,由于IP地址纯数字的特点,使得人们很难记住一个网站真实的IP地址,就如同人们很难记得某某的手机号码是多少。那如何解决这个问题呢?直观的办法就是创建一个“联系人”的功能,将“人名”字段与“电话号码”字段进行关联,例如小明-13534567890;小红-13534567891,这样,人们在拨打电话的时候,只需要记得人名,无需记得每个人的电话号码,与此类似,DNS应运而生。类似上述例子,域名解析要做的就是将难记的IP地址如42.245.252.152,打一个备注:www.jianshu.com,这时候,简书的拼音是远远比一长串数字更方便记忆。
如果各位对于dns的基本概念存在疑问,建议花一段时间先学习一下维基百科dns的知识。笔者一直强调基础知识的重要性。
domain name system用做域名解析的实质是存了一张域名对应IP地址的关系表,网络中客户端进行查询时就会来查这一张表,并在表中得到需要的IP地址信息。如何搭建和维护这一张表,就是笔者要做的内容。
bind是目前主流的dns开源软件,这节笔者尝试使用bind搭建一台主dns服务器。
希望达成的效果:
1. 新建网络区域内域名解析系统,做到如下表所示的域名—IP对应关系。
域名 服务器IP
a.hbai.com 192.168.0.1
b.hbai.com 192.168.0.2
c.hbai.com 192.168.0.3
d.hbai.com 192.168.0.4
2. 除上述内网域名外,其余域名查询转发至园区网外dns进行解析,并返回实际IP地址。如查询www.baidu.com返回百度服务器IP。
好,目标明确之后,笔者来登陆第一节搭建的linux服务器。
首先,笔者保存一下上一章做的测试网页,并且关闭apache服务:
/bin/systemctl stop httpd.service
yum安装bind:yum install bind
接下来笔者来进行基础配置:vi /etc/named.conf
注意其中几个重要字段:
listen-on port 53 { 127.0.0.1; }; 本地监听端口;
listen-on-v6 port 53 { ::1; }; IPv6监听端口,由于笔者暂时没有打算使用IPv6,所以把它用//注释掉;
directory "/var/named"; 指明了域文件所在的目录(就是笔者需要维护对应关系表所在目录)最好不要修改;
allow-query { localhost; }; 允许那些主机来查询,默认是localhost,由于笔者园区网络与公网有防火墙,这台dns就可以对园区或者专网提供服务,所以把“localhost”改为“any”;
recursion yes; 是否允许递归,如果服务器设为主dns倒是可以关闭递归查询,目前笔者搭建的这台需要提供dns查询,所以开启;
logging { logging字段,定义日志所在位置,之后笔者对dns服务器进行监控会用到,不做修改。
zone "." IN { 定义了root zone的服务类型为hint,记录文件在/var/named/named.ca中;
include "/etc/named.rfc1912.zones"; 定义区文件位置,笔者要新增的域*.local属于一个zone,即需要在该文件中增加。
对如上内容作修改为:
其中新增了一个forwarders字段,表示如果服务器无法解析该域名时将请求交与括号内dns服务器解析。就是因为这个字段,笔者可以对本地无法解析的域名(即除*.hbai.com)的域名都转到公用dns上解析。各位在买运营商带宽时,运营商会提供IP地址与dns服务器,这时可以直接加在forwarders字段。
保存退出wq!
启动dns服务:/bin/systemctl start named.service
查看一下服务状态:/bin/systemctl status named.service
笔者注意到第三行一个字段Loaded: loaded (/usr/lib/systemd/system/named.service;disabled
这个表示该服务不随开机启动,由于dns这类基础业务类最好在服务器发生宕机之后可以自动恢复,保障业务连续,因此将其设置为开机启动。
设置dns服务为开机启动:bin/systemctl enable named.service
继续查看一下状态:/bin/systemctl status named.service
完成~
笔者来测试一下服务是否正常:
老样子,关掉防火墙:systemctl stop firewalld.service
与上一章相同的网络环境,笔者发现telnet 192.168.101.2 53端口不通?。。
telnet 192.168.101.2 22端口进行一下测试,发现可以访问。说明问题还是出在53端口上
笔者看了一下配置似乎没什么大问题,没办法,进行故障排查吧。
本地测试一下,在dns服务器上去测试一下端口是不是可以正常访问
未找到该命令。为了测试,插播一条消息,笔者在服务器上继续安装telnet:
看一下目前telnet的情况:yum list installed | grep telnet
查看一下可以安装telnet的安装包:yum list | grep telnet
直接安装telnet.x86_64:
yum install telnet.x86_64
yum install telnet-server.x86_64
再查看一下telnet安装状态: yum list installed | grep telnet
装好之后继续在服务器上进行telnet测试,发现还是提示被拒绝(Connection refused)。
继续telnet localhost 53,发现连接上了:connected to localhost
说明笔者192.168.101.2这个IP在黑名单里啊,没有服务提供。继续检查配置,发现在/etc/named.conf中确实有如下一行没有注意。
这一段刚开始修改时笔者只注意在port 53 的监听上,其实后面括号内定义了53端口只能由127.0.0.1进行访问。发现故障原因后,笔者直接将其注释掉。
重启服务:/bin/systemctl restart named.service
继续回到笔者测试电脑上telnet 192.168.101.2,发现端口可通。小插曲解决。
下面笔者来配置*.local的域:vi /etc/named.rfc1912.zones
原有两个zone,在此基础上笔者新建一个名为hbai.com的zone。并将其type设为master。
zone "hbai.com" IN {
type master;
file "db.hbai";
};
保存退出wq!
好了,下一步就是创建域名对应IP地址的关系表:cd /var/named
ls看一下文件:
笔者新建一个刚刚在zone声明的文件db.hbai: vi db.hbai
首先定义dns生存时间ttl,定在1h吧,换算成秒:$TTL 3660
第二行笔者做一个start of authority标记,定义一个授权区的开始:
hbai.com. IN SOA mian.hbai.com. master.hbai.com.
用()定义一段跨行数据,并对每个数据打一个说明标签:
2018011001 ; serial
定义serial,每当重启dns服务时dns会检测new-serial,当new-serial大于old-serial时主dns会向从dns同步zone。这里笔者没有搭建从dns,意义不大。
14400 ; refresh (4 hours)
定义refresh,从dns每过多长时间向主dns进行serial核对。意义也不大。
7200 ; retry (2 hours)
定义retry,当从dns向主dns获取serial无响应时多长时间重新发起。目前意义不大。
604800 ; expire (1 week)
定义expire,当无主dns响应时从dns提供权威解析时间。
86400 ; minimum (1 day)
定义negative caching,不做详细解释,有兴趣查一下RFC 2308文档定义。
另起一行 $ORIGIN hbai.com.
定义从改行一下所有域名以hbai.com结尾。
添加NS记录,将以hbai.com的域名解析权交与名为main.hbai.com的dns
添加最开始表格的域名-IP对应关系。
wq!保存退出。
笔者来看一下整体的文件:cat db.hbai
重启dns服务:/bin/systemctl restart named.service
开启防火墙:systemctl start firewalld.service
永久添加tcp 53端口:firewall-cmd --zone=public --add-port=53/tcp --permanent
永久添加udp53端口:firewall-cmd --zone=public --add-port=53/udp --permanent
重启防火墙:firewall-cmd --reload
笔者最后在电脑上进行dns服务测试:开始--搜索—cmd
输入nslookup
看到目前电脑的dns,笔者继续隐去。。
设置服务器为192.168.101.2:server 192.168.101.2
看到这时候“默认服务器”和“Address”字段都变为了192.168.101.2的IP地址。
直接输入a.hbai.com;d.hbai.com;www.baidu.com进行测试。
笔者看到,对于笔者自己维护的域名(*.hbai.com)的域名,笔者的dns server给出了权威解析,而对于不在笔者管控的其他域名,通过递归查询返回了非权威的dns应答。
到此为止dns服务器的搭顺利完成~
由于公网IP没法贴出来,上图一堆马赛克没法展示效果,笔者第二章设置了服务器接入专网,并配置了IP地址10.150.101.249。笔者可以同样在专网内做一个测试:
这样结果就很清楚了。
DNS Server的搭建可以使得笔者正常访问园区内外的网络资源(如百度),也可以标注数据中心内或者专网内的服务器信息(如a.hbai.com 192.168.0.1),提供网络服务的基本保障。
问题:
1. 类比电话簿,如果一个网站服务器出现故障,需要更换服务器IP地址,这件事情对dns有什么影响,对用户访问有什么影响?
2. 故障排查(trouble shooting)是一个复杂的东西,第三章和第四章都尝试进行了简单的故障排查,简单阐述笔者在遇到问题时故障排除的思路。
3. 第三章笔者搭建了一个测试网站,在此基础上尝试将网站迁移至另一台服务器如192.168.101.3并将域名test.hbai.com指向192.168.101.3做到如下页面的访问。
4. 笔者其实已经按照master-slave的部署方式修改了named.conf、named.rfc1912.zones、db.hbai的文件,我们可以将如此配置直接copy至另一台用做slave dns的服务器来完成主从搭建,尝试说明对于master dns和slave dns分别要对上述三个文件的哪些字段修改?