本文主要介绍DNS协议实现基本工作原理.


1.DNS功能

DNS用于实现将Internet中主机的主机名称和IP地址间的转换.

互联网中的主机之间实际是通过IP地址进行彼此之间通信的, 由于IP地址是32位或128为二进制数字, 不便于人们记忆, 因此人们使用了FQDN(Fully Qualified Domain Name)完全合格域名来辅助标识网络中的主机, 便于人们记忆; 实际中不同主机之间仍然使用IP地址进行通信; 通过DNS(Domain Name System)域名系统来实现FQDN与IP地址之间一一映射. 正向DNS解析将FQDN映射为IP地址, 反向DNS解析将IP地址映射为FQDN.(本文中不加特殊说明的都可以看作是正向DNS解析)


2.DNS域名系统架构

早期由于互联网中的主机数量非常少, 可以使用本地主机中的文本文件进行存储指定主机FQDN和IP地址关系数据. 但随着互联网中主机数量的几何级增长, 这些数据已经变得非常庞大, 仍然使用本地主机中的文本文件来存储, 就会是每台主机中的数据过大, 非常不现实.

在这种情况下就产生了DNS域名系统, DNS是公网中存在的倒置树状结构的服务器集群, 用于集中存储FQDN和IP地址之间映射关系数据, 以供互联网中的主机进行查询.


DNS域名系统服务器树状结构如图所示:

Linux常见应用--DNS基本工作原理_ dns

在DNS中, 域名采用分层结构, 包括: 根域, 一级域, 二级域和主机名称. 

在域名层次结构中每一层称作一个域,每个域用一个 . 分开(标识根域的 . 可以省略, 其他级别域的 . 不能省略), 域又可以进一步分成子域,每个域都有一个域名. 

根域: 就是一个“.”号,由Internet名字注册授权机构管理, 全球共有13台根域服务器. 

一级域: 由Internet名字授权机构管理, 一级域中可以按照用途分类: .com商业域, .org组织域, .edu教育域; 也可以按照国家进行分类: .hk香港, .uk英国.

二级域: 注册到个人(www.ok.com), 组织(.x.org)或公司(.ali.com)的名称, 二级域下还可以创建子域, 如上图中的net.ali.com.

子域: 从纯逻辑的角度来说, 在根域以下的所有域都可称为子域. 但在实际中, 子域用于定义二级域以下的域 因此子域可是看作是二级域以下的各个域.

反向域: 这是一个特殊域, 名称为in-addr.arpa, 用于将IP映射到域名. 

如上图结构所示: 

主机www.ok.com是二级域.ok.com中的一台主机, 由于.ok.com这个域中只有一台主机, 因此可以看作是该主机直接向.com这个一级域直接注册的主机, 这种情况非常极端, 基本不会存在;

域.ali.com是一级域.com下的一个二级域, www.ali.com是该二级域其中的一台主机, .net.ali.com是该二级域中的一个子域.


3.DNS工作过程

DNS查询过程如下图所示:

Linux常见应用--DNS基本工作原理_ 应用_02

DNS递归查询: Host A 对于 www.ibm.com 的查询过程中由Host A设置的Host DNS完成逐级查询, 查询完成后由Host DNS返回给Host A, 并在Host DNS本地将该条记录缓存; 而不是由Host A直接完成逐级查询

DNS迭代查询: Host DNS对于Host A的目标主机域名查询需求, Host DNS需要亲自从root DNS Server逐级查询到目标主机域名所在的DNS Server上, 查询过程中其他各个级别的DNS Server只会提供其子域内的主机地址, 而不会主动去帮你查询剩余路径, 在此过程中Host DNS的执行过程称为迭代查询

规则:

1. Host DNS对于所有Host A的查询过程都是递归查询, 因为Host A不能自己查询主机域名查询, Host A必须通过指定的Host DNS将查询结果返回给自己

2. 不同的Host DNS的查询过程大多都是迭代查询, 因为递归查询过于消耗服务器资源, 一般DNS Server不会提供递归查询服务功能, 所以Host DNS只能亲自去查询目标主机地址


4.DNS服务器配置文件

Linux系统上使用bind应用程序来作为DNS解析服务程序.

bind程序的主要配置文件如下:

[root@www ~]# rpm -ql bind
/etc/NetworkManager/dispatcher.d/13-named
/etc/logrotate.d/named
/etc/named: named配置文件的默认存放目录
/etc/named.conf: 程序主配置文件
/etc/named.iscdlv.key
/etc/named.rfc1912.zones: 默认除根之外的区域配置文件, 用于指定定义的区域
/etc/named.root.key
/etc/portreserve/named
/etc/rc.d/init.d/named: named服务脚本文件
/etc/rndc.conf: 远程辅助工具rndc的配置文件
/etc/rndc.key: 远程辅助工具rndc的密钥文件
/etc/sysconfig/named: named的服务进程参数文件
/usr/lib64/bind
/usr/sbin/arpaname
/usr/sbin/ddns-confgen
/usr/sbin/dnssec-dsfromkey
/usr/sbin/dnssec-keyfromlabel
/usr/sbin/dnssec-keygen
/usr/sbin/dnssec-revoke
/usr/sbin/dnssec-settime
/usr/sbin/dnssec-signzone
/usr/sbin/genrandom
/usr/sbin/isc-hmac-fixup
/usr/sbin/lwresd
/usr/sbin/named: 程序文件
/usr/sbin/named-checkconf: 主配置文件语法检查程序
/usr/sbin/named-checkzone: 区域文件语法检查程序
/usr/sbin/named-compilezone
/usr/sbin/named-journalprint
/usr/sbin/nsec3hash
/usr/sbin/rndc
/usr/sbin/rndc-confgen
......
......
/usr/share/man/man8/rndc.8.gz
/var/log/named.log
/var/named: named数据文件的默认存放目录
/var/named/data
/var/named/dynamic
/var/named/named.ca
/var/named/named.empty
/var/named/named.localhost
/var/named/named.loopback
/var/named/slaves: 从DNS服务器数据文件存放目录
/var/run/named: named服务产生的进程


5.配置文件/etc/named.conf说明

语法格式说明:

1. { } 花括号不能紧跟字符, 需要添加空格隔开;

2. }后和每个语句需要有;表示语句结束

3. //表示对配置语句进行注释, 不起任何作用


常用字段说明:

options { }; 用于在配置文件中定义全局配置选项

options { 

    listen-on port 53 { 127.0.0.1; }; 设定监听套接字, 默认监听在127.0.0.1, 可以监听在多个地址用 ; 隔开, 注释该语句时表示监听在本地全部可用IP地址的53端口上

    directory "/PATH/FILE"; 指定DNS服务器的数据文件默认存放目录

    dump-file "/var/named/data/cache_dump.db"; 指定DNS缓存文件的存放路径

    statistics-file "/var/named/data/named_stats.txt"; 指定DNS统计信息文件的存放路径


    allow-query     { IP/Net; }; 指定允许进行查询的主机地址, 默认只允许本地主机查询, 需要进行修改, 注释表示允许所有主机查询; 该项用于查询供功能开放给本地主机时使用

    allow-transfer { SLAVE_IP; }; 实现DNS区域安全控制, 对指定DNS服务器允许从本机获取DNS区域文件, none字段表示对所有主机都不允许从本机获取DNS区域文件

    recursion no|yes; 是否允许递归, 默认为no关闭, 使用时需要开启, 默认可以对1000台主机进行DNS递归查询

    allow-recursion { IP; }; 定义DNS允许进行递归查询的主机白名单

    allow-update { IP; }; 定义允许动态更新区域数据文件的主机白名单

}; : 


zone " ZONE_NAME" { }; 用于在配置文件中定义区域

zone "ZONE_NAME"{ 

    type {master|slave|hint|forward}; 指定服务器角色: hint:表示根; master表示主服务器; forward表示转发服务器; 

    file "FILENAME"; 指定DNS数据库文件的相对位置, 相对位置的起始目录为/var/named/, 从DNS服务器数据库文件一般要放在/var/named/slaves/目录下, 注意:因为从DNS服务器的数据文件原来不存在, 需要从主DNS服务器同步传送, 因此从DNS服务器的数据文件的存放目录必须要对named用户赋予w权限

    masters { [MASTER1;MASTER;...] } ; 指定主DNS服务器地址, 配置主从DNS服务器时在从服务器端使用

    forward only|first ; 在forward服务器时启用(可以在全局options中定义), 其中first: 表示本服务器先将递归查询请求向本机指定DNS服务器进行转发, 指定服务器没有响应递归查询请求时, 本服务器再向根发起查询请求; only: 表示本服务器先将递归查询请求向本机指定DNS服务器进行转发, 指定服务器没有响应递归查询请求时, 本服务器不会再发起其他请求

    forwarders { IP1;IP2 } 指定查询DNS服务器的地址(可以在全局options中定义)

};


6.数据文件说明

数据书写规则:

1. 在数据库文件中可以不用添加 . root标识符, 没有使用 . 的名称都会被看作是本区域内的相对路径, 会在其后添加默认zone来进行解析;

2. 在name字段中不使用完整的FQDN, 而使用默认zone进行补全时可能不会出现错误, 但尽量书写完整FQDN

3. 在name字段中使用@时, 表示使用该字段为对应的zone; 使用空时, 表示该字段与上一条条目中的字段值相同

4. ttl字段: 表示该记录被其他DNS服务器查询到后会在对方主机中缓存的时间, 该处的ttl字段优先级高于SOA条目中的ttl字段; 全局定义TTL时. 需要使用$来指定宏; 

5. 在value字段中需要使用完整的FQDN: 需要使用 . 标识符作为结尾, 否则会在解析结果中默认添加该文件对应的zone进行扩展; 


常见条目分类说明如下图所示:

Linux常见应用--DNS基本工作原理_ dns_03


以上就是DNS基本工作原理.

本人水平有限, 如有理解不当的地方, 请大家给予指正, 非常感谢!