本章重点:
- 理解互联网环境dns解析原理
- 搭建内网环境下的 dns服务器
一、DNS 概述
1. DNS系统
DNS (Domain Name System),使用应用层协议,是互联网的一项服务。 它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。
简单来说就是:把域名转换成网络可以识别的ip地址,再通过IP地址访问主机。 这种由文字组成的名称,显而易见要更容易记忆。
每一台 DNS 服务器都只负责管理一个有限范围(一个或几个域)内的主机域名和 IP 地址的对应关系,这些特定的 DNS 域或 IP 地址段称为 zone(区域)。 当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。
2. DNS系统的作用
- 正向解析:根据域名查找对应的IP地址
- 反向解析:根据IP地址查找对应的域名
3. DNS端口号
- dns tcp 53端口作用: 主从复制
- dns udp 53端口作用: 解析
dhcp使用 udp 67、68
4. DNS分布式数据结构
互联网dns解析经历了三个发展阶段
- 分散式 :使用文件记录
- 集中式 :使用单台服务器集中解析
- 分布式 :每台服务器只负责一部分解析任务
域名的组成:
域名级数是指一个域名由多少级组成,域名的各个级别被“.”分开,所有的域名必须以点(.)结尾
- 根域名:最右边的"."就是根域名,通常省略不写。
- 一级域名:又称顶级域名,常见的有".com"、".org"、".net"、".cn"等。
- 二级域名,就是在一级域名前再加一级,如".baidu.com"。
- 三级域名等等,以此类推,最多可达到127级域名
- 主机名
5. DNS服务器类型
缓存域名服务器
- 也称为DNS高速缓存服务器
- 通过向其他域名服务器查询获得域名-->IP地址记录
- 将域名查询结果缓存到本地,提高重复查询时的速度
主域名服务器
- 特定DNS区域的权威服务器,具有唯一性
- 负责维护该区域内所有域名-->IP地址的映射记录
- 需要自行建立所负责区域的地址数据文件
从域名服务器
- 也称为辅助域名服务器,是对主域名服务器的热备份
- 其维护的域名-->IP地址记录来源于主域名服务器
- 需要从主域名服务器自动同步区域地址数据库
6. DNS查询方式
递归查询
- 主机向本地域名服务器的查询一般都是采用递归查询。
- 如果主机所询问的本地域名服务器不知道被查询的域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其它根域名服务器继续发出查询请求报文(即替主机继续查询),而不是让主机自己进行下一步查询。在域名服务器查询期间,客户机将完全处于等待状态。
- 因此,递归查询只会返回两种信息:要么是所要查询的IP地址,要么是查询失败。
迭代查询
- 本地域名服务器向根域名服务器的查询是迭代查询。
- 当根域名服务器收到本地域名服务器发出的迭代查询请求报文后,要么给出所要查询的IP地址,要么告诉本地服务器:“你下一步应当向哪一个域名服务器进行查询”。下一个服务器收到请求后也是如此,要么返回IP,要么告诉本地域名服务器下一步去找谁。 即本地域名服务器按照提示的指引依次查询, 直到返回查询的结果为止 。
递归查询和迭代查询的特点:
- 递归查询:主机只发出一次请求,要求对方给出最终结果。返回的结果只有两种:查询成功或查询失败。
- 迭代查询:主机需要发起多次请求,返回的是所需IP地址或最佳查询地址。
.
7. 本地 hosts 文件
hosts —— the static table lookup for host name(主机名查询静态表)。 hosts文件是Linux系统上一个负责ip地址与域名快速解析的文件,以ascii格式保存在/etc/目录下。hosts文件包含了ip地址与主机名之间的映射,还包括主机的别名。
Linux系统中 hosts文件位置:/etc/hosts
(保存主机名与IP地址的映射记录)
hosts 文件和DNS服务器对比:
- 默认情况下,系统首先从hosts文件查找解析记录
hosts 文件的优先级高于DNS服务器,这是由 /etc/nsswitch.conf 文件规定的 (hosts优先级最高,直接访问文件里的地址)
- hosts 文件只对当前的主机有效
- hosts 文件可减少DNS查询过程,从而加快访问速度
8. 域名解析过程 (互联网环境dns解析原理)
用户在网页地址栏输入 www.baidu.com 后,Linux系统中的DNS域名解析过程:
-
先去看本机 /etc/hosts 文件中是否有 www.baidu.com 的地址,如果有(递归查询)就直接访问;
-
如果没有,迭代查询去问你自己设置的dns服务器 , 由运营商提供,如果有就直接反馈;
-
如果没有,直接去问根服务器,根域服务器无法解析 www.baidu.com ,会透露一个信息给你,让你去问一级域服务器;
-
一级域服务器无法解析 www.baidu.com ,会透露一个信息给你,让你去问二级域服务器;
-
以此类推,最后有一台权威服务器会告诉你具体的ip地址,然后反馈给用户。
二、DNS服务程序——BIND(搭建内网环境下的 dns服务器)
1. BIND概述
目前使用最为广泛的DNS服务软件是BIND(Berkeley Internet Name Domain)。
BIND支持现在绝大多数的操作系统(Linux,UNIX,Mac,Windows)。
BIND服务的名称为named。
BIND配置文件:
/etc/named.conf
: 主配置文件/etc/named.rfc1912.zones
: 区域配置文件,你想解析的域名要在这个文件中指明/var/named/*
:数据库配置文件,指明了域名和ip地址的一一对应关系- /var/named/named.ca : 根域配置文件
BIND服务控制:
- systemctl [status|start|stop|restart] named.service
- rndc reload :重新加载DNS服务
2. 主配置文件
BIND服务的主配置文件位于: /etc/named.conf
- 设置DNS服务器的全局参数
- 包括监听地址和端口、区域数据文件存放的目录等
- 使用 options{......}; 的配置段
.
3. 区域配置文件
区域配置文件位于 : /etc/named.rfc1912.zones
- 设置本服务器提供域名解析的特定DNS区域
- 包括域名、服务器角色、数据文件名等
- 使用 zone "区域名" IN{......}; 的配置段
.
4. 数据库配置文件
BIND服务的区域数据库文件位于 /var/named/ 目录下,具体文件名由管理员定义。一般格式为 /var/named/域名.zone
,例如:/var/named/lkk.com.zone。
配置文件格式解析:
name [TTL] IN rr_type value
域名 缓存 Internet协议 资源类型 值
1. TTL可从全局继承缓存时间
2. 使用 "@" 符号可用于引用当前区域的域名
3. 同一个名字可以通过多条记录定义多个不同的值;此时DNS服务器会以轮询方式响应
4. 同一个值也可能有多个不同的定义名字;通过多个不同的名字指向同一个值进行定义;此仅表示通过多个不同的名字可以找到同一个主机
区域解析库:由众多资源记录RR(Resource Record)组成
记录类型: SOA, NS,A, AAAA, CNAME, PTR, MX
4.1 SOA记录
SOA(Start Of Authority)起始授权记录,规定了属性以及一些设置。所有的数据库文件的第一条记录必须是SOA。
$TTL 1D (统一的ttl定义1天,不写D 是秒)
@ IN SOA @ rname.invalid. (
0 ; serial #数据库版本,从服务器 用来判断是否需要重新下载数据库文件
1D ; refresh #刷新时间 拉取时间
1H ; retry #失败后一个小时 后再试一次
1W ; expire #过期时间,老是拉取不了,1周以后过期
3H ) ; minimum #老是去查错误的解析地址,3小时内的缓存下,用户再查直接返回
4.2 NS记录
NS(Name Server) :专用于标明当前区域的DNS服务器,服务器类型为域名服务器。
NS master
master A 127.0.0.1
#这两条记录在一起,指明了谁是主域名服务器
NS slave
slave A 127.0.0.2
#这两条记录在一起,指明了谁是从域名服务器
对NS记录而言,任何一个ns记录后面的服务器名字,都应该在后续有一个A记录
SOA记录与NS记录的区别:
NS记录表示域名服务器记录,用来指定该域名由哪个DNS服务器来进行解析;
SOA记录设置一些数据版本和更新以及过期时间等信息。
4.3 A记录
A(internet Address) :IPV4正向解析,将域名解析成IP地址。
AAAA(FQDN) :IPV6 正向解析
www.lkk.com. IN A 1.1.1.1 #把www.lkk.com.解析成1.1.1.1
域名要写全! 或者只写主机名www
避免用户写错名称时给错误答案,可通过泛域名解析进行解析至某特定地址
* IN A 5.5.5.5 # *代表泛域名
@ IN A 6.6.6.6 # @代表不需要名字
4.4 PTR记录
反向解析,将ip地址解析为域名
name: IP,有特定格式,把IP地址反过来写,1.2.3.4,要写作4.3.2.1;而且有特定后缀:in-addr.arpa.,所以完整写法为:4.3.2.1.in-addr.arpa.
3.2.1.in-addr.arpa. IN PTR www.kgc.org.
#如1.2.3为网络地址,可简写成:4 IN PTR www.kgc.com
4.5 CNAME别名记录
CNANE别名记录允许将多个名字映射到同一台计算机
ftp IN CNAME www #CNAME使用别名,ftp 是www的别名
5. 实验:构建主域名服务器(正向解析)
实验步骤:
- 关闭防火墙和selinux;安装主软件和配置包管理软件;
- 修改网卡配置文件,将DNS服务器地址改为本机地址; 然后启动服务并验证是否修改成功;
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]#yum install bind bind-utils -y
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
DNS1=172.16.235.55
[root@localhost ~]# systemctl restart network
[root@localhost ~]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 172.16.235.55
- 修改主配置文件
/etc/named.conf
, 允许DNS服务器监听所有IP地址,允许所有客户端查询;
[root@localhost ~]# vim /etc/named.conf
options {
// listen-on port 53 { 127.0.0.1; }; #注释掉,或者改为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";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
// allow-query { localhost; }; #注释掉,或者改为any
- 修改区域配置文件
/etc/named.rfc1912.zones
,设置正向解析区域;
[root@localhost ~]# vim /etc/named.rfc1912.zones
zone "lkk.com" IN { //定义要解析的域名
type master; //定义区域类型为master
file "lkk.com.zone"; //设置对应的正向解析数据库文件
};
- 建立正向解析区域数据库配置文件 lkk.com.zone,并修改配置;
[root@localhost ~]# cd /var/named/
[root@localhost named]# ls
data dynamic named.ca named.empty named.localhost named.loopback slaves
[root@localhost named]# cp -a named.localhost lkk.com.zone #保留权限的复制配置文件模板
[root@localhost named]# vim lkk.com.zone #修改数据库配置文件
$TTL 1D
@ IN SOA master.lkk.com. rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS master
master A 172.16.235.55
www A 172.16.235.100
- 配置完成后开开启 named 服务,并验证正向解析是否成功。
[root@localhost named]#systemctl start named #开启named服务
[root@localhost named]# host www.lkk.com #正向解析www.lkk.com对应的IP
www.lkk.com has address 172.16.235.100 #实验成功
补充命令:
- 检查启动文件格式:
- named-checkconf
- named-checkzone lkk.com /var/named/lkk.com.zone
- 重新加载DNS服务 :
rndc reload
6. 主从复制
主从复制,就是把主服务器上的区域数据库文件复制到从服务器中
实验一:
主服务器地址:172.16.235.55
从服务器地址:172.16.235.101
#主服务器(7-1)配置
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 #修改网卡配置文件
DNS1=172.16.235.55 #主服务器地址
DNS2=172.16.235.101 #从服务器地址
[root@localhost ~]# systemctl restart network
[root@localhost ~]# vim /etc/named.rfc1912.zones
zone "kgc.com" IN {
type master;
file "kgc.com.zone";
allow-transfer { 172.16.235.101; }; #添加从服务器的地址
};
###从服务器(7-2)的配置
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum install bind bind-utils.x86_64 -y #从服务器先安装bind软件
[root@localhost ~]# vim /etc/named.conf #修改主配置文件两段改成any
listen-on port 53 { any; };
allow-query { any; };
[root@localhost ~]# vim /etc/named.rfc1912.zones #添加从服务器的配置文件
zone "kgc.com" IN {
type slave; #类型为 从
file "slaves/kgc.com.zone"; #文件地址在/var/named/slaves/ 下
masters { 172.16.235.55; }; #申明主服务器的地址
};
[root@localhost ~]# systemctl start named #配置好后再启动
###验证
[root@localhost named]# systemctl stop named #停用主服务器的named服务
[root@localhost named]# host www.kgc.com #验证从服务器的正向解析功能
www.kgc.com has address 172.16.235.100
[root@localhost named]# dig www.kgc.com #查看配置信息,可以看到是从服务器在解析ip
实验二:如何拉取?
[root@localhost named]# vim kgc.com.zone
$TTL 1D
@ IN SOA master.kgc.com. admin.kgc.com. (
*1* ; serial #同步需要修改 版本
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS master
NS slave1
master A 172.16.235.55
*slave1* A 172.16.235.101 #添加从服务器
www A 172.16.235.100
三、 解析工具
dig
host
nslookup