【运维工程师学习七】DNS底层原理及搭建自己的DNS服务器
- 0、前言
- 1、域名(Domain)的由来
- 2、域名(Domain)的级别
- 3、域名(Domain)的命名规则
- 4、域名(Domain)的后缀有哪些
- 5、域名(Domain)解释商
- 6、DNS的基本原理
- 7、DNS的基本原理
- 8、最简单的域名“解释器”
- 9、DNS的记录类型
- 10、DNS服务端的部署
- 11、Bind的部署(DNS代理)
- (1)安装Bind
- (2)执行以下命令以启动Bind服务并设置它在系统引导时自动启动并查看当前状态
- (3)打开防火墙端口以允许Bind服务
- (4)配置named(bind)
- (4)listen-on port 53 { 127.0.0.1; };和listen-on port 53 {any; };有什么区别
- (5)allow-query { localhost; };和 allow-query {any;};的区别
- (6)logging配置有什么作用
- 12、配置区域配置文件
- 13、配置区域数据文件(/var/named/shi.com.zone,需要新建文件,可以通过复制named.localhost文件为模板)
- 14、检查named(bind)的启动程序,通过查看监听端口及进程
- 15、验证Bind的部署
- 16、验证DNS服务器是否搭建成功
- (1)客户机验证
- (2)bind日志验证
0、前言
DNS的全称是Domain Name System,域名系统。因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。
通过上面的解释可以看出,域名系统(DNS)是为域名服务的,因此在介绍DNS之前,我们先来认识一下域名。
1、域名(Domain)的由来
- 为什么会有域名?因为IP地址不易记忆。
我们都知道网络是基于TCP/IP协议进行通信和连接的,每一台主机都有一个唯一的标识(固定的IP地址),以区别在网络上成千上万个用户和计算机。网络在区分所有与之相连的网络和主机时,均采用了一种唯一、通用的地址格式,即每一个与网络相连接的计算机和服务器都被指派了一个独一无二的地址。为了保证网络上每台计算机的IP地址的唯一性,用户必须向特定机构申请注册,分配IP地址。网络中的地址方案分为两套:IP地址系统和域名地址系统。这两套地址系统其实是一一对应的关系。IP地址用二进制数来表示,每个IP地址长32比特,由4个小于256的数字组成,数字之间用点间隔,例如100.10.0.1表示一个IP地址。由于IP地址是数字标识,使用时难以记忆和书写,因此在IP地址的基础上又发展出一种符号化的地址方案,来代替数字型的IP地址。每一个符号化的地址都与特定的IP地址对应,这样网络上的资源访问起来就容易得多了。这个与网络上的数字型IP地址相对应的字符型地址,就被称为域名。
2、域名(Domain)的级别
- 域名是以 . 这个符号分级别的,有顶级、二级、三级等等。但在规则与现实中会有区别。
- 通过上面的域名例子可见,高级别在右边,越往左级别越低。如www.wy.cn是wy.cn下的三级域名,soft.wy.cn也是三级,dg.soft.wy.cn是四级。
- 上面介绍的分级是域名规范中制订的规则。但现实中,这种级别要各减一级,如wy.cn是顶级。这是为什么呢。因为.cn(包括其它的.com.net一样)任何人都可以注册,所以只有wy.cn才是属于单个主体,.cn是属于国家的(或者说是管理机构的)。因此现实工作中,规范中所说的顶级一般是被叫做域名后缀,而主体部分才被叫做顶级域名。
- 二级,标示服务器功能。
如www表示网站;
mail表示邮箱系统;
Soft表示软件站。
有人会说,为什么华军软件站(www.onlinedown.net)却又是www开头的。其实二级域名是本顶级域名所有者自己安排的。假如你拥有一个域名叫loveu.com,则你一样可以把mail.loveu.com这样的二级域名用在软件下载站上。只要你喜欢,但不符合主流认知而已。
3、域名(Domain)的命名规则
由于Internet上的各级域名是分别由不同机构管理的,所以,各个机构管理域名的方式和域名命名的规则也有所不同。但域名的命名也有一些共同的规则,主要有以下几点:
- 域名中只能包含以下字符:
- 26个英文字母
- “0,1,2,3,4,5,6,7,8,9”十个数字
- “-”(英文中的连词号)
字符组合规则 - 在域名中,不区分英文字母的大小写
- 对于一个域名的长度是有一定限制的,由多个标号组成的完整域名总共不超过255个字符。
4、域名(Domain)的后缀有哪些
在国内主要有com、net、cn、org等主流后缀的域名,每个域名的含义如下:
.com后缀:国际通用顶级域名,也是目前使用最为广泛的域名,它后缀的含义是代表商业组织机构;
.net后缀:国际通用域名,也是目前国际广泛流行的域名,后缀代表网络服务机构;
.cn后缀:中国国家级顶级域名,也是在国内广泛使用的域名 ,后缀表示含义为中国企业互联网标识;
.org域名:国际顶级域名,是目前国际广泛使用的域名,后缀含义代表是非盈利性组织;
.top域名:国际顶级域名,作为目前最流行的最热闹的新型后缀域名,.top寓意为顶级排名、高端、突破,可以用于任何组织和个人。
5、域名(Domain)解释商
域名注册商本身提供域名解释服务,一般在哪个域名注册商注册域名就使用哪个注册商提供的解释服务,但随着行业的发展及市场的细分,专门的域名解释商开始出现,专注智能解释及DNS防御服务,代表性的公司有dns.com,dnspod.com,后者已被腾讯收购。举个例子,你在某个注册商那注册的域名,你可以在注册商的后台修改该域名的NS服务器地址,比如你修改为dns.com公司提供的,则修改之后,你对域名的所有解释记录的管理(添加、删除、修改)都只需在dns.com的域名管理后台操作即可,享受着专门解释公司的特色服务,如多线智能解释,dns攻击防御等等。
6、DNS的基本原理
DNS的作用是负责将域名转换为IP,这个过程可以很简单,也可以很复杂,但不论简单还是复杂,对于用户来说都是透明的,即上网者是感受不到这个过程的。
之所以说简单,那是因为DNS服务端可以理解为就只是一个保存着域名与IP对应的数据库,所以你电脑里面设定的DNS服务器刚好有这个记录,则很快地DNS服务器就向你的电脑程序返回了该域名的IP地址。
但如果刚好你电脑里设定的DNS服务器没有这个域名的记录,则会有不断在查询在进行着,直到查到记录,这个查询过程有两种:递归查询、迭代查询。
7、DNS的基本原理
- 看着这图好像查询过程很复杂,但还是那一句,用户是感受不到这个过程的。
- 各大运营商为了其宽带用户更快的上网体验(更快速查询到IP)都会在地市级本地建立DNS缓存,但这几年地市级的很少维护了,基本都使用省级的DNS服务器了。
- CDN公司或大型的视频网站为了方便调度用户至最近区域服务器也会建立DNS服务器,通过识别访问用户的来源IP将用户的请求调度到最适合的服务器。但这些DNS服务器都是他们内部使用的。
8、最简单的域名“解释器”
- windows系统
C:\Windows\System32\drivers\etc
- 为什么说最简单?因为这只是一个文本级的“数据库”,一行一条记录,格式是“IP在前,域名在后,通过空格分隔”。正因为是文本,所以它是静态的,你不往里面添加记录,则它“知道”的就只有这么多,因此它只适合调试时使用,而不适合正常上网时需要的域名解释。
- 上图中www.test.com这个域名的记录就是我手动添加的,是我上次部署网站为了演示如果给web服务器配置域名添加的。
- linux系统
9、DNS的记录类型
上一节演示的“192.168.xxx.xxx www.test.com”是最简单的一条A记录。DNS的记录类型除了A记录,还有如下的记录类型:
@
及www
都是解释到相同的记录值,因此访问agenet.cn及www.agenet.cn是一样的内容。wan.agenet.cn
是另外一个不同的网站。
10、DNS服务端的部署
一个完整的DNS服务器应包含后端负责域名解释以及前端管理域名的解释(如添加删除域名的各种记录)。能实现DNS解释的后端程序有很多,最经典常用的便是Linux平台下的Bind。开源中国社区上收录的DNS相关程序(含后端及前端)合计有77款。详情请参考http://www.oschina.net/project/tag/108/dnsserver?
部署一个对外的公共DNS是一个十分庞大的工程,而且涉及的知识相当广,下面仅演示以Bind为例部署一个能为局域网内其它机器提供DNS代理的服务器(仅后端程序不部署前面WEB程序)。
11、Bind的部署(DNS代理)
(1)安装Bind
yum install bind bind-utils
(2)执行以下命令以启动Bind服务并设置它在系统引导时自动启动并查看当前状态
systemctl start named
systemctl enable named
systemctl status named
(3)打开防火墙端口以允许Bind服务
- 这将打开DNS端口(TCP和UDP 53)以允许BIND服务。
firewall-cmd --add-service=dns --permanent
firewall-cmd --reload
- 现在,已经成功安装和配置了Bind域名服务器。您可以使用Bind来配置和管理自己的DNS域名解析服务。
(4)配置named(bind)
- 找到主配置文件存放路径
find / -name named.conf
- 主配置文件路径
/etc/named.conf
- 也可以通过下面命令查询所有bind服务配置文件
rpm -qc bind
- 写入下面的内容至named.conf里(选配,下面有配置解释)
options {
listen-on port 53 {any; };
directory "/var/named/";
forward only;
forwarders { 114.114.114.114; };
allow-query {any;};
};
logging {
channel query_log {
file "query.log" versions 3 size 20m;
severity info;
print-time yes;
print-category yes;
};
category queries {
query_log;
};
};
- 默认配置(可以备份起来用于复原)
//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
options {
listen-on port 53 { 127.0.0.1; }; //监听53端口,IP地址使用提供服务的本地IP,也可用any代表所有
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"; //内存统计文件的位置
secroots-file "/var/named/data/named.secroots";
recursing-file "/var/named/data/named.recursing";
allow-query { localhost; }; //允许使用本DNS解析服务的网段,也可用any代表所有
/*
- If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
- If you are building a RECURSIVE (caching) DNS server, you need to enable
recursion.
- If your recursive DNS server has a public IP address, you MUST enable access
control to limit queries to your legitimate users. Failing to do so will
cause your server to become part of large scale DNS amplification
attacks. Implementing BCP38 within your network would greatly
reduce such attack surface
*/
recursion yes;
dnssec-enable yes;
dnssec-validation yes;
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
/* https://fedoraproject.org/wiki/Changes/CryptoPolicy */
include "/etc/crypto-policies/back-ends/bind.config";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
zone "." IN {
type hint;
file "named.ca";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
(4)listen-on port 53 { 127.0.0.1; };和listen-on port 53 {any; };有什么区别
listen-on port 53 { 127.0.0.1; };
和 listen-on port 53 { any; };
是用于配置 DNS 服务器监听的 IP 地址和端口的语句,它们之间有以下区别:
-
listen-on port 53 { 127.0.0.1; };
:- 只监听本地回环地址(127.0.0.1)上的请求。
- 只有来自本机的 DNS 请求能被服务器接受和处理。
- 这种配置通常在本地运行的 DNS 服务器上使用,用于提供本地的 DNS 解析服务。
-
listen-on port 53 { any; };
:- 监听服务器上所有可用的网络接口上的请求。
- 可以接受来自任何地址的 DNS 请求。
- 这种配置通常在公共 DNS 服务器或需要向外部网络提供 DNS 解析服务的服务器上使用。
需要根据实际需求来选择适当的配置。如果你只需要提供本地 DNS 解析服务,并希望限制访问仅限于本机使用,则可以使用 listen-on port 53 { 127.0.0.1; };
。如果你需要提供对外公共的 DNS 解析服务,则可以使用 listen-on port 53 { any; };
。
(5)allow-query { localhost; };和 allow-query {any;};的区别
allow-query { localhost; };
和 allow-query { any; };
是用于配置 DNS 服务器允许的查询请求的语句,它们之间有以下区别:
-
allow-query { localhost; };
:- 只允许来自本地回环地址(localhost)的查询请求。
- 只有在本机发起的 DNS 查询请求才会被服务器接受和处理。
- 这种配置通常在本地运行的 DNS 服务器上使用,用于提供本地的 DNS 解析服务,限制外部网络对服务器的查询请求。
-
allow-query { any; };
:- 允许来自任何地址的查询请求。
- 可以接受来自任何网络的 DNS 查询请求。
- 这种配置通常在公共 DNS 服务器或需要向外部网络提供 DNS 解析服务的服务器上使用。
需要根据实际需求来选择适当的配置。如果你只需要允许本地查询请求,并希望限制外部网络对服务器的查询访问,则可以使用 allow-query { localhost; };
。如果你需要允许来自任何地址的查询请求,则可以使用 allow-query { any; };
。
(6)logging配置有什么作用
logging {
channel query_log {
file "query.log" versions 3 size 20m;
severity info;
print-time yes;
print-category yes;
};
category queries {
query_log;
};
};
上述配置块用于配置 DNS 服务器的日志记录设置,具体作用如下:
-
channel query_log { ... };
:- 定义了名为
query_log
的日志记录通道。 file "query.log" versions 3 size 20m;
指定了日志文件名为query.log
,并且最多保留3个版本的文件,每个文件大小不超过20MB。severity info;
指定了记录的日志级别为info
,表示只记录信息级别及更严重的日志消息。print-time yes;
和print-category yes;
指定了记录的日志消息中是否包含时间戳和类别。
- 定义了名为
-
category queries { ... };
:- 定义了名为
queries
的日志类别。 query_log;
指定了该类别的日志消息将会被记录到query_log
通道。
- 定义了名为
上述配置将会记录 DNS 服务器的查询请求相关的日志消息到指定的文件中,记录的信息包括时间戳、日志级别、类别和相应的日志内容。对于 DNS 服务器的调试和故障排除非常有用。你可以根据实际需求调整日志文件的名称、版本数、大小和记录的日志级别。
12、配置区域配置文件
vim /etc/named.rfc1912.zones
zone "shim.com" IN { //正向解析"shim.com"区域,"shim.com"为你要配置的域名这里记得替换为你的
type master; //类型为主区域
file "shim.com.zone"; //指定区域数据文件为shim. com. zone
allow-update { none; }; //关闭更新
13、配置区域数据文件(/var/named/shi.com.zone,需要新建文件,可以通过复制named.localhost文件为模板)
cd /var/named/
cp -p named.localhost shim.com.zone //保留源文件的权限和属主的属性复制
vim /var/named/shim.com.zone
$TTL 1D //设置缓存解析有效时间
@ IN SOA shim.com. rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS shim.com //记录当前区域的DNS服务器的名称
A 192.168.31.132 //记录主机的IP地址
IN MX 10 mail.shim.com //MX为邮件记录,数值代表优先级,越大越优
www IN A 192.168.31.132 // WWW.shim.com映射的IP地址,ip都替换为你的ip,这里贴出来是为了下面验证是否配置成功
ftp IN A 192.168.31.132
mail IN A 192.168.31.132
* IN A 192.168.31.132 //泛域名解析,*代表任意主机名
14、检查named(bind)的启动程序,通过查看监听端口及进程
- 没关闭防火墙可能开不起来
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
- 开始检测查
systemctl restart named
systemctl status named
netstat -untlp | grep named
ps aux | grep named
- 启动正常。
- 可在同局域网内的其它机器上修改DNS地址为本机地址192.168.31.132(本演示主机地址,请修改为你自己的。)
15、验证Bind的部署
nslookup -qt=A www.baidu.com 127.0.0.1
named-checkconf -z /etc/named.conf //检查配置文件
16、验证DNS服务器是否搭建成功
(1)客户机验证
- 我这里用我的一台ubuntu进行测试
echo "nameserver 192.168.31.132" > /etc/resolv.conf //添加DNS服务器地址
cat /etc/resolv.conf
nslookup mail.shim.com //解析mail.shim.com
(2)bind日志验证
上面使用客户机来验证的,在部署bind的主机,通过查看bind的日志一样可以确认。日志文件位于/var/named/query.log
tail -f /var/named/query.log
- 这里显示的ip和操作系统和我客户端对应上了,来自客户端192.168.31.130域名查询记录。
注意:因为客户端的每一次查询都会被记录,因此需要注意日志目录的大小。开启日志 是为了方便部署初期观察服务器的运行情况,稳定后可以将日志关闭。在配置文件
named.conf
中从logging {
开始至最后全部删除即可。
- 可以看到解析出来的ip为我们上面配置的ip,故到此DNS服务器搭建完毕了