Linux网络——DNS域名解析服务

1,070 阅读9分钟

本章重点:

  • 理解互联网环境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解析经历了三个发展阶段

  • 分散式 :使用文件记录
  • 集中式 :使用单台服务器集中解析
  • 分布式 :每台服务器只负责一部分解析任务
dns组成.png

域名的组成:

域名级数是指一个域名由多少级组成,域名的各个级别被“.”分开,所有的域名必须以点(.)结尾

  • 根域名:最右边的"."就是根域名,通常省略不写。
  • 一级域名:又称顶级域名,常见的有".com"、".org"、".net"、".cn"等。
  • 二级域名,就是在一级域名前再加一级,如".baidu.com"。
  • 三级域名等等,以此类推,最多可达到127级域名
  • 主机名

5. DNS服务器类型

缓存域名服务器

  • 也称为DNS高速缓存服务器
  • 通过向其他域名服务器查询获得域名-->IP地址记录
  • 将域名查询结果缓存到本地,提高重复查询时的速度

主域名服务器

  • 特定DNS区域的权威服务器,具有唯一性
  • 负责维护该区域内所有域名-->IP地址的映射记录
  • 需要自行建立所负责区域的地址数据文件

从域名服务器

  • 也称为辅助域名服务器,是对主域名服务器的热备份
  • 其维护的域名-->IP地址记录来源于主域名服务器
  • 需要从主域名服务器自动同步区域地址数据库

6. DNS查询方式

递归查询

  • 主机向本地域名服务器的查询一般都是采用递归查询。
  • 如果主机所询问的本地域名服务器不知道被查询的域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其它根域名服务器继续发出查询请求报文(即替主机继续查询),而不是让主机自己进行下一步查询。在域名服务器查询期间,客户机将完全处于等待状态。
  • 因此,递归查询只会返回两种信息:要么是所要查询的IP地址,要么是查询失败。

迭代查询

  • 本地域名服务器向根域名服务器的查询是迭代查询。
  • 当根域名服务器收到本地域名服务器发出的迭代查询请求报文后,要么给出所要查询的IP地址,要么告诉本地服务器:“你下一步应当向哪一个域名服务器进行查询”。下一个服务器收到请求后也是如此,要么返回IP,要么告诉本地域名服务器下一步去找谁。 即本地域名服务器按照提示的指引依次查询, 直到返回查询的结果为止 。

递归查询和迭代查询的特点:

  • 递归查询:主机只发出一次请求,要求对方给出最终结果。返回的结果只有两种:查询成功或查询失败。
  • 迭代查询:主机需要发起多次请求,返回的是所需IP地址或最佳查询地址。

递归、迭代.png.

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域名解析过程:

  1. 先去看本机 /etc/hosts 文件中是否有 www.baidu.com 的地址,如果有(递归查询)就直接访问;

  2. 如果没有,迭代查询去问你自己设置的dns服务器 , 由运营商提供,如果有就直接反馈;

  3. 如果没有,直接去问根服务器,根域服务器无法解析 www.baidu.com ,会透露一个信息给你,让你去问一级域服务器;

  4. 一级域服务器无法解析 www.baidu.com ,会透露一个信息给你,让你去问二级域服务器;

  5. 以此类推,最后有一台权威服务器会告诉你具体的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配置文件.png

BIND服务控制

  • systemctl [status|start|stop|restart] named.service
  • rndc reload :重新加载DNS服务

2. 主配置文件

BIND服务的主配置文件位于: /etc/named.conf

  • 设置DNS服务器的全局参数
  • 包括监听地址和端口、区域数据文件存放的目录等
  • 使用 options{......}; 的配置段

主配置文件.png.

3. 区域配置文件

区域配置文件位于 : /etc/named.rfc1912.zones

  • 设置本服务器提供域名解析的特定DNS区域
  • 包括域名、服务器角色、数据文件名等
  • 使用 zone "区域名" IN{......}; 的配置段

区域配置文件.png.

4. 数据库配置文件

BIND服务的区域数据库文件位于 /var/named/ 目录下,具体文件名由管理员定义。一般格式为 /var/named/域名.zone ,例如:/var/named/lkk.com.zone。

数据库配置文件.png

配置文件格式解析:

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. 实验:构建主域名服务器(正向解析)

实验步骤:

  1. 关闭防火墙和selinux;安装主软件和配置包管理软件;
  2. 修改网卡配置文件,将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
正向解析实验1.png 正向解析实验2.png
  1. 修改主配置文件 /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
正向解析实验3.png
  1. 修改区域配置文件 /etc/named.rfc1912.zones ,设置正向解析区域;
[root@localhost ~]#  vim /etc/named.rfc1912.zones 
zone "lkk.com" IN {             //定义要解析的域名
        type master;            //定义区域类型为master
        file "lkk.com.zone";    //设置对应的正向解析数据库文件
};
正向解析实验4.png
  1. 建立正向解析区域数据库配置文件 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
正向解析实验5.png
  1. 配置完成后开开启 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        #实验成功
正向解析实验6.png

补充命令:

  • 检查启动文件格式:
    • 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
dig lkk.png
  • host
host lkk.png
  • nslookup
nslookup lkk.png