在文章的开始,希望大家关注公众号Lind-Learn,在这里会分享各类计算机技术的知识。
1. DNS介绍
- DNS是一个域名系统,再互联网环境中为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能被及其直接读取的IP数串。类似于生活中的114服务,可以通过人名找到电话号码,也可以通过电话号码找到人名(生活中没有那么准确的原因是人名有重名,而域名是全时间唯一的)
- DNS协议运行在UDP协议,使用端口号53
- 应用场景:需要域名解析的地方
2. DNS命名
- 域名分为国际域名和国内域名两种
对于国际域名而言,其命名规则是:域名可以有(a-z、A-Z大小写等价)26个英文字母、数字(0-9)以及连接符"-"组成,但是域名的首位必须是字母或数字。对于域名的长度也有一定限制:国际域名长度不得超过26个字符,中国国家顶级域名长度不得超过20个字符
- 域名管理机构
Internet域名于地址管理机构(ICANN)是为承担域名系统管理,IP地址分配,协议参数配置,以及主服务器系统管理等职能而设立的非盈利机构。现由IANA和其他实体与美国政府约定进行管理。
国内域名的DNS必须在CNNIC注册
- 域名空间的树状结构
3. DNS查询
- 递归查询
当DNS客户端发出查询请求后,如果本地DNS服务器内没有所需的数据,它将向另外一台DNS服务器发送请求。如果另外一台DNS服务器内没有所需的数据,那么它将返回DNS服务器的IP地址给本地DNS服务器,让本地DNS服务器直接向第三台DNS服务器发送查询请求,直到找到所需的数据位置。在这个本地过程中,递归查询通过不断转发查询请求来实现数据查找。
- 迭代查询
当DNS客户端发送查询请求后,如果本地DNS服务器内没有所需的数据,它将返回另外一台DNS服务器的IP地址给客户端,让客户端直接向另外一台DNS服务器发送查询请求,如果另外一台DNS服务器内仍没有所需的数据,那么它将返回第三胎DNS服务器的IP地址给客户端,让客户端直接向第三台DNS服务器发送查询请求,直到找到所需的数据位置。在这个过程中,迭代查询通过逐级转发查询请求来实现数据查找。
- 反向查找
反向查找是通过DNS客户端提供的IP地址来查询主机完整域名的查询方式。由于域名与IP地址之间无法直接建立对应关系,因此需要在DNS服务器内创建一个反向型查询的区域。当DNS客户端发出一个反向查询请求时,DNS服务器根据IP地址反向查找对应的域名。这种查询方式主要用于IP地址到域名映射查找。
- 在实际应用中,递归查询和迭代查询是最常用的两种查询方式。递归查询的特点是客户端只需要接触一次DNS服务器就能获得最终结果,适用于大多数情况下的域名解析。而迭代查询则适用需要多级转发的情况,例如在大型网络中,可能需要经过多台DNS服务器才能找到所需的数据。
4. DNS部署
- DNS安装
[root@Lind ~]# yum -y install bind bind-chroot
# bind DNS主程序包
# bind-chroot DNS安全包,改变默认DNS根目录,将DNS运行在监牢模式
- DNS启动
Ⅰ 不使用chroot模式启动DNS
# 开机自启动
[root@Lind ~]# systemctl enable named
# 启动DNS服务
[root@Lind ~]# systemctl start named
Ⅱ 使用chroot模式启动DNS
# 将对应的文件移动到chroot根目录
# 主配文件
[root@Lind ~]# cp -p /etc/named.conf /var named/chroot/etc //-p保持权限不对
#区域数据库文件
[root@Lind etc]# cp -p /var/named/named.* /var/named/chroot/var/named/
#开机自启动
[root@Lind ~]# systemctl enable named-chroot.service
#启动DNS服务
[root@Lind ~]# systemctl start named-chroot
- DNS配置文件详解
默认情况下,如果不安装named-chroot这个包,配置文件的路径如下:
配置文件:/etc/named.conf
区域数据库文件:/var/named/由于我们安装了named-chroot这个用于改变默认DNS配置文件的路径包,所以相对应的配置文件的路径也发生了变化。
配置文件:/var/named/chroot/etc/named.conf
区域数据库文件:/var/named/chroot/var/named/验证配置文件是否有错:named-checkconf /var/named/chroot/etc/name.config
- 主配置文件
//
// 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.
//
// See the BIND Administrator's Reference Manual (ARM) for details about the
// configuration located in /usr/share/doc/bind-{version}/Bv9ARM.html
options {
listen-on port 53 { 127.0.0.1; }; // 仅在本地回环地址监听端口53的DNS请求
listen-on-v6 port 53 { ::1; }; // 仅在IPv6本地回环地址监听端口53的DNS请求
directory "/var/named"; // 设置BIND工作目录
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 { localhost; }; // 只允许本地查询
/*
- 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
dnssec-validation yes; // 启用DNSSEC验证
/* Path to ISC DLV key */
bindkeys-file "/etc/named.root.key"; // 指定ISC DLV密钥文件路径
managed-keys-directory "/var/named/dynamic"; // 指定管理密钥目录
pid-file "/run/named/named.pid"; // 指定PID文件路径
session-keyfile "/run/named/session.key"; // 指定会话密钥文件路径
};
logging {
channel default_debug {
file "data/named.run"; // 指定日志文件路径
severity dynamic; // 设置日志记录的动态严重性级别
};
};
zone "." IN {
type hint; // 指定根区类型为提示区
file "named.ca"; // 指定根提示文件
};
include "/etc/named.rfc1912.zones"; // 包含RFC1912建议的区域配置文件
include "/etc/named.root.key"; // 包含根密钥文件
- 区域数据库文件详解
# 正向解析
[root@Lind named]# cat named.localhost
$TTL 1D # 设置该区域文件中的资源记录的默认生存时间(TTL)为1天
@ IN SOA @ rname.invalid. ( #定义SOA记录,@表示当前区域域名(localhost),rname.invalid.表示管理员邮箱地址(rname@invalid)
0 ; serial 序列号,每次更新该文件序列号都应该变大
1D ; refresh 刷新时间,即规定哦才能够域名服务器多长时间查询一个主服务器,以保证从服务器的数据是最新的
1H ; retry 重试时间,即当前服务器试图再主服务器上查询更新时,而连接失败了,则这个值规定了从服务器多长时间后再试
1W ; expire 过期时间,从服务器再向主服务器更新失败后多长时间后清除对应的记录
3H ) ; minimum 这个数据用来规定缓冲服务器不能与主服务器联系上后多长时间清除相应的记录
NS @
;NS 名称服务器,表示这个主机位域名服务器
A 127.0.0.1
;主机头 A记录 IP
AAAA ::1
; AAAA 解析为IPV6地址
# 反向解析
[root@Lind named]# cat named.loopback
;缓存时间
$TTL 1D
;@表示相应的域名
@ IN SOA @ rname.invalid. (
;解析的域名 类型 授权域 授权域名服务器 管理员邮箱
0 ; serial # 序列号,用于版本控制
1D ; refresh # 刷新时间间隔,次级服务器刷新区域数据的频率(1天)
1H ; retry # 重试时间间隔,刷新失败后次级服务器等待的时间再重试(1小时)
1W ; expire # 过期时间,次级服务器在未能刷新数据时继续使用旧数据的时间(1周)
3H ) ; minimum # 最小TTL值,通常用于负缓存的默认TTL(3小时)
NS @ # 定义NS记录,@表示当前区域域名作为命名服务器(localhost)
A 127.0.0.1 # 定义A记录,将当前区域域名解析到IPv4地址127.0.0.1
AAAA ::1 # 定义AAAA记录,将当前区域域名解析到IPv6地址::1
PTR localhost. # 定义PTR记录,将地址解析为主机名localhost
5. DNS域名解析
- 正向解析
# 对ayitula.com域名做解析,解析要求如下:
# www解析为A记录 IP地址为192.168.11.88
# news做别名解析CNAME解析为www
# 定义一个主域
# 注意每行都要;结尾
zone "ayitula.com" IN{
# 类型为master
type master;
# 区域数据库文件名称
file "ayitula.com.zone";
};
# 正向解析区域数据库文件
[root@Lind named]# vim /var/named/chroot/var/named/ayitula.com.zone
$TTL 1D
@ IN SOA ayitula.com. rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS www.ayitula.com
www A 192.168.11.88
news CNAME www
# 检查主配文件的正确性
[root@Lind named]# named-checkconf /var/named/chroot/etc/named.conf
# 检查区域数据库文件的正确性
[root@Lind named]# named-checkzone ayitula.com /var/named/chroot/var/named/ayitula.com.zone
# 本机DNS修改
[root@Lind named]# vim /etc/resolv.conf
A 域名解析为IP
PTR IP到域名
Mx 邮件域名
CNAME 别名
- 域名解析命令
- host:采用非交互式解析
- nslookup:可以采用交互或非交互解析
- dig:显示详细的解析流程
- 反向解析
# 对www.ayitula.com 做反向解析,其对应的IP地址为192.168.11.88
# 反向解析主配文件
# 定义一个反向解析
# 此处需要倒写网段
zone "11.168.192.in-addr.arpa" IN{
type master;
file "192.168.11.arpa";
}
# 反向解析区域数据库文件
[root@Lind named]# vim /var/named/chroot/var/named/192.168.11.arpa
$TTL 1D
11.168.192.in-addr.arpa. IN SOA ns1.ayitula.com. rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS ns1.ayitula.com.
88 PTR www.ayitula.com.
6. 服务器DNS容灾
- DNS单点故障解决方法
部署冗余DNS服务器:可以设置多个主DNS服务器和从DNS服务器。当主服务器出现故障时,从服务器能够接管服务,确保DNS解析的连续性。
负载均衡:使用负载均衡设备或技术,将DNS查询请求均匀分配到DNS服务器上。
- DNS主从
主配置文件不会同步
同步的是区域数据库文件
# 辅助DNS主配文件
# 定义一个主域
# 注意每行都要;结尾
zone "ayitula.com" IN{
# 类型为slave代表辅助
type slave;
# 区域数据库文件名称
file "ayitula.com.zone";
# 设置主DNS IP,向该IP去同步数据
masters{192.168.11.10;};
};
# 定义一个反向解析
# 此处需要倒写网段
zone "11.168.192.in-addr.arpa" IN{
# 类型写slave 代表辅助
type slave;
file "192.168.11.arpa";
# 设置主DNS IP,向该IP去同步数据
masters{192.168.11.10;};
};
#将11.10的文件复制到Light的etc目录
[root@Light~]# scp root@192.168.11.10:/var/named/chroot/etc/named.conf var/named/chroot/etc
7. DNS智能解析
- 介绍
在我们访问WEB的时候,发现有的网站打开的速度非常快,有的网站打开的非常慢,这是为什么呢?原因就是很多公司为了提升用户的体验,自己网站使用了CDN内容加速服务,让你直接再本地城市的服务器上拿数据并展示给你看。什么是CDN?暂且就理解为本地缓存服务器就好,那么是怎么准确知道你本地的缓存服务器的呢?因为i很多CDN公司的DNS使用了智能解析服务,根据你的源IP判断你属于哪个城市,然后再把本地的缓存服务器解析给你,你就会直接去找该服务器拿数据了。
- 原理
在DNS中植入全世界的IP库以及IP对应的地域,当用户来请求解析时,DNS会根据其源IP来定位他属于哪个区域,然后去找这个区域的view视图查询对应的域名的区域数据库文件做解析。从而使得不同地域的用户解析不同。
- 简单配置
# 主配文件
acl bj{
#对应DNS服务器IP
}
view beijing {
match-clints{ bj; };
zone ...
};
#然后给对应的区域数据库文件做配置