DNS互联网架构

今天搞点看起来逼格稍微高一点的。即模拟一下完整的DNS架构。具体架构差不多就是下面这张图。


预期的效果就是当client客户端发起访问HTTP服务的请求时,通过根服务器一路向下解析到对应的
服务器,同时通过DNS的解析实现对两台HTTP服务器的负载均衡。
具体实现如下:
1、环境准备以及规划。
1.1、由于本次实验需要用到8台虚拟机,可能会对性能要求略高。自上至下八台主机规划如下:

–>根DNS服务器
–>com域DNS服务器
–>主从两台DNS服务器
–>两台HTTP服务器
–>运营商DNS服务器
–>客户端

1.2、环境检查及配置网络

1.2-1、检查/etc/selinux/config文件中SELINUX的配置,确保SELINUX=disabled,即处于关闭状态
1.2-2、在所有的主机上执行以下两条命令确保防火墙关闭(RHEL7系列,6系列请使用service命令):

systemctl stop firewalld
systemctl disable firewalld

1.2-3、为了确保之后的网络配置顺利,请确保NetworkManager服务处于关闭状态,执行以下两条命令:

systemctl stop NetworkManager
systemctl disable NetworkManager

1.3、配置网络。
通过网络配置将八台主机加入一个局域网内,并确保可以互相连通。网络配置具体过程不在详述如果不会配置,
这个实验八成是做不成的。本人的网络环境如下:

–>根DNS服务器IP:192.168.11.2
–>com域DNS服务器IP:192.168.11.101
–>主从两台DNS服务器IP:192.168.11.110和192.168.11.105
–>两台HTTP服务器IP:192.168.11.102和192.168.11.103,且域名为www.xyz.com
–>运营商DNS服务器IP:192.168.11.106
–>客户端IP:192.168.11.104

1.4、准备yum源
由于需要安装包,确保所有服务器有一个可用的yum源,可以使用光盘或者网络yum源,只要可用即可。我这里使用
光盘作为yum源,简要的实现过程如下:
在所有的虚拟机上加上一个光驱,并使用对应系统的ISO文件作为光盘文件。然后执行以下命令挂载:

mount /dev/sr0 /mnt

挂载路径可以自定义,不重要。之后将/etc/yum.repo.d/下的所有文件备份并创建cdrom.repo内容如下

[base]
name=cdrom
baseurl=file:///mnt
gpgcheck=0

然后执行以下两条命令重建yum缓存

yum clean all
yum makecache

2、搭建两个HTTP服务器,并确保其可以连通。
由于重点不是HTTP服务所以对于HTTP的配置全部使用默认,即只要安装好包启动服务可以访问即可。如下:

2.1、在规划的两台HTTP服务器上执行以下命令安装Apache并启动服务

yum install httpd -y
echo "this is the first/second httpsrv." >> /var/www/html/index.html
systemctl start httpd

第二条命令用来创建一个主页文件,echo的内容可以随便,主要用来区分两台服务器。

2.2、执行ss -tan命令查看HTTP服务器的80端口是否打开
在client主机上使用curl命令访问两台服务器,如果可以访问并出现上一步的主页内容则表示正常。

curl 192.168.11.102
curl 192.168.11.103

3、搭建主DNS服务器
为了方便,这里一次将四台DNS的包全装了,DNS一般使用的是bind软件。执行yum install bind -y在所有的DNS服务器上安装

3.1、修改主配置文件,/etc/named.conf
使用 // 将以下两行内容进行注释(在行首添加 //)

listen-on port 53 { 127.0.0.1; };
allow-query     { localhost; };

或者修改花括号中的内容如下:

listen-on port 53 { localhost; };
allow-query     { localhost;any };

第一条是用来绑定端口和IP的,第二条表示接受查询的来源即谁可以通过此服务器进行查询。
并且将以下两条设置项的值改为no,如下:

dnssec-enable no;
dnssec-validation no;

3.2、添加需要解析的域的记录,在/etc/named.rfc1912.zones 文件中添加如下内容。

zone "xyz.com" IN {
    type master;
    file "xyz.zone";
    allow-transfer {192.168.11.105;};
};

###!!请务必注意语句中的 ; 一个都不能少,否则启动服务报错。!!###
其中 “xyz.com”表示要解析的域,即到时候要使用此域名访问两台HTTP服务器
type 表示DNS的类型,这一台为主服务器即master
file 用来指定对应的数据库文件的名字
allow-transfer 是一个安全选项,用来指定可以从此服务器拉取DNS数据库的主机,建议其值只给从服务器。

3.3、修改xyz.zone数据库文件
DNS对应的数据库文件的路径在/var/named目录下,我们并不需要手动创建一个数据库,可以从模版进行修改

cp -a /var/named/named.localhost /var/named/xyz.zone

请务必使用-a选项,以保证复制后文件的所属组为named或者手动修改为named,修改xyz.zone内容如下:

$TTL 1D
@   IN SOA  main.xyz.com. hs.xyz.com. (
                    0       ; serial①
                    1D      ; refresh②
                    1H      ; retry③
                    1W      ; expire④
                    3H )    ; minimum⑤
        NS  slave
        NS  main⑦
slave   A   192.168.11.105                                                                                                      
main    A   192.168.11.110
websrv  A   192.168.11.103
websrv  A   192.168.11.102
www     CNAME   websrv

大多数内容都不需要更改,注意以下内容即可:

main.xyz.com. 此部分为主DNS名称,可以自定义,但通常按照这种格式,注意最后一个.是必须有的
hs.xyz.com. 这部分为邮箱,可以随便填,只要格式是对的,注意最后一个.且@使用.代替
NS main 主指定域中的主DNS
main A xxx 指定主DNS的IP地址
NS slave 指定域中的从DNS服务器
slave A xxx 指定从服务器的IP地址
websrv A xxx 这三条是解析的具体内容,websrv是别名,用来指定域名对应的服务器IP,当一个域名对应多台服务器的时候添加多条记录即可,
www CNAME websrv当收到解析请求的时候,系统会从对应别名中随机一条记录返回
$TTL 1D 此部分表示的是DNS缓存生命周期⑥,默认即可

到此,配置部分结束,使用以下命令启动服务并进行解析测试。

systemctl start named
dig www.xyz.com @192.168.11.110

如果能成功返回解析结果,在客户端执行测试命令,如果成功则说明配置成功。

4、搭建从DNS服务器
主配置文件中的配置信息和主服务器相同

4.1、添加域解析记录。文件还是/etc/named.rfc1912

zone "xyz.com" IN {
    type slave;
    masters{192.168.11.110;};                                                                                                   
    file "slaves/xyz.zone";
    allow-transfer {none;};
};

请注意,从服务器必须要指定的是类型级type必须为slave
同时需要指定主服务器的地址即masters
file文件的路径请注意,文件名可以自定义,并且不需要手动创建及修改,服务器会自动从主服务器拉取
allow-transfer建议设置为none,因为从服务器不需要被拉取数据

4.2、启动服务并进行解析测试,注意指定的地址为从服务器的地址即如下命令:

dig www.xyz.com @192.168.11.105

5、搭建com域服务器
第一步是一样的,修改主配置文件,和之前的配置相同
5.1、添加域解析记录。文件还是/etc/named.rfc1912

zone "com" IN {
    type master;
    file "com.zone";
};

添加的内容和主服务器的配置类似,只是com解析的域就是com,注意这里没有添加allow-transfer记录
因为没有配置从服务器,但正常情况下此项是必须要开启的。下面的根服务器原理一样
5.2、创建并修改数据库配置文件com.zone方法和主服务器一样,但内容如下:

$TTL 1D
@       IN SOA  comdns.com. rname.invalid. (
                                    0       ; serial
                                    1D      ; refresh
                                    1H      ; retry
                                    1W      ; expire
                                    3H )    ; minimum
         NS      comdns
xyz      NS      dns1
xyz      NS      dns2
comdns   A       192.168.11.101
dns1     A       192.168.11.110
dns2     A       192.168.11.105

内容和主服务器的内容类似,只是这里需要添加主从两台DNS的NS记录以及对应的A记录

5.3、启动服务并进行解析测试,注意指定的地址为com服务器的地址即如下命令:

dig www.xyz.com @192.168.11.101

6、搭建根服务器
6.1、修改主配置文件,大致一样但有些许不同,前半部分一样,不过需要找到以下字段修改或删除

zone "." IN {
    type hint;
    file "named.ca";
};

如果你想要修改的话,修改为以下内容,并且不需要在修改/etc/named.rfc1912,如果删除的话需要
将以下内容添加到/etc/named.rfc1912文件中。此段信息的作用是当服务器找不到对应记录的时候会
从根服务器递归向下查询,这段指定的就是根服务器的信息。但现在我们要搭建的就是根服务器,所以
此处的信息就不在需要,可以改为普通DNS服务器的域解析记录。

zone "." IN {
    type master;
    file "root.zone";
};

6.2、创建并修改数据库配置文件root.zone方法和其余服务器一样,内容如下:

$TTL 1D
@       IN SOA  root. invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      root
com     NS      comdns
comdns  A       192.168.11.101
root    A       192.168.11.2

和com服务器类似,不同的是根服务器添加的是com服务器的NS记录以及A记录

6.3、启动服务并进行解析测试,注意指定的地址为根服务器的地址即如下命令:

dig www.xyz.com @192.168.11.2

7、搭建ISP服务器
主配置文件部分依旧是相同的
并且不需要添加域的解析记录
唯一需要修改的是根服务器的信息即/var/named/named.ca
;开头的为注释内容,不用理会。只保留一个NS记录及对应的A记录,其余全部删除
并且将对应的A记录的IP改为自己创建的根服务器的IP地址。如下:

.                       518400  IN      NS      a.root-servers.net.
a.root-servers.net.     3600000 IN      A       192.168.11.2

启动服务

8、测试

–>首先再次确认所有主机的防火墙和SELinux处于关闭状态
–>确保两台HTTP服务器的HTTP服务以及所有的DNS服务器的DNS服务处于开启状态
–>确保两台服务器以及所有的DNS服务器可以正常被访问
–>为避免测试时生成的缓存的影响,在所有DNS服务器上执行rndc flush清除DNS缓存
–>确保无误之后就可以进行测试了

终于到客户端了,修改客户端的DNS服务器为ISP服务器,文件为/etc/resolv.conf格式如下:

nameserver 192.168.11.106

并且,为了防止其他可能存在的DNS的干扰,可以将此文件中的其他DNS服务器删除。
8.1、服务器均衡负载测试:
重复执行以下命令:

curl www.xyz.com

如果正常,应该会出现不同的结果。
8.2、主从DNS测试:
将主DNS服务器关机,并清空ISP服务器上的DNS缓存
再次执行curl www.xyz.com
如果依然可以正常访问,则表示主从服务器设置生效。

常见故障:
1、服务无法启动。
通常是配置文件有问题,使用以下命令检查主配置文件和数据库文件是否正确,并根据提示信息进行修改

named-checkconf
named-checkzone www.xyz.com /var/named/xyz.zone

2、服务成功启动但无法解析
确认防火墙以及SELinux的状态为关闭状态
检查主配置文件中端口绑定和允许的查询来源是否配置正确
检查数据库配置文件的权限
检查各个节点是否可以通信

① 0 主从服务器通过此数字确定数据库是否需要同步
② 1D 主从服务器同步频率
③ 1H 当同步失败时候重试时间
④ 1W 如果持续同步失败,则从服务器上的记录在此时间后失效
⑤ 3H 当服务器查询失败时会记录一条失败缓存,此时间记录此缓存的有效期
⑥ 当ISP的DNS服务器查询到一个DNS记录的时候会将此记录缓存,此缓存的有效期即为缓存生命周期
⑦ NS记录,用来表示当前域中的DNS服务器,每个DNS服务器都需要添加一个DNS记录,并且在下面添加一个对应的A记录

上一篇
下一篇