目录
DNS 分布式数据库
在最古早的时候,为了让 ARPANET 上的计算机能够通过一个易于记忆的名称来进行寻址,而为每台计算机设计了一个 Hostname,并在 hosts 文件中记录了这些 Hostname 和 IP 地址的映射关系。但后来随着 APRANET 网络的规模逐渐扩大,hosts 记录这种简单粗暴的方式便不再适用了。
在 1983 年,Paul Mockapetris 提出了 DNS(Domain Name System,域名系统)的概念。这是一种具有层次的、基于 Domain(域)的 Named(主机命名)方案,并且用一个分布式数据库系统加以实现。
所以,DNS 的本质是一个实现了 DNS 协议的分布式数据库,它用于完成 Domain Name 和 IP 地址相互映射,能够让用户更方便地访问互联网。
Domain 分层架构
为了让 DNS 能够支撑遍布全球的互联网用户,DNS 在设计之初就提出了非常合理 Domain 分层架构的理念。这种层次化的地址结构与我们日常生活中的邮寄系统非常类似,例如:中国北京市海淀区XX街道XX楼XX室。
对于互联网世界来说,Domain 分层架构的 Zones(区)由 ICANN(互联网名称与数字地址分配机构)负责统一管理,呈现为树形结构,最顶上的为根服务器,然后为顶级域名。目前,已经有超过 250 个顶级域名,每个顶级域名又可以进一步的划分出二级域名,二级域名又可以再划分出三级域名。依此类推,最终形成了我们现在见到的 www.google.com. 此类形式。(注:最后一个点表示根服务器,默认可忽略。)
总的来说,Domain 分层架构的设计带来了以下好处:
- 层级清晰:每一级域名代表一个层级,整个域名系统具有清晰的层次结构,有助于域名资源的管理和维护。
- 分布式管理:DNS 是一个分布式数据库,不同的域名由不同的 DNS 服务器管理,有助于 DNS 服务器的管理和维护,也避免了单点故障。
- 易于扩展:可以根据需要简易的在树形结构上添加新的域名节点,而不会影响到整个系统的稳定性和性能。
- 易于解析:使得域名更容易被解析,有助于搜索和查找。也方便进行域名解析的缓存,提高了域名解析的效率。
全球 DNS 服务器集群
和 Domain 分层架构对应的,互联网中的 DNS 系统由一系列的 DNS 服务器集群组成,它们协同工作,共同提供域名解析服务。
从高层次往下看,DNS 服务器可以为下列 4 大类:
-
根域名服务器:是最重要的域名服务器,由 ICANN 授权给不同的组织运营,记录了整个互联网所有的顶级域名服务器的域名和地址。所有下级服务器无法解析一个域名时,都会向根服务器求助。全球共有 13 台根服务器,名字依次为 [A-M].root-servers.net。为了分摊极其海量的访问压力,每个根服务器都会有更多的镜像服务器,每台根服务器与它的镜像服务器共享同一个 IP 地址,当你访问的域名需要根服务器帮忙解析时,实际上会由离你最近的镜像服务器代劳。截至 2021 年 7 月,国内大陆地区共有 F、I、J、K、L 这 5 台根服务器的 21 台镜像服务器在线。
-
顶级域名服务器:关联到根服务器,并负责管理单一顶级域名下属的所有二级域名。
-
权威域名服务器:关联到一个顶级服务器,并负责一个二级域名下属的一个 Domain Zone 内所有域名的解析工作。
-
本地域名服务器:由电信运营商运营的一个用户宽带接入 DNS 服务器,是电信用户接入互联网后访问的第一个 DNS 服务器。负责一个 Local Domain Zone 内所有域名的解析工作,并关联到其他上级服务器。
-
私有域名服务器:在企业或组织内部部署的私有域名服务器,不需要在互联网上注册。
如此的,全球海量的域名资源记录就被合理地分散保存在多个 DNS 服务器中,故也称为分布式数据库,并且所有的 DNS 服务器之间也组织成为了一个具有层次的索引结构。
DNS 域名递归解析流程
域名解析流程,即:DNS 系统将域名解析为 IP 地址的过程。域名递归解析流程,即:从 DNS 系统中的根服务器开始向下递归多个相关 DNS 服务器并最终完成域名解析的流程。一个相对完整的流程如下图所示:
- 电脑开机,随即从 DHCP 服务器获得 IP 地址和电信运营商的 Local DNS 服务器(e.g. 8.8.8.8)地址。
- 用户打开浏览器访问 www.cmbc.com.cn,先查浏览器的 DNS 查询记录缓存。
- 如果没有,再通过 Kernel Resolver(内核 DNS 解析器)查本机的 hosts 文件记录。
- 如果没有,则 Kernel Resolver 发出 DNS Query Request 到 Internet 上的 Local DNS 服务器。
- Local DNS 服务器通常对应一个 Domain Zone,如果待查域名并不属于这个 Zone 内,且 Local DNS 服务器对该域名没有缓冲记录(假设后续环节中都没有命中 DNS 记录缓存),那么此时 Local DNS 服务器从根服务器开始进行逐级的递归查询,依次向
.
、cn.
、com.cn.
、cmbc.com.cn.
域名服务器发出 Query Requests,并最终返回域名对应的 IP 地址给用户。
部署私有 DNS 服务器
在 Linux 上部署一台私有 DNS 服务器非常简单,关键是从配置过程中理解 DNS 系统的组织形式。
- 安装 BIND9。
sudo yum install bind bind-utils -y
- 配置主配置文件 /etc/named.conf。
options {
listen-on port 53 { 127.0.0.1; }; # DNS 协议监听的 IP 地址和端口号
listen-on-v6 port 53 { ::1; };
directory "/var/named"; # DNS 数据文件存放路径
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";
allow-query { localhost; }; # 客户端 IP 地址白名单
recursion yes; # 是否支持递归查询
dnssec-enable yes;
dnssec-validation yes;
bindkeys-file "/etc/named.root.key";
/* Path to ISC DLV key */
bind-dynamic-db "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
zone "fguiju.com" IN { # 定义 DNS 服务器的 Domain Zone
type master; # 声明域名的类型为主域名
file "fguiju.com.zone"; # 域名解析数据文件的位置
allow-update { none; }; # 允许更新的客户端IP地址
};
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 创建域名解析数据文件 /var/named/fguiju.com.zone。
$TTL 3600 ; Time To Live
; Domain Zone ; Domain Names
fguiju.com. IN SOA ns1.fguiju.com. admin.fguiju.com. (
2022040301 ; Serial
10800 ; Refresh
3600 ; Retry
604800 ; Expire
86400 ; Minimum TTL
)
IN NS ns1.fguiju.com.
IN NS ns2.fguiju.com.
; Name server
ns1 IN A 192.168.1.100
ns2 IN A 192.168.1.101
; Mail exchanger
fguiju.com. IN MX 10 mail.fguiju.com.
; Address record
www IN A 192.168.1.102
mail IN A 192.168.1.103
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 启动 DNS 服务,并设置开机自启动。
sudo systemctl start named
sudo systemctl enable named
- 2
- 验证 DNS 解析是否生效。
$ dig fguiju.com