DNS 服务器

DNS 服务介绍

DNS的诞生

  • 当我们在浏览器中输入一个域名访问某个网站时,这个域名最终会被解析为一个IP地址,我们的浏览器实际是在和这个IP地址进行通信。
  • 负责将域名解析到IP地址的协议为DNS(Domain Name System,域名解析系统)。
  • 网络中每个节点都有自己唯一的IP地址,通过IP地址可以实现节点之间的相互访问,但是如果和所有的节点进行通信都使用IP地址的方式,人们很难记住这么多IP地址,为此提出了DNS,将难以记忆的IP地址映射为字符类型的地址。

域名系统组成

  • 域名:主机的字符标识方式。大部分情况下,我们访问网站时在浏览器内输入的URL就是该网站的域名。
  • 域名解析服务器(DNS Server):负责维护域名与IP地址对应关系的数据库,并对解析者的请求进行响应。
  • 分布式结构:域名系统是一个分布式的结构,每个服务器上的数据库只保存了部分域名与IP的对应关系。

DNS查询方式

DNS是一个分布式系统,绝大多数的DNS服务器端的数据库不会拥有所有的域名记录,当客户端向一个DNS服务器端查询域名但该DNS服务器端上却没有该域名的记录时,此时会有两种继续查询的方式:

  • 递归查询:由DNS服务器向其他DNS服务器进行查询,将最终查询结果返回给DNS客户端。
  • 迭代查询:DNS服务器告知DNS客户端其他DNS服务器地址,客户端自行向其他DNS服务器进行查询。

DNS 概述与层次结构

DNS(Domain Name System,域名系统)服务是一种用于将域名转换为IP地址的分布式数据库服务。它是互联网的核心服务之一,使得用户能够通过易于记忆的域名来访问网站和其他网络服务,而无需记住复杂的IP地址。

DNS 也是一个存储网络主机和资源目录的分层命名系统。目录中的信息将网络名称映射到不同资源记录。

  • 根域:DNS层次结构最顶层,使用独立的 . 表示。
  • 顶级域(一级域):DNS层次结构第二层,例如 .com.net.org 等域。
  • 二级域:DNS层次结构第三层,例如 hgq.cloudredhat.fun 等域。由各个组织使用。以此类推。

术语解释

Domain

domainresource records 的集合,该集合以通用名结尾,表示 DNS 命名空间的整个子树,如 hgq.cloud

**top-level domain(TLD- 顶级域)**由 Internet Assigned Numbers Authority(IANA-互联网号码分配机构)管理,并负责委派顶级域。

常见的TLD类型:

  • Generic TLDs(gTLD-通用顶级域名):最初是按主题组织的,包括 .com.edu.net 等。
  • Country code TLDs(ccTLD-国家代码顶级域名):根据ISO 3166-1标准在国家范围上组织的,并包括 .us.uk.cn.ru 之类的域。

其他顶级域参考顶级域名参考根域数据库

Subdomain

Subdomain 是另一个域的完整子树的域。在讨论两个域之间的关系时使用此术语。 例如,lab.hgq.cloudhgq.cloud 的子域,而 hgq.cloud.cloud 的子域。我们也可以将 hgq.cloud 称为第二级域,并将 lab.hgq.cloud 称为第三级域。

Zone

Zone 是特定名称服务器直接负责的域。它可能是整个域,也可能只是域的一部分。Zone可以将部分或全部子域都委派给另一个名称服务器或多个名称服务器。

例如,root名称服务器对root zone具有权威性,但它们将 .com 域的职责委派给其他名称服务器,这些名称服务器为 .com 区域提供权威性应答。这些服务器还可以继续将责任委派给其他名称服务器。


DNS 查询流程

主机的 DNS 查询主要有两种方式:递归查询和迭代查询。 DNS 查询时,DNS 请求报头部的 RD 字段决定了查询类型:

  • RD 为 1 => 递归查询,默认查询方式。
  • RD 为 0 => 迭代查询。

标准互联网 DNS 流程(递归 + 迭代结合)

以查询 www.example.com 为例:

步骤 发起方 接收方 查询类型 核心动作
1 客户端 本地 DNS 递归查询 客户端:帮我查 www.example.com 的 IP,我要最终结果
2 本地 DNS 根 DNS 迭代查询 本地 DNS:你知道 www.example.com 吗?
根:不知道,去问 .com 顶级服务器
3 本地 DNS .com 顶级 DNS 迭代查询 本地 DNS:你知道 www.example.com 吗?
顶级:不知道,去问 example.com 权威服务器
4 本地 DNS example.com 权威 DNS 迭代查询 本地 DNS:你知道 www.example.com 吗?
权威:返回最终 IP
5 本地 DNS 客户端 响应 把最终 IP 返回给客户端,同时缓存该记录

递归查询(Recursive Query)

「甩锅式查询」:请求方把任务完全交给对方,要求对方必须给出最终结果,自己只等答案,不跑腿。

  • 发起方:客户端(电脑 / 手机)
  • 接收方:本地 DNS 服务器(递归 DNS)
  • 核心逻辑:客户端只发 1 次请求,说 “帮我查 www.example.com 的 IP,我要最终结果”,剩下的所有步骤都由本地 DNS 完成,客户端全程躺平。

迭代查询(Iterative Query)

「跑腿式查询」:请求方依次向各个服务器询问,对方只给 “下一站地址”,不代办,请求方自己一步步跑完全程。

  • 发起方:本地 DNS 服务器
  • 接收方:根 DNS、顶级域 (TLD) DNS、权威 DNS 服务器
  • 核心逻辑:本地 DNS 自己当 “跑腿的”,依次问根→顶级→权威,每个服务器只告诉它 “下一个该找谁”,最终拿到 IP 后再返回给客户端。

DNS 资源记录

DNS 资源记录是 DNS 服务器中存储域名与对应信息的核心数据结构,每一条记录都对应一个域名的特定属性。

通用模板

列名 内容
owner-name 域名 / 拥有者名称
TTL 生存时间 Time To Live,本地 DNS 缓存这条记录多久,单位:秒
class 网络类别,IN = Internet,全网 99.9% 域名解析都是 IN
type 资源记录类型,如 A 记录:IPv4 正向解析
data 记录数据 / 内容,这条记录的值

记录示例:

#域名                   TTL     类别   记录类型   内容
owner-name   TTL class type data
server.hgq.cloud. 300 IN A 192.168.1.10
server.hgq.cloud. 86400 IN A 172.25.254.254
a.root-servers.net. 604800 IN AAAA 2001:503:ba3e::2:30
www-dev.hgq.cloud. 30 IN CNAME lab.hgq.cloud.
server.hgq.cloud. 30 IN CNAME www.redhat.com.

记录类型说明

A 资源记录

将主机名映射到IPv4地址。

AAAA 资源记录

将主机名映射到IPv6地址。

CNAME 资源记录

将一个名称别名为另一个名称(规范名称),该名称应具有A或AAAA记录。当DNS解析程序收到对查询的CNAME记录时,它将使用规范名称而不是原始名称重新发出查询。

  • CNAME记录的数据字段可以指向DNS中任何区域的名称,无论该区域是内部的还是外部的。
  • CNAME记录可能指向具有CNAME的名称,但CNAME记录链最终必须解析为A或AAAA记录的名称。
  • 通常,避免将CNAME记录指向其他CNAME记录。CNAME会使查找效率降低,更脆弱,并且可能会意外创建循环。
  • 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记录映射的名称必须有A或4A记录。

示例:

hgq.cloud. 86400 IN NS dns.hgq.cloud.
168.192.ip-addr.arpa. 86400 IN NS dns.hgq.cloud.
SOA 资源记录

起始授权机构记录,提供有关DNS区域如何运行的信息。每个区域必须有一个SOA记录。指定序列号及各种超时时间。

示例:

hgq.cloud. 86400 IN SOA dns.hgq.cloud. root.hgq.cloud. 2015071700 3600 300 604800 60
示例 含义
MNAME dns.hgq.cloud. 该名称服务器是这个区域的主要名称服务器,负责维护区域资源记录。
RNAME root.hgq.cloud. 该区域中负责人邮件地址, 用 . 代替,例如 root@hgq.cloud.
SERIAL 2015071700 该区域版本号,随着区域中记录更改而增加。
REFRESH 3600 从名称服务器向主名称服务器更新数据频率。单位秒。
RETRY 300 在重试失败的刷新前,应当等待的时间间隔。单位秒。
EXPIRE 604800 如果刷新失败,从服务器在停止其旧的区域副本响应查询之前等待的时间。单位秒。
MINIMUM 60 如果解析器查找某个名称不存在,缓存“记录不存在”信息的时间。单位秒。
MX 资源记录

将域名映射到接受该域的电子邮件的邮件交换。数据是优先级(数字越小优先级越高)和主机名。

示例:

hgq.cloud. 86400 IN MX 20 dns.hgq.cloud.       #20是优先级
hgq.cloud. 86400 IN MX 10 mail.hgq.cloud.
hgq.cloud. 86400 IN MX 100 mailbackup.hgq.cloud.
TXT 资源记录

将名称映射到编码为可打印ASCII字符的任意文本。通常用于电子邮件身份验证(SPF, DKIM, DMARC)或域所有权验证。

示例:

lwn.net. 27272 IN TXT "google-site-verification: sVlx-S_z1es5DfNSUNXrqr3n9Y4F7tOr7HNVMKUGs"
lwn.net. 27272 IN TXT "v=spf1 a:mail.lwn.net a:prod.lwn.net a:git.lwn.neta:ms.lwn.net -all"
SRV 资源记录

帮助客户端找到域中支持特定服务的主机。表明存在一个可以使用TCP传输协议与LDAP连接的LDAP服务器。

示例:

_ldap._tcp.hgq.cloud. 86400 IN SRV 0 100 389 server0.hgq.cloud.

主机和资源记录总结

一个主机具有以下 DNS 资源记录:

  • 一个或多个A或AAAA记录
  • 用于将其IP地址反向映射到名称的PTR记录
  • 一个或多个CNAME记录(可选)

DNS zone 还具有以下资源记录:

  • 唯一的 SOA 记录
  • 每个权威名称服务器的 NS 记录
  • 一个或多个MX记录(可选)
  • 用于在域中查找服务的一个或多个SRV记录(可选)

DNS常用客户端命令

Windows查询dns缓存

C:\Users\69466>ipconfig/displaydns | findstr huawei
   www.huawei.com
   记录名称. . . . . . . : www.huawei.com
   CNAME 记录  . . . . . : www.huawei.com.akadns.net
   ...
 
C:\Users\69466>ipconfig/flushdns
Windows IP 配置
已成功刷新 DNS 解析缓存。

Linux查询命令

whois 查询域名信息
[root@localhost ~]# yum install -y whois
[root@localhost ~]# whois qq.com
host 命令
# 查询 NS 记录
[root@localhost ~]# host -t NS huawei.com
huawei.com name server nsall.huawei.com.
huawei.com name server nsall4th.huawei.cn.
 
# 查IP(A记录)
[root@localhost ~]# host www.qq.com
www.qq.com is an alias for www.qq.com.eo.dnse2.com.
www.qq.com.eo.dnse2.com has address 43.159.109.55
 
# 查邮箱服务器(MX记录)
[root@localhost ~]# host -t MX qq.com
qq.com mail is handled by 10 mx3.qq.com.
dig 命令
# 标准查询
[root@localhost ~]# dig -t A www.qq.com
 
# 只看精简结果(最实用)
[root@localhost ~]# dig +short www.qq.com
ins-r23tsuuf.ias.tencent-cloud.net.
101.91.22.57
 
# 只看回答部分
[root@localhost ~]# dig +nocmd +noall +answer www.qq.com
nslookup 命令

支持交互和非交互式两种方式执行。

# 非交互模式
[root@localhost ~]# nslookup www.qq.com
 
# 指定DNS服务器解析
[root@localhost ~]# nslookup www.qq.com 114.114.114.114
 
# 交互模式
[root@localhost ~]# nslookup
> www.qq.com
> set q=A
> www.qq.com

配置权威名称服务器

架构说明

权威名称服务器存储 DNS 资源记录,并为其管理的区域提供权威答案。Linux中使用BIND软件实现。BIND允许将权威服务器配置为区域的主要服务器或辅助服务器。

  • 区域中只有一台主服务器,但可具有多台辅助服务器。
  • 辅助服务器通过请求区域传输,定期从主服务器下载最新版本。
  • 名称服务器可以是某些区域的主要服务器,同时也可以其他区域的辅助服务器。
  • 当前BIND服务器角色为 masterslave,以后会变更为 primarysecondary

安装 BIND

[root@dns-server ~]# yum install -y bind bind-utils
  • bind:服务器软件包。
  • bind-utils:工具软件包,包含 nslookup, dig, host

主要配置文件:

  • /etc/named.conf:主配置
  • /etc/named.rfc1912.zones:额外区域配置
  • /var/named/:解析库文件存放目录

配置 BIND

1. 定义地址匹配列表 (ACL)

/etc/named.conf 开头定义,把一组 IP 地址/网段定义成一个名字,方便权限控制。

# vim /etc/named.conf
acl trusted-nets { 192.168.10.0/24; 192.168.20.0/24; };
acl classroom { 10.1.8.0/24; };

内置的预定义ACL:

ACL 名称 含义(匹配范围) 说明
any 所有主机、所有 IP 所有人都能
none 不匹配任何主机 谁都不行
localhost 本机所有网卡 IP 只有这台机器自己
localnets 本机所有网卡所在的整个网段 本机 + 同局域网的机器
2. 配置 named 侦听的IP地址

options 块中指定监听接口。

# 示例1:直接指定IP
options {
      listen-on port 53 { 127.0.0.1; 10.1.8.10; };
      ......
};
 
# 示例2:结合acl指令配置
acl interfaces { 127.0.0.1; 10.1.8.10; };
acl interfacesv6 { ::1; 2001:db8:2020::5300; };
options {
      listen-on port 53 { interfaces; };
      listen-on-v6 port 53 { interfacesv6; };
};
3. 配置客户端的访问控制
  • allow-query:控制所有查询。公开权威服务器必须定义 allow-query { any; };
  • allow-recursion:控制递归查询。权威服务器不应允许递归查询,防止DNS放大攻击。
# 完全关闭递归
options {
      ......
      recursion no;
};
 
# 允许受信任的客户端执行递归
options {
      ......
      recursion yes;
      allow-recursion { trusted-nets; };
};
 
# allow-transfer:控制区域转移(Zone Transfer)
allow-transfer { 允许的IP };
4. 配置 zone
[root@dns-server ~]# vim /etc/named.conf
......
options {
        # 修改listen-on
      listen-on port 53 { 127.0.0.1; 10.1.8.10; };
      ......
       # 修改allow-query
      allow-query { any; };
};
......
# 最后添加如下内容
zone "hgq.cloud" IN {
  type master;
  file "hgq.cloud.zone";
};
zone "8.1.10.in-addr.arpa" IN {
  type master;
  file "10.1.8.zone";
};
5. 创建与编辑区域文件

创建文件并设置权限:

[root@dns-server ~]# touch /var/named/hgq.cloud.zone /var/named/10.1.8.zone
[root@dns-server ~]# chmod 640 /var/named/*.zone
[root@dns-server ~]# chown root:named /var/named/*.zone
# 如果系统开启了selinux功能
[root@dns-server ~]# chcon -t named_zone_t /var/named/*.zone

正向记录示例 (hgq.cloud.zone):

$TTL 3600
@       IN SOA dns.hgq.cloud. root.hgq.cloud. ( 
                                       0       ; serial
                                      1D      ; refresh
                                      1H      ; retry
                                      1W      ; expire
                                      3H )    ; minimum
      IN NS   dns.hgq.cloud.
dns     IN A    10.1.8.10
server IN A    10.1.8.10
student IN CNAME       client.hgq.cloud.
client IN A    10.1.8.11
www 30 IN A    10.1.8.200
@       IN MX   10 mail.hgq.cloud.
mail   IN A    10.1.8.253

反向记录示例 (10.1.8.zone):

$TTL 1D
@       IN SOA dns.hgq.cloud. root.hgq.cloud. ( 
                                       0       ; serial
                                      1D      ; refresh
                                      1H      ; retry
                                      1W      ; expire
                                      3H )    ; minimum
      IN NS   dns.hgq.cloud.
10     IN PTR dns.hgq.cloud.
10     IN PTR server.hgq.cloud.
11     IN PTR client.hgq.cloud.
11     IN PTR student.hgq.cloud.
200     IN PTR www.hgq.cloud.
253     IN PTR mail.hgq.cloud.
6. 验证与启动
# 验证语法
[root@dns-server ~]# named-checkconf
[root@dns-server ~]# named-checkzone hgq.cloud /var/named/hgq.cloud.zone
zone hgq.cloud/IN: loaded serial 0
OK
 
# 启动服务
[root@dns-server ~]# systemctl enable named --now
 
# 设置防火墙
[root@dns-server ~]# firewall-cmd --add-service=dns
[root@dns-server ~]# firewall-cmd --add-service=dns --permanent
7.客户端测试

方式一:

# 配置客户端dns
[root@dns-client ~]# nmcli connection modify ens33 ipv4.method manual
ipv4.addresses 10.1.8.11/24 ipv4.gateway 10.1.8.2 ipv4.dns 10.1.8.10 autoconnect yes
[root@dns-client ~]# nmcli connection up ens33
# ping 工具测试
[root@dns-client ~]# ping dns.hgq.cloud
PING dns.hgq.cloud (10.1.8.10) 56(84) bytes of data.
64 bytes from dns.hgq.cloud (10.1.8.10): icmp_seq=1 ttl=64 time=0.251 ms
[root@dns-client ~]# ping student.hgq.cloud
PING client.hgq.cloud (10.1.8.11) 56(84) bytes of data.
64 bytes from student.hgq.cloud (10.1.8.11): icmp_seq=1 ttl=64 time=0.032 ms
# 其他工具
[root@dns-client ~]# host student.hgq.cloud 
student.hgq.cloud is an alias for client.hgq.cloud.
client.hgq.cloud has address 10.1.8.11
[root@dns-client ~]# host 10.1.8.10
10.8.1.10.in-addr.arpa domain name pointer dns.hgq.cloud.
10.8.1.10.in-addr.arpa domain name pointer server.hgq.cloud.
[root@dns-client ~]# getent hosts student.hgq.cloud
10.1.8.11       client.hgq.cloud student.hgq.cloud

方式二:dig工具

# dig工具测试
[root@client ~]# yum install -y bind-utils
# 查询相关记录,@10.1.8.10指定向10.1.8.10服务器查询记录
# 查询NS记录
[root@client ~]# dig @10.1.8.10 hgq.cloud NS
# 查询MX记录
[root@client ~]# dig @10.1.8.10 hgq.cloud MX
# 查询A记录
[root@client ~]# dig @10.1.8.10 student.hgq.cloud
# 查询PTR记录
[root@client ~]# dig @10.1.8.10 -x 10.1.8.200

配置缓存名称服务器-Unbound

Unbound 用于缓存 DNS 查询结果,提高解析效率。

安装与配置

[root@cache ~]# yum install -y unbound

配置文件 /etc/unbound/unbound.conf

server:
    interface: 10.1.8.20
    interface: 2001:db8:1001::f0
    interface-automatic: no
 
    access-control: 127.0.0.0/8 allow
    access-control: 172.25.0.0/24 allow
    access-control: 2001:db8:1001::/32 allow
    access-control: 10.1.8.0/24 allow
    access-control: 10.1.7.0/24 refuse
 
    domain-insecure: hgq.cloud
 
forward-zone:
    name: "."
    forward-addr: 10.1.8.10

启动与测试

[root@cache ~]# unbound-checkconf
[root@cache ~]# systemctl enable unbound --now
[root@cache ~]# firewall-cmd --add-service=dns --permanent
 
# 客户端测试
[root@client ~]# dig @10.1.8.20 client.hgq.cloud

管理缓存

# 导出缓存到文件
[root@cache ~]# unbound-control dump_cache > dns_dump
 
# 清空缓存
[root@cache ~]# unbound-control flush student.hgq.cloud
 
# 清除zone中所有记录
[root@server ~]# unbound-control flush_zone hgq.cloud
 
# 导入缓存
[root@server ~]# unbound-control load_cache < dns_dump

配置缓存名称服务器-Dnsmasq

Dnsmasq 是一个集 DNS 缓存、DHCP、PXE 于一体的轻量级软件。

用途

  1. 应对ISP的DNS劫持:禁止跳转到广告页面。
  2. 智能DNS加快解析速度:国内外不同的网站使用不同的DNS。
  3. 屏蔽网页广告:将广告URL指定到 127.0.0.1
  4. 指定域名解析到特定IP:控制访问。
  5. 管理控制内网DNS:修改 /etc/hosts 控制内网解析。

配置示例 (/etc/dnsmasq.conf)

# 国内指定DNS
server=/cn/114.114.114.114
server=/taobao.com/114.114.114.114
 
# 国外指定DNS
server=/google.com/8.8.8.8
 
# 屏蔽广告
address=/ad.youku.com/127.0.0.1
 
# 自定义解析A记录
address=/long.com/192.168.115.10
 
# 指定内部域名解析服务器
server=/hgq.cloud/10.1.8.10
 
# 禁止劫持
bogus-nxdomain=64.94.110.11
 
# 指定上游DNS文件
resolv-file=/etc/resolv.dnsmasq.conf

启动

[root@cache ~]# dnsmasq -test
[root@cache ~]# systemctl enable dnsmasq --now

排故 DNS 问题

名称解析来源顺序

系统 /etc/nsswitch.conf 文件中的 hosts 行控制查找主机名的方式:

hosts: files dns myhostname

顺序:先 /etc/hosts 文件,再 DNS 查找,最后本地主机名。使用 getent hosts <name> 测试。

dig 工具排故

  • 默认查找 A 记录。
  • 指定其他服务器:dig @10.1.8.20 mx hgq.cloud
  • 强制TCP查询:dig +tcp A hgq.cloud
  • 跟踪查询路径:dig +trace www.baidu.com

网络连接问题

必须确保客户端与名称服务器在 UDP和TCP的53端口 通信正常。如果响应超过512字节(或EDNS的4096字节),解析器必须切换到TCP。

DNS响应代码

Code Meaning 描述
NOERROR 无错误 解析成功,但不保证记录与预期一致(可能来自缓存)。
SERVFAIL 服务器失败 服务器无法与权威服务器通信(网络问题、防火墙或权威服务器宕机)。
NXDOMAIN 域名不存在 权威服务器确认该记录不存在;可能是负缓存或孤立的CNAME记录。
REFUSED 拒绝查询 服务器策略限制(如拒绝递归查询或区域传输请求)。

Zone 数据问题

  1. DNS 轮询配置错误:添加新A记录时未删除旧A记录,导致部分客户端获取过时记录。

  2. 反向查询失败:缺少PTR记录。SSHD可能导致连接延迟;邮件服务器可能拒绝连接。

  3. 已删除记录仍能查询:可能存在通配符(*)记录。

  4. 名称中出现两次FQDN:区域文件中短主机名自动追加区域名,若FQDN未以 . 结尾会导致错误(如 server.hgq.cloud.hgq.cloud.)。

  5. 循环的CNAME记录:CNAME指向CNAME,可能导致解析失败或效率低下。

  6. 主从答案不一致

    • 检查从服务器SOA序列号是否最新。
    • 检查主服务器更新后是否增加了序列号。
    • 检查网络/防火墙是否阻止了区域传输。
    • 检查主服务器的 allow-transfer 指令。
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐