DNS工作原理与基本部署

DNS服务器基本原理、利用Bind9搭建本地DNS服务器

一、DNS简介

1.1 DNS的作用

因特网上的主机有多种方式来标识,比如IP地址、主机名、域名等。但是,这些标识方式都有各自的特点,不同的标识方式有不同的优缺点。比如,IP地址是唯一的,但是不容易记忆;主机名(如www.baidu.comwww.google.com)是容易记忆的,但是不唯一;域名(如baidu.comgoogle.com)是唯一的,也容易记忆,但是需要通过域名服务器(DNS server)来解析。因此,域名是最常用的标识方式。

DNS(Domain Name System)是因特网上作为域名IP地址相互映射的一个由分层的DNS服务器实现的分布式数据库,它能够使人更方便地访问因特网。DNS服务器就是存储域名和IP地址映射信息的服务器,它能够将域名解析为IP地址(正向解析),或者将IP地址解析为域名(反向解析)。另外,DNS亦指一个使得主机能够查询分布式数据库的应用层协议,DNS协议运行在UDP协议之上,使用53号端口

而DNS服务器一般运行在BIND( Berkeley Internet Name Domain)软件上,BIND是一个开源的DNS服务器软件,由Berkeley大学开发,现在由ISC(Internet Systems Consortium)维护。

DNS除了能够实现域名与IP地址之间的映射,还提供了以下服务:

  • 主机别名(host aliasing): 一个主机可以有多个别名,这样就可以用不同的名字来访问同一个主机。例如,一台拥有着复杂主机名example.hangzhou.zj.gov.cn的主机,可以通过news.hz.gov.cnhz.gov.cn来访问。其中,news.hz.gov.cnhz.gov.cn都是example.hangzhou.zj.gov.cn的别名,而example.hangzhou.zj.gov.cnnews.hz.gov.cnhz.gov.cn规范主机名

  • 邮件服务器别名(mail server aliasing):除了让主机名更容易记忆,电子邮件地址的便捷性也很重要。例如,如果Albrecht想要一个gmail账户,Albrecht的邮件地址可能就像albrecht@gmail.com这么简单,但是实际上Gmail邮件服务器的主机名可能比这复杂多了,它的规范主机名可能是这样的:mailserver2.california.gmail.com。因此,邮件服务器别名的引入,就可以让电子邮件应用程序通过调用DNS,对提供的主机名别名(gmail.com,[注]MX记录允许邮件服务器和Web服务器使用相同的主机名别名)进行解析,从而得到规范主机名(mailserver2.california.gmail.com),从而访问邮件服务器。

  • 负载分配(load distribution):DNS服务器可以将一个被频繁访问的主机名映射到多个IP地址上,这样就可以实现繁忙主机的负载分配。例如,一个主机名www.baidu.com可以映射到多个IP地址上,当用户访问www.baidu.com时,DNS服务器会将用户的请求分配到不同的IP地址上,从而降低某一台主机的负载,以实现实现负载分配。

1.2 DNS的工作原理

1.2.1 DNS服务器的层次(分类)

  • 根域名服务器(root name server):根域名服务器是DNS服务器的最高层,它是DNS服务器的顶级服务器,它存储着顶级域名服务器的地址信息,例如,com域名服务器的IP地址信息,edu域名服务器的IP地址信息,gov域名服务器的IP地址信息等。

  • 顶级域名服务器(top-level domain name server):顶级域名服务器是DNS服务器的第二层,它存储着权威DNS服务器的地址信息(例如,baidu.com权威域名服务器的地址信息,hdu.edu权威域名服务器的地址信息)。

  • 权威域名服务器(authoritative name server):权威域名服务器是DNS服务器的第三层,它存储着主机名和IP地址的映射关系(例如,www.baidu.com的主机IP地址信息)。

1.2.2 本地DNS服务器

本地DNS服务器通常指的是ISP提供的DNS服务器,它并不属于上述的DNS服务器层次,该DNS服务器与用户主机一般只相隔几个路由器而已。当用户主机发起DNS请求时,该请求就会被发往本地DNS服务器,本地DNS服务器起着代理的作用,它会将用户的DNS请求转发到上述的DNS服务器层次中的某一台DNS服务器上,然后将DNS服务器返回的结果返回给用户主机。

1.2.3 DNS服务器的工作流程(不考虑DNS缓存)

/network-dns-bind9/dns.webp
各种DNS服务器的交互

假设主机cs.hdu.edu.cn想要访问cs.zju.edu.cn,那么在建立TCP连接前,主机cs.hdu.edu.cn肯定要知道cs.zju.edu.cn的IP地址。这里假设cs.hdu.edu.cn的本地DNS服务器为dns.hdu.edu.cn,且cs.zju.edu.cn的权威服务器为dns.zju.edu.cn。

  • 首先,主机cs.hdu.edu.cn向本地DNS服务器dns.hdu.edu.cn发送一个DNS查询报文,请求cs.zju.edu.cn的IP地址。
  • 本地DNS服务器将该报文转发给根域名服务器,根域名服务器根据请求报文中的edu前缀,向本地DNS服务器返回edu域名服务器的IP地址列表
  • 本地DNS服务器接收到上述IP地址列表后,从中选择一个IP地址,向该IP发送一个DNS查询报文,请求cs.zju.edu.cn的IP地址。
  • edu权威域名服务器收到本地DNS服务器的请求报文后,根据请求报文中的zju.edu前缀,向本地DNS服务器返回zju.edu域名服务器的IP地址列表
  • 本地DNS服务器接收到zju.edu域名服务器的IP地址列表后,从中选择一个IP地址,向该IP发送一个DNS查询报文,请求cs.zju.edu.cn的IP地址。
  • dns.zju.edu.cn权威域名服务器收到本地DNS服务器的请求报文后,根据请求报文中的cs.zju.edu.cn目标主机名,向本地DNS服务器返回cs.zju.edu.cn主机的IP地址。

1.3 DNS记录

资源记录(Resource Record,RR)是DNS数据库中的一条记录(四元组),它包含了一些域名系统中的资源信息,例如域名、IP地址、邮箱地址等。DNS数据库中的每条记录都是一个RR,RR的格式如下:

<name> <TTL> <class> <type> <data>

其中,name是域名,TTL是生存时间,class是类别,type是类型,data是数据。

Name和Value的值取决于Type:

  • Type=A:Name是主机名,Value是IP地址;
  • Type=NS:Name是域名,Value是获得Name域中主机IP地址的权威DNS服务器的主机名;
  • Type=CNAME:Name是别名,Value是规范主机名;
  • Type=MX:Name是域名,Value是邮件服务器器的规范主机名。

二、搭建本地DNS服务器

Ubuntu系统为例,利用BIND搭建本地DNS服务器。

2.1 安装bind

1
sudo apt-get install bind9 bind9utils bind9-doc dnsutils

2.2 配置bind

在bind9中,/etc/bind/目录保存了bind的配置文件,/var/cache/bind/目录保存了bind的数据库文件。

本文以IPv4地址解析为例,故先指定named只解析IPv4

1
sudo vim /etc/default/bind9

OPTIONS选项指定为:

1
OPTIONS="-u bind -4"
  • /etc/bind目录
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# /etc/bind/

├── bind.keys
├── db.0
├── db.127
├── db.255
├── db.empty
├── db.local
├── db.root
├── named.conf
├── named.conf.default-zones
├── named.conf.local
├── named.conf.options
├── named.conf.rfc1912.zones
├── rndc.key
└── zones.rfc1918

其中,

  • named.conf是bind的主配置文件,它包含了其他配置文件的引用;
  • named.conf.options是bind的配置文件,它包含了bind的配置选项;
  • named.conf.local是bind的配置文件,它包含了本地域名服务器的配置选项;
  • named.conf.default-zones是bind的默认配置文件,它包含了默认的域名服务器的配置选项;

2.2.1 编辑named.conf

named.conf内容是由以下三个文件定义的:

1
2
3
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";
  • 首先重新生成rndc密钥:
1
sudo rndc-confgen
  • 输出如下:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# Start of rndc.conf
key "rndc-key" {
	algorithm hmac-md5;
	secret "BbNdifeAlefcKTCehu2xIQ==";
};

options {
	default-key "rndc-key";
	default-server 127.0.0.1;
	default-port 953;
};
# End of rndc.conf

# Use with the following in named.conf, adjusting the allow list as needed:
# key "rndc-key" {
# 	algorithm hmac-md5;
# 	secret "BbNdifeAlefcKTCehu2xIQ==";
# };
# 
# controls {
# 	inet 127.0.0.1 port 953
# 		allow { 127.0.0.1; } keys { "rndc-key"; };
# };
# End of named.conf
  • 将上述输出日志的以下部分取消注释#,然后追加到named.conf中:
1
2
3
4
5
6
7
8
9
key "rndc-key" {
	algorithm hmac-md5;
	secret "BbNdifeAlefcKTCehu2xIQ==";
};

controls {
	inet 127.0.0.1 port 953
	allow { 127.0.0.1; } keys { "rndc-key"; };
};
  • 日志记录

named.conf中追加:

1
2
3
4
5
6
logging {
  channel default_debug {
    file "named.run"; //记录了一些named的信息,如监听/解析记录等,位置在/var/named/chroot/var/named/data下
    severity dynamic;
  };
};

2.2.2 编辑name.conf.options

  • name.conf.options内容如下:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
options {
	directory "/var/cache/bind";  //数据库文件存放目录

  // 转发服务器
	forwarders {
 		223.5.5.5;
	};

	// Domain Name System Security Extensions安全认证机制
  dnssec-enable no;
	dnssec-validation no;
	auth-nxdomain no;    # conform to RFC1035

  allow-query { any; };  //允许查询的IP地址, any表示所有IP地址
  recursion yes;        //允许递归查询
	listen-on-v6 { any; };  // 要监听IPv6地址
};

2.2.3 编辑named.conf.local

  • 正向解析:将域名解析为IP地址

  • 反向解析:将IP地址解析为域名

  • named.conf.local内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// 本地域名服务器:正向解析
zone "shikaihdu.net" {
    type master;  // 主服务器
    file "/etc/bind/db.shikaihdu.net";  // 域名SOA配置
};

// 本地域名服务器:反向解析
zone "1.168.192.in-addr.arpa" {
    type master;  // 主服务器
    file "/etc/bind/db.rev-shikaihdu.net";  // 域名SOA配置
};

2.2.4 编辑SOA记录

  • SOA记录是域名服务器的配置文件,它包含了域名服务器的配置信息,如域名服务器的IP地址、域名服务器的管理员邮箱、域名服务器的刷新时间等

  • [根域] 即所谓的“.”,比如主机名www.baidu.com在SOA配置中应该为www.baidu.com.

  • SOA记录的配置文件有两个,分别是正向解析和反向解析的配置文件

  • 正向解析的配置文件:/etc/bind/db.shikaihdu.net

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$TTL    604800
@       IN      SOA     shikaihdu.net. root.shikaihdu.net. (
                             21         ; Serial 本区配置数据的序列号,用于从服务器判断何时获取最新的区数据
                         604800         ; Refresh 若辅助域名服务器更新数据失败,多长时间再试
                          86400         ; Retry 若辅助域名服务器更新数据失败,多长时间再试
                        2419200         ; Expire 若辅助域名服务器无法从主服务器上更新数据,原有的数据何时失效
                         604800 )       ; Negative Cache TTL 缓存TTL
;
@       IN      NS      shikaihdu.net. ; 域名服务器
@       IN      A       192.168.1.106 ; 本地域名服务器的IP地址
ltsc    IN      A       192.168.1.109 ;为局域网内的虚拟机主机ltsc的IP地址
pc      IN      A       192.168.1.112 ;为局域网内的物理主机pc的IP地址
  • 反向解析的配置文件:/etc/bind/db.rev-shikaihdu.net
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$TTL    604800
@       IN      SOA     shikaihdu.net. root.shikaihdu.net. (
                             21         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      shikaihdu.net.
106     IN      PTR     shikaihdu.net.
109     IN      PTR     ltsc.shikaihdu.net
112     IN      PTR     pc.shikaihdu.net

2.2.5 named配置文件检查

  • 检查named.conf文件是否有语法错误(会递归检查named.conf中包含的配置)
1
$ named-checkconf
  • 检查指定域名的配置文件
    • 若输出OK,表示无语法错误;否则会输出错误信息
1
$ named-checkzone shikaihdu.net /etc/bind/db.shikaihdu.net

2.3 重载配置

  • 重载配置文件:sudo rndc reconfig
  • 重启named服务:sudo systemctl restart bind9

三、客户机测试

3.1 配置DNS服务器地址

  • Linux客户机
    • 编辑/etc/resolv.conf文件,修改全局DNS:
1
nameserver 192.168.1.106
  • Windows客户机
    • 更改适配器选项,对网络设备点击“属性”
      • 取消选择“Internet协议版本6(TCP/IPv6)”
      • 选择“Internet协议版本4(TCP/IPv4)”,点击“属性”,修改DNS服务器地址:192.168.1.106
/network-dns-bind9/windows-dns.webp
Windows设置DNS服务器地址

3.2 测试

  • Linux客户机
1
2
ping ltsc.shikaihdu.net
ping pc.shikaihdu.net
  • Windows客户机
1
2
ping ltsc.shikaihdu.net
ping pc.shikaihdu.net
  • 测试结果
/network-dns-bind9/linux-ping.png
Linux中ping ltsc/pc.shikaihdu.net
/network-dns-bind9/windows-ping.png
Windows中ping ltsc/pc.shikaihdu.net

五、参考文献

给作者倒杯卡布奇诺 ~
Albresky 支付宝支付宝
Albresky 微信微信