域名解析原理

上上周笔记被打赏了,开心。这是上周努力更新的两篇。

这章的内容为DNS服务,远程管理一章中使用PUTTET,利用Hosts文件是域名指向对方IP,其实就已经涉及到了DNS。

DNS(Domain Name Service)中文域名系统,负责将域名与IP之间的转换。平时访问网站的字符串“wuhash.com"被称为域名,在网络基础一章说过,计算机是使用IP地址通信的。为了解决IP越来越多,记忆困难的问题,出现了DNS,可以把它想象成一本通讯录,它记录了域名和IP的对应关系。

我们知道,IPv4地址已经枯竭,IPv6的时代开始到来。

我们说域名解析系统时,大部分情况下指的都是DNS,为什么我这么说?在小型局域网,通常还有另外一种域名解析服务,微软的WINS。

平时使用的www.wuhash.com被称做FQDDN(完全合格域名),是域加计算机名的总称,www是主机名,wuhash.com是域。DNS是一个分布式的系统,服务器被分散在世界各地。每一台DNS服务器都维护着自己数据库,里面存放着对应的记录。整个DNS的结构如下图:

Ubuntu Server 第八章 DNS服务_java

由于每一个域对应的DNS服务器没有全部域的DNS记录,当被请求查询时,请求会被先转发到根域,根域再逐级委派到目标域,目前根域由ICANN负责管理。

记录也有着不同的类型,下图是Dnspod的解析说明:

Ubuntu Server 第八章 DNS服务_java_02

这里只是一些常用的记录,另外还有一些需要了解

  • SOA :起始授权机构,SOA记录设置一些数据版本和更新以及过期时间的信息。

  • PTR:IP反向解析到域名

DNS查询结构

这一小节将介绍DNS的应用和部署细节

在一个域中有三种DNS服务器角色:主域名服务器(Master DNS)、辅助域名服务器(Slave DNS ),缓存服务器(Cache DNS)

  • Master DNS:提供DNS服务服务,含有区域(zone)的数据文件

  • Slave DNS :数据文件来自于Master的同步

  • Cache DNS:不包含Zone的数据文件,代替客户端查询,结果保存在缓存中,缓存结果在TTL到达之后删除

在家庭网络中,典型的网络结构是光猫上联运营商提供的光纤,下连家庭局域网的无线AP或者交换机。光猫拨号会获得一个IP、DNS和其它信息。这里的DNS实际是就是运营商的提供的Cache DNS服务器。如果没有进行额外的配置,局域网的主机DHCP获取到的DNS是光猫或者无线AP的LAN口IP。当使用LAN IP为DNS时,客户端的DNS请求被进行了代理(转发-Forward),。如果直接使用某DNS地址,DNS请求将直接发送到设置的服务器。

那么DNS请求发送到预先定义的服务器之后发生了什么呢

可以看到DNS请求过程中,客户端到本地服务器的过程被称为递归查询,本地服务器从根服务器迭代到与与服务器查询的过程被称为迭代查询。

DNS服务安装

企业内部用户量到达一个规模时,优化网络流量成了一个问题。其中一个办法便是自建DNS服务器,减小DNS请求在边界网关的转发量,空闲出更多的带宽。Win Server的DNS Server下次我看有机会写,这里主要介绍Ubuntu下的DNS服务搭建。使用最广的DNS服务器软件是BInd(Berkeley Internet Name Domain),支持多种平台。默认使用TCP 53/UDP 53端口进行服务。客户端查询服务时使用的是UDP的53端口,TCP的端口在主辅DNS之间同步和传输数据使用。有一种特殊情况,客户端发出DNS查询请求之后,接受到的应答总长度超过512字节,之后使用TCP重发查询请求。


  1. sudo apt install bind9 dnsutils #测试工具 dig  host nslookup等命令来自dnsutils包

  2. cat /etc/bind/db.root #此文件已经包含了分布在全世界13个根逻辑域名服务器地址,不急有IPv4地址,甚至有IPv6地址。这里有一个问题,13个根逻辑域名服务器地址是够代表只有13台根域名服务器地址?不是的,13个IP是任播IP,实际对应物理服务器的任播镜像点。IP会将路由指向你最近的相应节点。

  3. ll /usr/sbin/named #主程序文件

  4. cat /etc/bind/named.conf #主配置文件,众多配置文件的入口

  5. /etc/bind/named.conf.options #配置DNS转发服务器,成为缓存DNS服务器

  6. /etc/bind/named.conf.local #定义内部zone的文件

  7. /etc/bind/named.conf.default-zones #定义zone的文件


  8. sudo vim /etc/bind/named.conf.options

  9. acl "local"{

  10.    10.10.10.10/24

  11. } #指定可允许的DNS请求的网段

  12. options {

  13.  recursion yes #允许递归

  14.    listen-on {10.10.10.131;}; #指定侦听的网卡

  15.    // forwarders {

  16.    //  8.8.8.8

  17. } #指定转发的DNS服务器

  18. }; #注意我这里没有展示全部配置,只给出了修改的部分


  19. zone "sina.com.cn"{

  20.    type forward;

  21.    forwarders {

  22.        1.1.1.1;

  23. };

  24. };#定义zone转发,"sina.com.cn"域下的主机记录会被转发到1.1.1.1

上述配置文件配置之后,可使用同一网络下的主机设置它为DNS测试,推荐该过程中使用wireshark查看数据包验证。

虽然被配置了DNS服务器,但是网卡配置里仍然需要制定DNS,关于具体的根域服务器更多信息可以查看这里。如果要将DNS服务器部署到公网上,建议禁用本域以外递归查询。

Bind的替代方案

  • Djbdns:Dbndns、ndjbdns

  • dnsmasq:DNS+DHCP打包的轻量解决方案

  • PowerDNS:模块化的开元DNS服务器软件

配置Master服务器

DNS是解析域名和IP之间相互转换的系统。我们将FQDN到IP定义为正向解析,IP解析为fqdn为反向解析。这里配置的是正向解析。

配置环境

  • DNS server : Ubuntu server (10.10.10.131)、Bind9

  • WEB server : Ubuntu server(10.10.10.130)、Apache

  • DNS client:Kali Linux(10.10.10.132)


  1. sudo vim /etc/bind/named.conf.local

  2. zone "example.com"{

  3.    type master;

  4.    file "/etc/bind/db.example.com";

  5. };


  6. cd /etc/bind/

  7. cp db.local db.example.com


  8. sudo vim db.example.com

  9. @ IN NS ns  #将文件末的配置修改为对应的主机记录

  10. @ IN A 10.10.10.130

  11. ns IN A 10.10.10.130 #ns记录必须添加,否则会报错

  12. www IN A 10.10.10.130 #主机记录

  13. #这里说明一下,同一条主机记录可添加多个A记录地址,可达到负载均衡的效果,注意,DNS缓存机制会影响实验解析结果,windows下使用“ifconfig /flushdns”清除缓存。


  14. sudo named-checkconf    #检查配置文件

  15. sudo named-checkzone example.com /etc/bind/db.example.com #检查zone文件

  16. sudo systemctl restart bind9  #重启服务

  17. sudo systemctl status bind9 #查看状态

我这里就不开其它虚拟机验证,使用Kali 下的工具来测试。

dig example.com  @10.10.10.131 ANY #指定DNS服务器为10.10.10.131,查询所有记录nslookup -qt=A example.com 10.10.10.131 #指定DNS服务器为10.10.10.131,查询A类型的记录,并不是说dig不能查,两款工具都可以用

反向解析配置

FQDN配置完成之后,进行反向区域的配置。还记得记录类型中有一项记录为MX记录,可以设置邮箱服务器地址,(关于邮箱服务器的搭建,以后会介绍),前面建立一个名为”example.com“的zone,我们可以使用"example.com"对外发送邮件。这里出现了一个问题?实际上我并不拥有”example.com“域名,收件方收到我,如何验证我的真实性呢?反向解析的作用就体现出来了。


  1. cd /etc/bind/

  2. sudo vim named.conf.local #新建一个zone

  3. zone "10.10.10.in-addr.arpa" {

  4.    type master;

  5.    file "/etc/bind/db.10.10.10";

  6. }; #上面in-addr部分,地址是解析网段的逆序,我这里因为地址特殊。

  7. cp


  8. cp db.127 db.10.10.10

  9. sudo vim db.10.10.10 #其它配置不太多介绍,这里说一个大坑,FQDN后不写点,named-checkzone检查不出错误的,但是配置不出效果的

  10. @    IN  NS ns.example.com.  

  11. 130 IN     PTR example.com.

kali linux 下验证

dig -x 10.10.10.130 @10.10.10.131 #使用dig命令反向解析,如配置正确,可看到对应的PTR记录

配置Slave DNS服务器

冗余是不变的话题,Slave DNS服务器的配置很有必要,Slave不一定只有一台,修改记录只在Master上操作,通过版本号(Serial,只能手动修改)通知Slave服务器同步,出于安全的考虑,服务器应全局禁止去区域传输(同步本域所有的DNS记录),只允许指定IP,指定区域的SLave服务器进行区域传输。区域传输:申请传输所有的DNS记录,区域传输可以发生在DNS服务器之间,也可以发生在客户端与DNS服务器之间。

dig @10.10.10.130 example.com axfr #未禁止区域传输,可使用此命令拿取所有记录

在Master DNS服务器上修改文件

sudo vim named.conf.optionsoptions {allow-transfer {none;};}; # 在options里插入这一行sudo systemctl restart bind9 sudo systemctl status bind9

再此在Kali上使用dig命令发现不能区域传输了

sudo vim named.conf.local #local配置文件的优先级由于optionsallow-transfer {10.10.10.130;};#在zone里和反向zone均添加可以区域传输的IP,

之前配置的ns记录也相应的做出修改,“10.10.10.133”是我链接克隆的一台机器。

Ubuntu Server 第八章 DNS服务_java_03

下面是slave服务器上的配置


  1. sudo vim /etc/bind/named.conf.options #链接克隆,文件也存在

  2. listen-on {10.10.10.133;}; #修改配置为Slave的网卡地址,其余配置保持不变即可

  3. sudo vim named.conf.local

  4. zone "example.com"{

  5.    type slave;

  6.    file "db.example.com";

  7.    masters {10.10.10.131;};

  8. };

  9. zone "10.10.10.in-addr.arpa" {

  10.    type slave;

  11.    file "db.10.10.10";

  12.    masters {10.10.10.131;};

  13. };#注意file文件的文件和type


  14. sudo systemctl restart bind9

  15. sudo systemctl status bind9

cd /var/cache/bind #同步的缓存位置,加密sudo grep bind /var/log/syslog #查看有关bind的系统日志,可排除#这里笔者实验最初几次没有同步到缓存,使用"sudo systemctl status bind9"发现master有报错,检查修改之后成功同步。

kali下使用 dig www.example.com@10.10.10.133验证,得到的记录结果与与”10.10.10.131“相同。在master DNS 配置文件中修改解析记录并更新版本号,重启服务。如配置无误,修改的结果也将被同步。建议在Master的local中添加此项配置,以获得更快的同步。

sudo vim named.conf.localzone "example.com"{    type master;    file "/etc/bind/db.example.com";    allow-transfer {10.10.10.133;};    Also-notify {10.10.10.133;}; #添加的配置};zone "10.10.10.in-addr.arpa" {    type master;    file "/etc/bind/db.10.10.10";    allow-transfer {10.10.10.133;};    Also-notify {10.10.10.133;}; #添加的配置};

后话

写的这里,手腕真的撑不住了,腱鞘炎真的伤不起。脖子酸痛可能和我的坐姿有关。下一章内容时长有点恐怖,我尽量一周更出来。