Linux系统实现DNS服务器
DNS介绍
DNS 是域名系统 (Domain Name System) 的缩写,它是由解析器和域名服务器组成的。
域名服务器是指保存有该网络中所有主机的域名和对应IP地址,并具有将域名转换为IP地址功能的服务器。其中域名必须对应一个IP地址,而IP地址不一定有域名。域名系统采用类似目录树的等级结构。域名服务器为客户机/服务器模式中的服务器方,它主要有两种形式:主服务器和转发服务器。将域名映射为IP地址的过程就称为“域名解析”。在Internet上域名与IP地址之间是一对一(或者多对一)的,域名虽然便于人们记忆,但机器之间只能互相认识IP地址,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,DNS就是进行域名解析的服务器。 DNS 命名用于 Internet 等 TCP/IP 网络中,通过用户友好的名称查找计算机和服务。当用户在应用程序中输入 DNS 名称时,DNS 服务可以将此名称解析为与之相关的其他信息,如 IP 地址。因为,你在上网时输入的网址,是通过域名解析系统解析找到了相对应的IP地址,这样才能上网。其实,域名的最终指向是IP。通常情况下我们之用到了DNS服务器的正向解析功能,而DNS还有方向解析功能,就是把IP地址解析成主机名。
DNS:Domain Name Service,域名解析服务
监听端口:udp/53,tcp/53
应用程序:bind
根域:.
一级域:
组织域:.com, .org, .net, .mil, .edu, .gov, .info, .cc, .me, .tv
国家域:.cn, .us, .uk, .jp, .tw, .hk, .iq, .ir
反向域:.in-addr.arpa
域的划分
根域下来就是顶级域或者叫一级域,
有两种划分方式,一种互联网刚兴起时的按照行业性质划分的com.,net.等,一种是按国家划分的如cn.,jp.,等。
每个域都会有域名服务器,也叫权威域名服务器。
Baidu.com就是一个顶级域名,而www.baidu.com却不是顶级域名,他是在baidu.com 这个域里的一叫做www的主机。
一级域之后还有二级域,三级域,只要我买了一个顶级域,并且我搭建了自己BIND服务器(或者其他软件搭建的)注册到互联网中,那么我就可以随意在前面多加几个域了(当然长度是有限制的)。
比如a.www.baidu.com,在这个网址中,www.baidu.com变成了一个二级域而不是一台主机,主机名是a。

DNS查询方式
递归:DNS请求被服务器接受后,如果属于此服务器管辖范围则请求上级服务器依次传递请求,并且依次传递结果给发出请求的主机。

迭代: DNS请求被服务器接受后,如果不是自己管辖范围,让客户端访问根域服务器,然后跟域通知客户端去访问下级服务器,直到最后客户端访问管辖请求域名的服务器为止。

DNS服务器类型
DNS服务器的类型: 主DNS服务器 从DNS服务器 缓存DNS服务器(转发器)
主DNS服务器:管理和维护所负责解析的域内解析库的服务器
从DNS服务器:从主服务器或从服务器“复制”(区域传输)解析库副本
序列号:解析库版本号,主服务器解析库变化时,其序列递增 刷新时间间隔:从服务器从主服务器请求同步解析的时间间隔 重试时间间隔:从服务器请求同步失败时,再次尝试时间间隔 过期时长:从服务器联系不到主服务器时,多久后停止服务 “通知”机制:主服务器解析库发生变化时,会主动通知从服务器
DNS软件bind
我们说DNS是一种协议,而对于每一种协议的实现都需要程序员开发出遵循这种协议规范的软件程序来实现,这里要介绍的BIND就是DNS协议的一种开源实现。据统计,使用bind作为DNS服务器软件的DNS服务器大约占所有DNS服务器的九成。BIND全称为Berkeley Internet Name Domain,因为当今互联网上的通信几乎都必须借助于DNS服务器来解析主机名,得到通信对方的IP地址,而在DNS服务器上最常用的软件就是bind,所以,bind这款软件几乎可以说是当今互联网上常用的软件了。
目前bind由ISC.org(Internet Systems Consortium,互联网系统协会)负责开发与维护。
bind包相关工具
dns服务, 程序包名:bind, 程序名:named
bind #提供dns server程序,以及几个常用的测试工具。
bind-libs #提供bind和bind-utils包中的程序共同用到的库文件。
bind-utils #bind客户端程序集,例如提供host, nslookup, dig等工具。
bind-chroot #类似chroot,把dns服务限制在某个范围之类. 安全包bind相关文件
服务脚本:
/etc/rc.d/init.d/named主配置文件:
/etc/named.conf,/etc/rfc1912.zones,/etc/rndc.key解析文件:
/var/named/ZONE_NAME.ZONE根区域解析库文件:named.ca.
注意:
一台物理服务器可同时为多个区域提供解析;
必须要有根区域文件;named.ca
应该有两个(如果包括ipv6的,应该更多)实现localhost和本地回环地址的解析库;
rndc: remote name domain controller,默认与bind安装在同一主机,且只能通过127.0.0.1来连接named进程;提供辅助性的管理功能;监听端口:
953/tcp
bind配置文件说明
主配置文件:
/etc/named.conf全局配置:
option {}日志配置:
logging{}
区域配置配置文件:
/etc/rfc1912.zones区域配置:本机能够为哪些zone进行解析,就要定义哪些zone;例如:
zone "ZONE_NAME" IN {}
默认CentOS会默认配置回环地址
至于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.

rndc命令管理dns服务器
我们知道,DNS服务默认的监听端口是53,当我们在主机上启动DNS服务之后,用netstat查看监听端口,显示如下:
[root@localhost ~]# netstat -tunlp | grep named
tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 1387/named
tcp 0 0 192.168.1.120:53 0.0.0.0:* LISTEN 1387/named
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 1387/named
tcp6 0 0 ::1:953 :::* LISTEN 1387/named
tcp6 0 0 ::1:53 :::* LISTEN 1387/named
udp 0 0 192.168.1.120:53 0.0.0.0:* 1387/named
udp 0 0 127.0.0.1:53 0.0.0.0:* 1387/named
udp6 0 0 ::1:53 :::* 1387/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.
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服务器上的所有缓存。
实验一:利用bind()搭建主正向DNS服务器
bind安装和配置
可直接使用yum安装,也可编译安装编译安装参考网站:
# yum安装bind和bind-utils
yum -y install bind bind-utils
# 查看版本
[root@data ~]# rpm -qi bind
Name : bind
Epoch : 32
Version : 9.11.4
Release : 26.P2.el7_9.13
Architecture: x86_64
Install Date: Sun 04 Jun 2023 02:19:23 PM CST
Group : Unspecified
Size : 5652663
License : MPLv2.0
Signature : RSA/SHA256, Fri 27 Jan 2023 11:03:53 PM CST, Key ID 24c6a8a7f4a80eb5
Source RPM : bind-9.11.4-26.P2.el7_9.13.src.rpm
Build Date : Thu 26 Jan 2023 12:54:17 AM CST
Build Host : x86-01.bsys.centos.org
Relocations : (not relocatable)
Packager : CentOS BuildSystem <http://bugs.centos.org>
Vendor : CentOS
URL : http://www.isc.org/products/BIND/
Summary : The Berkeley Internet Name Domain (BIND) DNS (Domain Name System) server
Description :
BIND (Berkeley Internet Name Domain) is an implementation of the DNS
(Domain Name System) protocols. BIND includes a DNS server (named),
which resolves host names to IP addresses; a resolver library
(routines for applications to use when interfacing with DNS); and
tools for verifying that the DNS server is operating properly.
# 查看文件
[root@data ~]# rpm -ql bind
#启动服务看是否可以使用
[root@data ~]# systemctl start named
#查看监听端口
[root@data ~]# ss -ntul
# 查看现在的DNS服务器
cat /etc/resolv.conf
# 设置为本机的DNS服务器
[root@data ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
DNS=127.0.0.1
[root@data network-scripts]# service network restart
# ping百度测试 不通
# 修改配置文件 关闭dnssec,设为no 后重新测试 ping通
[root@data network-scripts]# ping www.baidu.com
PING www.a.shifen.com (14.119.104.254) 56(84) bytes of data.
64 bytes from 14.119.104.254 (14.119.104.254): icmp_seq=1 ttl=128 time=26.7 ms
64 bytes from 14.119.104.254 (14.119.104.254): icmp_seq=2 ttl=128 time=26.2 ms
64 bytes from 14.119.104.254 (14.119.104.254): icmp_seq=3 ttl=128 time=26.5 ms
# 本机能通,看其他云服务器(10.0.0.14)能不能用这台dns
vim /etc/sysconfig/network-scripts/ifcfg-ens33
vim /etc/resolf.conf
service network restart
# ping 测试
[root@backup network-scripts]# ping www.baidu.com
ping: www.baidu.com: Name or service not known
# 无法访问百度
# 修改bind配置文件可以供其他云主机使用
[root@data ~]# vim /etc/named.conf
options {
listen-on port 53 { any; }; #可为localhost,监听本机所有IP
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { any; };
bind配置域名解析,作为权威服务器
上述已经完成了代理解析服务器的配置,已经能够访问根域名服务器去得到域名的解析记录。后续还需要配置DNS主从服务器。
接下来做主正向解析DNS服务器的配置
区域解析库文件存放在/var/named目录下,其中有一些范例,可以将看下该文件的语法
[root@data named]# cat named.localhost
$TTL 1D
@ IN SOA @ rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS @
A 127.0.0.1
AAAA ::1
# 该区域解析库文件所存放的记录称为资源记录
# 区域解析库:由众多RR组成:
# 资源记录:Resource Record, RR
# 记录类型:A, AAAA, PTR, SOA, NS, CNAME, MX
# SOA:Start Of Authority,起始授权记录;一个区域解析库有且仅能有一个SOA记录,必须位于解析库的第一条记录
# A:internet Address,作用,FQDN --> IP
# AAAA:FQDN --> IPv6
# PTR:PoinTeR,IP --> FQDN
# NS:Name Server,专用于标明当前区域的DNS服务器
# CNAME : Canonical Name,别名记录
# MX:Mail eXchanger,邮件交换器
# TXT:对域名进行标识和说明的一种方式,一般做验证记录时会使用此项,如:SPF(反垃圾邮件)记录,https验证等
# 示例:_dnsauth TXT 2012011200000051qgs69bwoh4h6nht4n1h0lr038x
# 资源记录定义的格式:
# 语法:name [TTL] IN rr_type value
# (1) TTL可从全局继承
# (2) @可用于引用当前区域的名字
# (3) 同一个名字可以通过多条记录定义多个不同的值;此时DNS服务器会以轮询方式响应
# (4) 同一个值也可能有多个不同的定义名字;通过多个不同的名字指向同一个值进行定义;此仅表示通过多个不同的名字可以找到同一个主机
# SOA记录解析
# name: 当前区域的名字,例如“magedu.com.”
# value: 有多部分组成
# (1) 当前区域的主DNS服务器的FQDN,也可以使用当前区域的名字;
# (2) 当前区域管理员的邮箱地址;但地址中不能使用@符号,一般用.替换
# 例如:admin.magedu.com
# (3) 主从服务区域传输相关定义以及否定的答案的统一的TTL
# 例如:
baidu.com. 86400 IN SOA ns.baidu.com. root.admin.com (
2015042201 ;序列号
2H ;主从同步时间
10M ;同步失败重试时间
12H ;一直失败导致从服务器过期时间
1D ;否定答案的TTL值
)
# NS记录
# name: 当前区域的名字
# value: 当前区域的某DNS服务器的名字,例如ns.magedu.com.
# 注意:一个区域可以有多个NS记录
# 例如:
# baidu.com. IN NS ns1.baidu.com.
# baidu.com. IN NS ns2.baidu.com.
# 注意:
# (1) 相邻的两个资源记录的name相同时,后续的可省略
# (2) 对NS记录而言,任何一个ns记录后面的服务器名字,都应该在后续有一个A记录
创建自己的区域库文件
[root@data named]# cp -p named.localhost baidu.com.zone
[root@data named]# vim baidu.com.zone
$TTL 1D
@ IN SOA ns.baidu.com. root.admin.com. (
20230604; serial
1H ; refresh
10M ; retry
12H ; expire
3H ) ; minimum
@ NS ns.baidu.com.
ns A 10.0.0.13
www A 10.0.0.13
#检查配置文件语法是否正确
[root@localhost ~]# named-checkconf #没有消息是最好的消息,报错会提示报错问题
#检查区域配置文件是否有语法错误
[root@data named]# named-checkzone "baidu.com" /var/named/baidu.com.zone
zone baidu.com/IN: loaded serial 20230604
OK修改配置文件,加载区域库文件
区域库的配置文件在/etc/named.conf可以配置,但为了配置文件的简洁性,将其分开存放,存放在/etc/named.rfc1912.zones中
[root@data named]# vim /etc/named.rfc1912.zones
#加入下述配置
zone "baidu.com" IN {
type master;
file "baidu.com.zone";
};
#重启named服务
[root@data named]# systemctl restart named.service
现在用了自建DNS服务器的主机访问baidu.com都会跳转到10.0.0.13
实验二:搭建反向解析服务器
实现反向解析区域
反向解析:将IP反向解析为FQDN
区域名称:网络地址反写.in-addr.arpa.
范例:10.0.0. ---> 0.0.10.in-addr-arpa.反向解析DNS主要用于确保邮件交换记录的有效性,用于拦截邮件服务系统中的垃圾邮件。
由于正向 DNS 将主机名映射到 IP 地址,因此 rDNS(或反向 DNS)表明将服务器 IP 地址映射回主机名。
使用 rDNS,将 IP 地址反转,然后将in-addr.arpa添加到末尾。
例如,如果我们使用 IPv4 地址 10.0.0.13,使用 rDNS,它将变为 13.0.0.10.in-addr.arpa
这种 IP 地址进行反向 DNS 解析的方法用到的是 PTR 记录。
# 实现反向解析
# 1、定义区域
[root@data named]# vim /etc/named.rfc1912.zones
zone "0.0.10.in-addr.arpa" IN {
type master;
file "10.0.0.zone";
};
# 2.定义区域文件
[root@data named]# vim /var/named/10.0.0.zone
$TTL 1D
@ IN SOA ns.xlyw.top. admin.xlyw.top. ( 1 12H 10M 3D 1D )
NS ns.xlyw.top.
14 PTR web.xlyw.top
15 PTR mail.xlyw.top
#3.dig命令测试 成功
[root@data named]# dig -x 10.0.0.14
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.13 <<>> -x 10.0.0.14
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10250
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;14.0.0.10.in-addr.arpa. IN PTR
;; ANSWER SECTION:
14.0.0.10.in-addr.arpa. 86400 IN PTR web.xlyw.top.0.0.10.in-addr.arpa.
;; AUTHORITY SECTION:
0.0.10.in-addr.arpa. 86400 IN NS ns.xlyw.top.
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Jun 07 14:38:38 CST 2023
;; MSG SIZE rcvd: 103