DNS 服务器
DNS(Domain Name System,域名系统)服务是用于将域名转换为 IP 地址的分布式数据库服务,也是互联网核心服务之一,能让用户通过易记的域名访问网络服务,无需记忆复杂 IP 地址。同时,它还是存储网络主机和资源目录的分层命名系统,目录信息会将网络名称映射到不同资源记录。DNS 层次结构根域:DNS 层次结构最顶层,用独立的 “.” 表示。顶级域:处于 DNS 层次结构第二层,像.c
文章目录
DNS 服务器
DNS 服务介绍
DNS(Domain Name System,域名系统)服务是用于将域名转换为 IP 地址的分布式数据库服务,也是互联网核心服务之一,能让用户通过易记的域名访问网络服务,无需记忆复杂 IP 地址。同时,它还是存储网络主机和资源目录的分层命名系统,目录信息会将网络名称映射到不同资源记录。
DNS 层次结构
- 根域:DNS 层次结构最顶层,用独立的 “.” 表示。
- 顶级域:处于 DNS 层次结构第二层,像.com、.net、.org、.cn、.hk 等都属于顶级域。
- 二级域:位于 DNS 层次结构第三层,例如 linux.fun、redhat.com 等,由各个组织使用。
- 子域:在二级域之下,如 department.linux.fun。
- 主机:层次结构最底层,如 Server1.department.linux.fun、Host1.Server1.department.linux.fun。
DNS 层次结构相关术语
- Domain(域)
- 是 resource records(资源记录)的集合,以通用名结尾,代表 DNS 命名空间的整个子树,比如 linux.fun。
- top-level domain(TLD,顶级域)由 Internet Assigned Numbers Authority(IANA,互联网号码分配机构)管理并负责委派。
- 常见的 TLD 类型
- Generic TLDs(gTLD,通用顶级域名):最初按主题组织,包括.com、edu、.net 等。
- Country code TLDs(CCTLD,国家代码顶级域名):依据 ISO3166-1 标准在国家范围上组织,包含.us、.uk、.cn、.ru 等域。
- Subdomain(子域)
- 是另一个域的完整子树的域,用于描述两个域之间的关系。例如,lab.linux.fun 是 linux.fun 的子域,linux.fun 是.com 的子域,也可称 linux.fun 为二级域,lab.linux.fun 为三级域。
- Zone(区域)
- 是特定名称服务器直接负责的域,可能是整个域,也可能只是域的一部分。
- Zone 可将部分或全部子域委派给另一个或多个名称服务器。比如,root 名称服务器对 root zone 具有权威性,但会将.com 域的职责委派给其他名称服务器,这些服务器为.com 区域提供权威性应答,且还能继续委派责任。
DNS 查询
主机的 DNS 查询主要有递归查询和迭代查询两种方式,DNS 查询时,请求报头部的 RD 字段决定查询类型,RD 为 1 时是递归查询(默认查询方式),RD 为 0 时是迭代查询。
递归查询
递归查询
定义:以本地名称服务器为中心,DNS 客户端仅发出原始域名查询请求报文,之后一直等待,直到本地名称服务器返回最终查询结果,此时本地名称服务器相当于中介代理。
过程:
- 客户端向本机配置的本地名称服务器发出 DNS 域名查询请求。
- 本地名称服务器收到请求后,先查询本地缓存:
- 若有该域名记录项,直接将结果返回给客户端。
- 若没有,本地名称服务器以 DNS 客户端角色,向根名称服务器发送相同的 DNS 域名查询请求。
- 根名称服务器收到请求后,将查询到的请求域名中顶级域名对应的顶级名称服务器地址返回给本地名称服务器。
- 本地名称服务器根据根名称服务器返回的地址,向对应的顶级名称服务器发送查询请求。
- 顶级名称服务器收到请求后,先查本地缓存:
- 若有该域名记录项,直接返回给本地名称服务器,再由本地名称服务器返回给客户端。
- 若没有,向本地名称服务器返回请求域名中二级域名对应的二级名称服务器地址。
- 本地名称服务器根据顶级名称服务器返回的地址,向对应的二级名称服务器发送查询请求。
- 二级名称服务器收到请求后,先查本地缓存:
- 若有该域名记录项,直接返回给本地名称服务器,再由本地名称服务器返回给客户端。
- 若没有,向本地名称服务器返回请求域名中三级域名对应的三级名称服务器地址。
- 本地名称服务器重复步骤 6 和 7,向三级、四级等名称服务器查询,直到从权威名称服务器获取最终记录。
- 本地名称服务器将最终结果返回给 DNS 客户端,同时缓存本次查询记录项。
迭代查询
迭代查询
定义:以 DNS 客户端自己为中心,所有查询工作由客户端自行完成。客户端会按顺序向本地名称服务器、一级名称服务器、二级名称服务器、权威名称服务器发出查询请求,每一级服务器返回能解答查询的下一个名称服务器列表,客户端再向该列表中的服务器查询,直到找到负责该域名的权威名称服务器,获取最终结果。
过程:
- DNS 客户端向本机配置的本地名称服务器发出 DNS 域名查询请求。
- 本地名称服务器收到请求后,先查询本地缓存:
- 若有该域名记录项,直接将结果返回给客户端。
- 若没有,向 DNS 客户端返回包含根名称服务器地址等参考信息的应答报文。
- DNS 客户端根据根名称服务器地址,向对应的根名称服务器再次发出相同的查询请求。
- 根名称服务器查询后,将请求域名中顶级域名对应的顶级名称服务器信息,以应答报文返回给客户端。
- 客户端根据顶级名称服务器地址,向对应的顶级名称服务器发出查询请求。
- 顶级名称服务器收到请求后,先查询本地缓存:
- 若有该域名记录项,直接将记录项返回给客户端。
- 若没有,查询后将请求域名中二级域名对应的二级名称服务器地址信息,以应答报文返回给客户端。
- 客户端继续按步骤 5 和 6 的方法,向三级、四级名称服务器查询,直到从权威名称服务器获取最终记录。
递归查询与迭代查询的区别
查询方式 | 查询中心 | 查询过程 |
---|---|---|
递归查询 | 本地名称服务器 | 客户端仅发送一次请求,后续查询由本地名称服务器完成,客户端等待最终结果 |
迭代查询 | DNS 客户端 | 客户端需多次发送请求,依次向各级名称服务器查询,直到获取最终结果 |
DNS 资源记录
DNS 区域中的 DNS resource record(RR,DNS 资源记录)条目指定区域中特定名称或对象的信息,其格式如下:
1 owner-name TTL class type data 2019 server.linux.fun. 300 I**N A 192.168.1.10
各字段说明:
Field name Content owner-name 该资源记录对应的名称 TTL 资源记录的生存时间(以秒为单位),指定 DNS 解析器应缓存该资源记录的时长 class 记录的 “类别”,几乎都是 “IN”(表示互联网) type 记录存储的信息类型,例如 A 记录将主机名映射到 IPv4 地址 data 记录存储的数据,具体格式因记录类型而异
A 资源记录
将主机名映射到 IPv4 地址:
server.linux.fun. 86400 IN A 172.25.254.254
AAAA 资源记录(4A 记录)
将主机名映射到 IPv6 地址:
a.root-servers.net. 604800 IN AAAA 2001:503:ba3e::2:30
CNAME 资源记录
将一个名称别名为另一个名称(规范名称),该规范名称应具有 A 或 AAAA 记录。当 DNS 解析程序收到 CNAME 记录查询结果时,会用规范名称重新发出查询:
www-dev.linux.fun. 30 IN CNAME ab.linux.fun. server.linux.fun. 30 IN CNAME www.redhat.com.
注意事项:
- CNAME 记录可指向具有 CNAME 的名称,但最终必须解析为 A 或 AAAA 记录的名称。
- 通常避免 CNAME 记录指向其他 CNAME 记录,以免降低查找效率、增加脆弱性或形成循环。
- CNAME 记录链有合法用途,如与 Content Delivery Network(CDN)结合使用。
- NS 和 MX 记录不得指向带有 CNAME 记录的名称,需使用带有 A 和 / 或 AAAA 资源记录的名称。
PTR 资源记录
将 IPv4 或 IPv6 地址映射到主机名,用于反向 DNS 解析。PTR 记录以特殊格式对 IP 地址进行编码:
- 对于 IPv4 地址,将地址颠倒,从最具体部分开始,视为 in-addr.arpa 域的子域中的主机。
- 对于 IPv6 地址,在半字节边界(每个十六进制数字)上划分为子域,设置为 ip6.arpa 域的子域。
4.0.41.198.in-addr.arpa. 785 IN PTR a.root-servers.net. 0.3.0.0.2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.e.3.a.b.3.0.5.0.1.0.0.2.ip6.arpa. 86400 IN PTR a.root-servers.net.
NS 资源记录
将域名映射到对其 DNS 区域具有权威性的 DNS 名称服务器,该区域的每个公共权威名称服务器都必须有 NS 记录:
# 说明: 其中两个 NS 记录用于 10.1.8.0/16 网络和 fde2:6484:1e09:/48 网络的反向查找。 classroom.linux.fun 上的区域可能包含 NS 记录,将对 192.168.254.0/24 和 fde2:6484:1e09:1:/64 的反向查找委派给另一个名称服务器。 NS 记录映射的名称必须有 A 或 AAAA 记录。 linux.fun. 86400 IN NS classroom.linux.fun. 168.192.ip-addr.arpa. 86400 IN NS classroom.linux.fun. 9.0.e.1.4.8.4.6.2.e.d.f.ip6.arpa. 86400 IN NS classroom.linux.fun.
SOA 资源记录
也叫起始授权机构记录,提供有关 DNS 区域运行的信息,每个区域必须有一个 SOA 记录,指定了序列号以及其他权威性名称服务器用于确定何时从主要名称服务器传输区域资源记录的各种超时时长:
linux.fun. 86400 IN SOA classroom.linux.fun. root.classroom.linux.fun. 2015071700 3600 300 604800 60
MX 资源记录
将域名映射到接受该域电子邮件的邮件交换(mail exchange),在邮件服务器故障时,提供负载平衡和冗余的邮件服务器帮助路由电子邮件。该记录类型的数据包含用于确定在多个 MX 记录之间选择的优先级(首选最低)以及邮件交换的主机名:
linux.fun. 86400 IN MX 10 classroom.linux.fun. linux.fun. 86400 IN MX 10 mail.linux.fun. linux.fun. 86400 IN MX 100 mail.backup.linux.fun.
TXT 资源记录
将名称映射到编码为可打印 ASCII 字符的任意文本,通常用于提供各种电子邮件身份验证方案(如 DKIM、SPF)的数据、验证域所有权(如用于 Google 和 Facebook)以及其他目的:
wn.net. 27272 IN TXT "google-site-verification: svlx-S_z1esDfNSUNXqr3n9Y4F7t0r7HNVMKUGs" wn.net. 27272 IN TXT "v=spf1 a:mail.wn.net a:prod.wn.net a:git.wn.net a:ms.wn.net -all"
SRV 资源记录
帮助客户端找到域中支持特定服务的主机:
_ldap._tcp.linux.fun. 86400 IN SRV 0 100 389 server0.linux.fun.
- 表明存在一个可使用 TCP 传输协议(_tcp)与 LDAP 连接的 LDAP 服务器(_ldap),该主机属于域 linux.fun,服务器是 server.linux.fun,监听端口 389,优先级为 0,权重为 100(若客户端收到多个 SRV 记录,权重控制选择哪个服务器)
主机和区域的资源记录
主机(客户端或服务器):具有一个或多个 A 或 AAAA 记录、用于将 IP 地址反向映射到名称的 PTR 记录,可选一个或多个 CNAME 记录。
DNS zone(区域):具有唯一的 SOA 记录、每个权威名称服务器的 NS 记录,可选一个或多个 MX 记录、用于在域中查找服务的一个或多个 SRV 记录。
配置 DNS 服务器过程
# 安装软件包
[root@server ~ 18:28:07]# yum install -y bind bind-utils
# 修改配置文件
[root@server ~ 18:31:24]# vim /etc/named.conf
# 增加监听ip
listen-on port 53 { 127.0.0.1;10.1.8.10; };
# 放行客户端
allow-query { localhost;10.1.8.0/24; };
# 关闭安全认证
dnssec-enable yes;
dnssec-validation no;
# 最后添加正向解析和反向解析配置
zone "wan" IN {
type master;
file "wan.zone";
};
zone "8.1.10.in-addr.arpa" IN {
type master;
file "10.1.8.zone";
};
# 在 /var/named 目录中创建文件 wan.zone
[root@server ~ 18:35:05]# cd /var/named/
[root@server named 18:35:31]# cp -a named.localhost wan.zone
[root@server named 18:36:15]# vim wan.zone
$TTL 3600
@ IN SOA dns.wan. admin.wan. (
42 ; serial
3H ; secondary refresh
15M ; secondary retry
1W ; secondary timeout
15M ; minimum cache TTL for negative answers
)
IN NS dns.wan.
dns IN A 10.1.8.10
server IN A 10.1.8.10
student IN CNAME client.wan.
client IN A 10.1.8.11
www 30 IN A 10.1.8.200
@ IN MX 10 mail.wan.
mail IN A 10.1.8.253
说明:
- @ 字符代表区域的名称,避免重复键入,并且在某些情况下允许重复使用。
- 区域文件中的 SOA 记录与前面的示例中的 SOA 记录是等效的。
- 如果记录的名称为空,则其值与前面的记录相同。
因此,在前面的示例中:
- 第一个记录是 wan. 的 SOA 记录
- 接下来的记录是 wan. 的 NS 记录
- 然后有一个 dns 的 A 记录。
- 然后有一个 server 的 A 记录。
- 然后有一个 student 的 CNAME 记录。
- 然后有一个 client 的 A 记录。
- 然后有一个域的 MX 记录。
- 然后有一个 mail 的 A 记录。
# 在 /var/named 目录中创建文件 10.1.8.zone
[root@server named 18:38:21]# cp -a named.loopback 10.1.8.zone
[root@server named 18:40:29]# vim 10.1.8.zone
$TTL 3600
@ IN SOA dns.wan. admin.wan. (
42 ; serial
3H ; secondary refresh
15M ; secondary retry
1W ; secondary timeout
15M ; minimum cache TTL for negative answers
)
IN NS dns.wan.
10 IN PTR server.wan.
10 IN PTR dns.wan.
11 IN PTR client.wan.
11 IN PTR student.wan.
200 IN PTR www.wan.
253 IN PTR mail.wan.
# 验证 总配置文件
[root@server ~ 18:58:23]# named-checkconf
# 验证 zone 文件
[root@server ~ 18:58:42]# named-checkzone wan /var/named/wan.zone
zone wan/IN: loaded serial 42
OK
# 启动服务
[root@server ~ 18:59:50]# systemctl enable named --now
Created symlink from /etc/systemd/system/multi-user.target.wants/named.service to /usr/lib/systemd/system/named.service.
[root@server ~ 19:01:26]# systemctl status named
● named.service - Berkeley Internet Name Domain (DNS)
Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; vendor preset: disabled)
Active: active (running) since 四 2025-09-25 19:01:26 CST; 20s ago
Process: 13782 ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} $OPTIONS (code=exited, status=0/SUCCESS)
# 配置客户端dns为10.1.8.10
[root@client ~ 19:03:55]# nmcli connection modify ens33 ipv4.dns 10.1.8.10
[root@client ~ 19:04:05]# nmcli connection up ens33
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/4)
# 确保客户端/etc/hosts 只有localhost记录
[root@client ~ 19:07:05]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
# 使用 getent 尝试解析相关域名
[root@client ~ 19:10:10]# getent hosts student
10.1.8.11 client.wan student.wan
[root@client ~ 19:10:22]# getent hosts dns
10.1.8.10 dns.wan
[root@client ~ 19:10:49]# getent hosts www
10.1.8.200 www.wan
# 使用 dig 尝试解析
[root@client ~ 19:11:51]# yum install -y bind-utils
[root@client ~ 19:12:31]# dig @10.1.8.10 server.wan
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.16 <<>> @10.1.8.10 server.wan
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40454
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;server.wan. IN A
;; ANSWER SECTION:
server.wan. 3600 IN A 10.1.8.10
;; AUTHORITY SECTION:
wan. 3600 IN NS dns.wan.
;; ADDITIONAL SECTION:
dns.wan. 3600 IN A 10.1.8.10
;; Query time: 0 msec
;; SERVER: 10.1.8.10#53(10.1.8.10)
;; WHEN: 四 9月 25 19:12:36 CST 2025
;; MSG SIZE rcvd: 89
更多推荐
所有评论(0)