Linux centos7 DNS服务器基于bind正反解析服务的搭建
DNS的相关基础知识:
一.DNS--什么是DNS(Domain Name System,域名系统)
因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。
DNS 服务器将域名解析出来,找到域名对应的ip地址的服务,可以高速缓存从其他 DNS 服务器收到的 DNS 记录。 也可以在 DNS 客户服务中使用高速缓存,将其作为 DNS 客户端保存在最近的查询过程中得到的信息高速缓存的方法。 可以提高解析速度。
每个IP地址都可以有一个主机名,主机名由一个或多个字符串组成,字符串之间用小数点隔开。有了主机名,就不要死记硬背每台IP设备的IP地址,只要记住相对直观有意义的主机名就行了。这就是DNS协议所要完成的功能。
主机名到IP地址的映射有两种方式:
1)静态映射,每台设备上都配置主机到IP地址的映射,各设备独立维护自己的映射表,而且只供本设备使用;通常改 /etc/sysconfig/network-scripts/ 下的那个网卡文件就是说的这个方法。
2)动态映射,建立一套域名解析系统(DNS),只在专门的DNS服务器上配置主机到IP地址的映射,网络上需要使用主机名通信的设备,首先需要到DNS服务器查询主机所对应的IP地址。
通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。在解析域名时,可以首先采用静态域名解析的方法,如果静态域名解析不成功,再采用动态域名解析的方法。可以将一些常用的域名放入静态域名解析表中,这样可以大大提高域名解析效率。
域名结构
通常 Internet 主机域名的一般结构为:主机名.三级域名.二级域名.顶级域名。Internet 的顶级域名由 Internet网络协会域名注册查询负责网络地址分配的委员会进行登记和管理,它还为 Internet的每一台主机分配唯一的 IP 地址。全世界现有三个大的网络信息中心: 位于美国的 Inter-NIC,负责美国及其他地区; 位于荷兰的RIPE-NIC,负责欧洲地区;位于日本的APNIC ,负责亚太地区。
例如 www.baidu.com这个URL,其顶级域名是 .com ,二级域名是 .baidu ,三级域名是www ,这也可以称为前缀,标明是基于www协议提供web 万维网服务的域名。
例如 www.nice.ac.cn这个URL,其顶级域名是.cn 国家类别顶级域名,表示这个URL是中国的,二级域名是.ac 三级域名是.nice,四级域名也就是前缀是www,同样标明这是一个提供web万维网的域名。
例如 ftp://hust:[email protected],这个的域名前缀标明它是一个基于ftp协议的提供ftp服务的网站,顶级域名是cn标明是中国的网站。二级域名edu标明是一个教育类的网站。
在域名中大小写是没有区分的。域名一般不能超过5级,从左到右域的级别变高,高的级域包含低的级域。域名在整个Internet中是唯一的,当高级子域名相同时,低级子域名不允许重复。一台服务器只能有一个IP地址,但是却可以有多个域名。
二、常用的DNS解析服务服务器所使用的软件
-
BIND(Berkeley Internet Name Domain),这是应用最广的DNS软件,也是本文将要使用的软件(其实是只会这一个,没办法的事情嘛)。
-
DJBDNS(Dan J Bernstein's DNS implementation)
-
MaraDNS
-
NSD(Name Server Daemon)
- PowerDNS
三,DNS 的正向解析和反向解析,以及用途。
正向解析&反向解析:
DNS服务器里面有两个区域,即“正向查找区域”和“反向查找区域”,
正向查找区域就是:通常所说的域名解析,
反向查找区域即是:IP反向解析,它得到作用是通过查找IP地址的PTR记录来得到该IP地址指向的域名。要成功得到域名就必须有该IP地址的PTR记录。
通常,我们最常用的就是正向解析,其实,说人话,正向解析就是 给IP地址取了一个有一定现实意义的别名。就像一个人一样,一个人代表一个IP,这个人是独一无二的,但是,这个人可能有很多的名字,比如,小名狗蛋,大名王五,乳名 旺财,但这么些名字都是指向一个独一无二的人的。DNS就是给IP命名的一个服务。
如果,你走在路上,你突然碰到一个很熟悉的人,可你就是想不起来他(她)的名字,但是,脑子就是瓦特了,想不起名字,DNS服务就是帮你查询他(她)的名字,DNS查询后告诉你,这个人大名就王五,小名叫狗蛋,乳名叫旺财,然后你就可以不尴尬了,任选一个名字假装亲切的喊他(她)名字,然后谈人生,谈理想等等,迅速的就拉近两人之间的关系了,这个时候就是DNS的反向解析了,对吧???
四、实验目标的确定
将一个域名与一台具有固定IP的内网机器绑定,使得在内网的其它机器可以通过另一台安装了bind域名解析服务的机器通过域名访问其上的web服务。说人话,通过域名访问某一个web服务。也就是服务发布后不需要记忆IP,只需要记住具有现实意义的域名就可以访问这个服务。
环境介绍:
1,IP地址为192.168.0.19的机器其上有一个web服务,例如,httpd服务。
2,ip地址为192.168.0.20的机器上安装bind,对内网所有机器提供DNS域名解析服务。解析域名为www.mywebserver.cn,域名绑定在192.168.0.19。
3,内网的任意一台机器,例如,192.168.0.21,修改网卡的DNS服务器地址,指向 192.168.0.20,访问 www.mywebserver.cn 即可获得 部署在192.168.0.19的web服务。192.168.0.19,修改网卡的DNS服务器地址,指向 192.168.0.20,访问 www.mywebserver.cn 即可获得 部署在192.168.0.19的web服务。
五,环境的搭建:
所有的相关机器 防火墙和selinux都关闭。(仅仅是为了避免一些不必要的麻烦,快速的直奔主题罢了)
192.168.0.19:安装httpd,写一个测试页面,标明这个httpd服务的提供者是192.168.0.19
192.168.0.20:安装bind,服务加入开机启动。
192.168.0.21:修改DNS指向为192.168.0.20,等待bind,也就是named服务配置完毕后测试就行了。
六,正式的配置域名解析服务,bind也就是named服务。
(1),利用rndc命令管理DNS服务器
DNS服务默认的监听端口是53,当我们在主机上启动DNS服务之后,用netstat查看监听端口,显示如下:
[root@centos10 named]# netstat -antup | grep named
tcp 0 0 192.168.0.20:53 0.0.0.0:* LISTEN 3506/named
tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 3506/named
tcp6 0 0 ::1:953 :::* LISTEN 3506/named
udp 0 0 192.168.0.20:53 0.0.0.0:* 3506/named
上面结果显示,除了能够看到53号端口之外,还能看到953端口,那是namd在953端口多启动了一个服务,这就是rndc了。
这个rndc的全称是Remote Name Domain Controller,它可以帮助用户更方便地管理DNS服务器,包括可以检查DNS服务器的状态与统计信息、重载配置文件及zone或单独重载某个区域而不需要重新启动整个DNS服务,还有查看已存在DNS缓存当中的资料等。
rndc服务默认监听在tcp的953端口,且默认监听于127.0.0.1地址,因此默认仅允许本地使用。
rndc的常见用法:
rndc reload:在不重新启动DNS服务的情况下,重新加载配置文件及zone.等同于centos7的 systemctl restart named 命令
rndc reload zone:重新加载指定的zone.
rndc status:查看当前DNS服务器的状态。
rndc stats:将当前系统的DNS统计数据记录下来,默认会将数据存储为一个文件:/var/named/data/named_stats.txt.
rndc dumpdb:将当前DNS高速缓存中的数据记录下来,与stats类似,默认会将数据存储为一个文件:/var/named/data/cache_dump.db.、
rndc flush:清空当前DNS服务器上的所有缓存。这一命令常用在DNS缓存服务器上。
(2),关于DNS服务器的配置文件
bind主配置文件/etc/named.conf的格式:
全局配置段:
options { ... };
日志配置段:
logging { ... };
区域配置段:
zone { ... };
全局配置段:
至于options内的比较重要的子参数简单叙述如下:
listen-on port 53 { any; };
监听在当前主机上的哪个网络接口。默认是监听在localhost,也就是只有本机才能够查询,这显然是不符合现实需要的,因此可以改为any,表示可以监听多个网络接口,any之后要加上分号才算结束。只要监听在能够与外网主机进行通信的网络接口上,就可以为外网主机提供解析服务,当前前提是别人知道自己主机的IP地址。这里也可以监听在指定的网络接口上,可以监听多个接口,每个地址后面都需要加上分号。
directory "/var/named";
这里的意思是如果在/etc/named.conf(包括被包含进来的配置文件)中定义了正反解区域解析库文件的文件名时,该文件名默认应该存放于哪个目录下,默认是存放在/var/named/目录下。需要注意的是,如果安装了bind-chroot程序包,则这些区域解析库文件最终会被主动链接到/var/named/chroot/var/named/这个目录。
dump-file、statistics-file、memstatistics-file
与named这个服务有关的许多统计信息,如果想要输出为文件的话,默认的文件名就由这三项指定。
allow-query { any; };
这是针对DNS客户端的设置,表示谁可以向我的DNS服务提出查询请求的意思。默认设置为localhost,表示仅允许本地查询,这里修改为any,表示对所有的用户开放(当然,防火墙必须放行才行)。
allow-transfer { none; };
当架设主-从DNS服务器时,允许哪台从DNS服务器向我的这台DNS服务器转发区域解析库文件的数据。
recursion yes;
是否允许为DNS客户端做递归查询。默认为yes.
日志配置段:
zone的定义也可以写在这个文件内,但并不推荐这么做。
(3),192.168.0.19:安装httpd,写一个测试页面,标明这个httpd服务的提供者是192.168.0.19
登陆 IP为192.168.0.19的服务器,执行命令:
yum install httpd -y && systemctl enable httpd && systemctl start httpd
echo "192.168.0.19">/var/www/html/index.html
(4),ip地址为192.168.0.20的机器上安装bind,对内网所有机器提供DNS域名解析服务。解析域名为www.mywebserver.cn,域名绑定在192.168.0.19。
登陆IP为i192.168.0.20的服务器,执行命令:
yum install bind bind-chroot -y && systemctl enable named && systemctl start named
bind相关的程序包如下:
bind:提供dns server程序,以及几个常用的测试工具。
bind-utils:bind客户端程序集,例如提供dig, nslookup, dig等工具。
bind-libs:提供bind和bind-utils包中的程序共同用到的库文件。
bind-chroot:选装,让bind程序(named进程)运行于jail进程之下。
以上软件包在安装光盘内都包含,因此可选择将系统安装包或者光盘挂载本地配置本地源方式安装,或者配置外部源,yum 外部源安装方式。
当然,也可以选择编译安装方式,但不推荐这个方式。
zone的定义-----
zone,区域,域名的配置,这个可以定义在多个文件内,比如,/etc/named.rfc1912.zones /etc/named.conf 这两个文件内,通常,为了不让主配置文件过于臃肿,一般是定义在 /etc/named.rfc1912.zones 这个文件内。
编辑该文件,在末尾添加如下内容:
zone "mywebserver.com" IN {
type master;
file "mywebserver.zheng";
allow-update { none; };
};
zone "0.168.192.in-addr.arpa" IN {
type master;
file "mywebserver.fan";
};
以上是正向解析区域定义和反向解析区域定义,区域的实现是依靠其内所定义的文件,也就是定义的 mywebserver.zheng 和mywebserver.fan 这两个文件,当然,这两个文件名字可以任意定义,比如,定义为 a 和b也可以,但没有意义的文件名称不方便后期的维护管理工作, allow-update { none;} 表示禁止动态更新客户端地址。type master 表示使用的是主DNS,也就是192.168.0.20 这个DNS服务器,我们没有做主从DNS,当然就是master啦。
根据以上的区域配置,我们需要编辑两个文件,一个文件名称为 mywebserver.zheng,一个文件名称为mywebserver.fan,分别实现正向解析功能和反向解析功能。这两个文件一般放置在 /var/named/ 文件夹下,在该文件夹下有两个模板文件,如下图:
拷贝这两个文件为以上定义的两个文件,localhost后缀的文件是正向解析模板,loopback是反向解析模板。拷贝时请务必加参数a 拷贝以保持 文件属组为named。
[root@centos10 named]# pwd
/var/named
[root@centos10 named]# cp -a named.localhost ./mywebserver.zheng
[root@centos10 named]# cp -a named.loopback ./mywebserver.fan
两个文件的内容为:
mywebserver.zheng
[root@centos10 named]# cat mywebserver.zheng
$TTL 1D
@ IN SOA mywebserver.com. mywebserver.com. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS www.mywebserver.com.
www A 192.168.0.19
需要指出的是 SOA 这一行后面可以简化,但为了方便管理,还是写一些有意义的字符。比如下面这个,NS 这一行定义的 www 至少在下面必须有一个 www A 192.168.0.19 这么一行,
$TTL 1D
@ IN SOA @ mywebserver.com. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS www.mywebserver.com.
www A 192.168.0.19
bbs A 192.168.0.19
ftp A 192.168.0.19
可以简化成这样的形式:
$TTL 1D
@ IN SOA @ mywebserver.com. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS @
A 192.168.0.19
www A 192.168.0.19
bbs A 192.168.0.19
ftp A 192.168.0.19
也可以是这样的,至少 SOA 后面有一个@ 和一个点:
$TTL 1D
@ IN SOA @ . (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS @
A 192.168.0.19
www A 192.168.0.19
[root@centos10 named]# cat mywebserver.loopback
$TTL 1D
@ IN SOA mywebserver.com. rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS www.mywebserver.com.
19 PTR www.mywebserver.com.
同样的,反向解析也可以简化成以上的形式,在此就不一一演示了。
以正向解析文件为例,NS这一列声明 域名,在其后 A IP地址,声明绑定的是哪个IP。在一列是声明前缀,一个域名一个文件。
很多同学在配置DNS服务器的时候可能有一些困惑,我咋知道配置文件写对了没啊?? bind软件替你想到了,有这么几个命令测试bind的配置文件是否正确的(类似httpd的测试命令哦)。
[root@centos10 named]# named
named named-checkconf named-checkzone named-compilezone named-journalprint named-rrchecker
常用命令为named-checkconf 和named-checkzone, 其实也因为搭建DNS服务器主要就named 的主配置文件和zone文件和rr文件。
(1). named-checkconf
named-checkconf [options] [文件名
-h ===> 显示使用情况摘要并且退出。
-z ===> 执行named.conf配置文件中找到的所有主要区域的测试负载
-t <目录> ===> 将现有的目录切换至指定目录以便处理配置文件中的已包括伪命令
,注意:
使用该命令是需要指定配置文件的路径,否则默认检测 /etc/named.conf 文件。
(2).named-checkzone
named-checkzone [options] [区域名] [区域文件名]
-q ===> 安静模式
-d ===> 启用调试
-c <类别> ===> 指定区域类别,如果没有指定就使用IN
-n <模式> ===> 检测NS记录
-k <模式> ===> 使用指定的格式(fail | warn(默认) | ignore)执行检测
-m <模式> ===> 检测MX
-M <模式> ===> 检测MX是否使用CNAME
-S <模式> ===> 检测SRV记录是否使用CNAME
例如:
反向解析zone文件配置,这个是失败的哦
[root@centos10 named]# named-checkzone www.myarcgis.com ./myarcgis.loopback
zone www.myarcgis.com/IN: NS 'www.myarcgis.com' has no address records (A or AAAA)
正向解析zone文件配置,这个是成功的。
[root@centos10 named]# named-checkzone 192.168.0.21 ./mywebserver.zheng
zone 192.168.0.21/IN: loaded serial 0
OK
(5),DNS域名解析服务器在客户端的使用,以及上述解析的验证。
登陆IP地址192.168.0.21的服务器,安装测试工具。
yum install bind-utils -y
反向解析测试:
[root@centos11 ~]# host www.mywebserver.com
www.mywebserver.com has address 192.168.0.19
正向解析测试:
ping命令测试:
[root@centos11 ~]# ping www.mywebserver.com
PING www.mywebserver.com (192.168.0.19) 56(84) bytes of data.
64 bytes from centos11 (192.168.0.19): icmp_seq=1 ttl=64 time=0.028 ms
64 bytes from centos11 (192.168.0.19): icmp_seq=2 ttl=64 time=0.122 ms
64 bytes from centos11 (192.168.0.19): icmp_seq=3 ttl=64 time=0.052 ms
dig命令测试:
[root@centos11 ~]# dig www.mywebserver.com
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.3 <<>> www.mywebserver.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10717
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.mywebserver.com. IN A
;; ANSWER SECTION:
www.mywebserver.com. 86400 IN A 192.168.0.19
;; AUTHORITY SECTION:
mywebserver.com. 86400 IN NS mywebserver.com.
;; ADDITIONAL SECTION:
mywebserver.com. 86400 IN A 192.168.0.19
;; Query time: 1 msec
;; SERVER: 192.168.0.20#53(192.168.0.20)
;; WHEN: Sat Jan 16 18:34:07 CST 2021
;; MSG SIZE rcvd: 94
dig+short
[root@centos11 ~]# dig www.mywebserver.com +short
192.168.0.19
可以看到正向反向DNS解析都工作正常啦。
总结:
一个DNS服务器要正常解析一个域名,需要编辑至少两个文件,一个是zone文件,一个是正式的解析文件。如果需要反向解析,那么需要在编写一个反向解析文件。