名词概念
DNS查询:指客户端向DNS服务器发出请求,目的是将域名(如 www.baidu.com) 解析为192.168.2.1。
- 发起方:客户端(APP、浏览器)
- 协议:通常使用UDP (端口53),少数使用TCP
- 查询类型
- A记录:IPV4地址
- AAAA记录:IPV6地址
- MX记录:邮件服务器地址
- 查询过程:递归查询(客户端->本地DNS->根DNS->顶级DNS->权威DNS)
- 安全风险隐患:
安全风险 - DNS劫持
- DNS欺骗(缓存投毒)
- 隐蔽数据泄露(通过DNS隧道)
dig www.example.com A # 发起一个DNS查询
DNS流量:网络中所有DNS查询和响应产生的数据包集合,包括请求、响应、重定向等通信内容。
| 组成 |
- 查询数据包 - 响应数据包 - 错误报文 |
| 流量特征 |
- 小包高频率(通常小于512字节) - 突发性(用户访问网站时集中) |
| 重点监控 |
- 请求频率 - 异常域名(恶意软件C2服务器) - 响应时间异常 |
| 安全分析 |
- 检测DDoS攻击(DNS放大攻击) - 识别数据外泄漏(DNS隧道流量) |
两种域名解析服务器
DNS 使用多个类型的域名服务器。
权威名称服务器用于存储具体域的官方记录。
- 如果你购买了域名
example.com并在云服务商(如阿里云)配置了 DNS 解析,阿里云的 DNS 服务器就是example.com的权威服务器。 - 阿里云 DNS、Cloudflare 权威服务器
递归 DNS 服务器或解析器会接收来自用户的初始请求,并在必要时向权威 DNS 服务器查询相关信息。
权威名称服务器:存储特定域名的“官方”解析记录(如 example.com 的 A 记录、MX 记录等)。
递归DNS服务器:接收用户请求,向其他 DNS 服务器(包括权威服务器)逐级查询,最终返回结果给用户。
为什么需要两种服务器?
-
权威服务器:确保域名解析的权威性和一致性(由域名所有者控制)。
-
递归服务器:提高查询效率(缓存结果)、减少权威服务器压力,并处理复杂的查询链。
分工协作,DNS 系统实现了高效、可靠的全球域名解析。
# 根域名
根域名是 DNS(域名系统)层次结构中的最顶层,用单个点 . 表示(通常省略不写)。它是所有域名的起点,负责管理互联网上所有顶级域(TLD,如 .com、.org、.cn 等)的权威服务器地址。
根域名服务器是全球 DNS 系统的“总目录”,由 ICANN 统一管理。
-
显式表示:在 DNS 配置中,根域名用单个点
.表示(如example.com.,末尾的点代表根域)。
为什么有点?
这是一个完整域名(FQDN, Fully Qualified Domain Name)的规范写法,但用户访问时通常省略(如浏览器中输入example.com会自动补全)。
-
数量:全球共有 13 组 根服务器(编号
A到M),逻辑上分布在不同地理位置,实际通过任播(Anycast)技术扩展了数百台物理服务器。
-
根域名是
.,普通域名(如example.com)是它的子域。 -
根域名不存储具体网站记录,只管理 TLD 服务器的地址。
为什么只有13组?
-
由于历史和技术限制(早期 DNS 协议基于 UDP,响应包大小限制为 512 字节,13 组地址刚好填满)。实际通过任播技术扩展了物理服务器数量。
# 递归服务器逐级查询:
步骤 1:递归服务器先查询根域名服务器(.),根服务器返回 .com 的权威服务器地址。
步骤 2:递归服务器向 .com 权威服务器查询,获取 example.com 的权威服务器地址。
步骤 3:递归服务器向 example.com 的权威服务器查询 www 子域名的 A 记录(IP 地址)。
核心原则:DNS 系统通过分层和缓存机制平衡效率与准确性,只有缓存未命中时才会从根域名开始查询。
补充说明:对于涉及提到内容进行补充说明
DNS域名解析:
- 存在两种不同机制的域名解析,主机映射(/etc/hosts)和 本地DNS配置(/etc/resolve.conf 或 DNS缓存服务)
- 主机映射(/etc/hosts):静态的域名到IP的映射,优先级高于DNS查询;生效范围仅影响当前主机,修改需要手动编辑文件。
- 本地DNS配置:
| 组件 | 配置文件/服务 | 作用 |
|---|---|---|
| DNS服务器列表 | /etc/resolv.conf | 指定系统使用的DNS服务器(如8.8.8.8) |
| DNS缓存服务 | systemd-resolved/dnsmasq | 缓存DNS查询结果,加速解析 |
| 动态配置管理 | NetworkManager | 管理网络接口的DNS设置 |
-
动态性:可通过DHCP自动获取DNS服务器。
-
层级化:支持多DNS服务器和搜索域(
search)。 -
缓存机制:减少重复查询的延迟。
两者区别对比:
| 特性 | 主机映射 (/etc/hosts) | 本地DNS配置 |
|---|---|---|
| 优先级 | 更高(先于DNS查询) | 低于hosts文件 |
| 管理方式 | 手动编辑 | 可手动配置或通过DHCP自动获取 |
| 生效范围 | 仅当前主机 | 可影响整个网络(如企业内网DNS) |
| 性能 | 即时生效,无延迟 | 受网络和缓存状态影响 |
| 适用场景 | 小规模静态映射 | 大规模动态域名解析 |
例子:
1、主机映射(覆盖DNS):
# /etc/hosts
127.0.0.1 localhost
192.168.1.100 internal-api.company.com # 强制指向内网IP
2、本地DNS配置:
通常由你网络服务器生成(通俗说就是当你介入一个网络时,网络服务器自动给你生成的)
# /etc/resolv.conf (通常由网络服务生成)
nameserver 8.8.8.8
nameserver 192.168.1.1
search company.com
3、高阶技巧:
# 调试优先级,查看实际生效的解析来源
getent hosts baidu.com
下面是修改/etc/hosts文件内容,调试效果(主机映射优先级比本地DNS高,所以显示的实际生效效果为修改之后的)

下图为dig 命令默认会绕过本地 hosts 文件,直接向配置的 DNS 服务器(指当前系统实际使用的DNS解析服务器)发起查询。

| 工具 | 是否读取 /etc/hosts | 设计目的 |
|---|---|---|
dig | ❌ 默认不读 | 专业DNS调试(直连服务器) |
getent/ping | ✅ 优先读 | 系统级解析(遵守nsswitch规则) |
nslookup | ✅ 会读 | 基础DNS查询工具 |
systemd-resolved
救命宝典:
systemctl status systemd-resolved
systemctl stop systemd-resolved
systemctl disable systemd-resolved.service
nano /etc/resolve.conf # 重新写入之前的本地DNS配置
如果你目前使用的是(公司内网、校园网)不要随便尝试去下载:apt install systemd-resolved;会导致覆盖你本地之前网络分配的本地DNS配置/etc/resolve.conf文件。还有一种情况就是电脑重启之后/etc/resolve.conf配置文件会覆盖。重写写入之前网络指定配置的DNS。
# 由于你手动修改/etc/resolve.conf,导致无法文件不再是一个软链接,以至于无法实现动态管理DNS,需要手动去修改配置文件。下面可以帮助你实现动态修改本地DNS解析地址。
# 方法一 恢复 systemd-resolved
# 1. 重新安装并启用
sudo apt install systemd-resolved
sudo systemctl enable --now systemd-resolved
# 2. 重新创建符号链接(关键步骤)
sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
# 3. 验证
systemctl status systemd-resolved
cat /etc/resolv.conf # 应显示 "nameserver 127.0.0.53"
# 方法二 如果不想用 systemd-resolved,可通过 NetworkManager 管理 DNS
# 1. 确保 NetworkManager 已安装
sudo apt install network-manager
# 2. 配置 NetworkManager 自动更新 resolv.conf
sudo rm /etc/resolv.conf # 删除原有文件
sudo ln -sf /run/NetworkManager/resolv.conf /etc/resolv.conf
# 3. 重启 NetworkManager
sudo systemctl restart NetworkManager
注:安装systemd-resolved后,它会接管系统的DNS解析并自动启用本地缓存,同时覆盖/etc/resolv.conf文件。
- 自动启用DNS缓存:默认会启动一个本地 DNS 缓存服务(监听
127.0.0.53:53),加速重复查询。 - 覆盖/etc/resolv.conf:
/etc/resolv.conf会被替换为一个符号链接,指向systemd-resolved的存根解析器。
$ ls -l /etc/resolv.conf
lrwxrwxrwx 1 root root 39 Apr 10 2023 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf
文件内容通常是:nameserver 127.0.0.53 # 所有请求先发往本地的systemd-resolved
为什么会覆盖/etc/resolv.conf?
-
统一管理DNS
systemd-resolved需要拦截所有DNS请求,才能实现:-
本地缓存
-
多网络接口的DNS优先级(如VPN和Wi-Fi共存时)
-
支持LLMNR/mDNS等扩展协议
-
-
兼容性考虑
即使应用直接读取/etc/resolv.conf,请求仍会被systemd-resolved代理处理。
区别:
| 行为 | systemd-resolved 启用时 | 禁用后 |
|---|---|---|
| DNS缓存 | ✅ 有(resolvectl statistics 可查看) | ❌ 无 |
/etc/resolv.conf | 指向 127.0.0.53(代理) | 直接显示真实DNS服务器 |
| 多网络优先级 | ✅ 自动处理(如VPN优先) | ❌ 需手动管理 |
| 修改DNS的方法 | 通过 resolvectl 或 nmcli | 直接编辑 /etc/resolv.conf |
NetworkManager
动态配置管理中的NetworkManager 管理网络接口的DNS设置,指的是 Linux 系统中通过 NetworkManager 服务动态控制网络接口(如以太网、Wi-Fi)的 DNS 服务器配置。它的核心作用是 自动适应网络环境变化(如切换Wi-Fi、插拔网线、连接VPN),并动态调整DNS设置。
# 核心功能
-
当设备通过 DHCP 连接到网络时,
NetworkManager会自动从路由器或企业网络获取DNS服务器地址(如192.168.1.1或8.8.8.8)。 -
多网络环境适配:
不同网络(如家庭Wi-Fi、公司VPN)可使用不同的DNS服务器,切换网络时自动生效。 -
优先级管理:
支持为不同网络接口配置DNS优先级(如以太网优先于Wi-Fi)。
# 配置文件和路径
-
主配置文件:
/etc/NetworkManager/NetworkManager.conf
控制全局行为,例如是否用dnsmasq做本地缓存。 -
连接专用配置:
/etc/NetworkManager/system-connections/<连接名>.nmconnection
存储每个网络连接的独立设置(包括DNS)。

# 操作命令
(1) 查看当前DNS配置
nmcli dev show | grep DNS
输出示例:
IP4.DNS[1]: 192.168.1.1
IP4.DNS[2]: 8.8.8.8
(2) 手动设置DNS(临时生效)
sudo nmcli con mod eth0 ipv4.dns "9.9.9.9 1.1.1.1"
sudo nmcli con up eth0 # 应用更改
(3) 强制使用DHCP分配的DNS
sudo nmcli con mod eth0 ipv4.ignore-auto-dns no
sudo nmcli con reload
NetworkManager与 systemd-resolved 的关系
-
协作模式:
默认情况下,NetworkManager将DNS设置推送给systemd-resolved,由后者实际执行解析。 -
直接模式:
可通过配置让NetworkManager直接管理/etc/resolv.conf,绕过systemd-resolved:
动态性体现
| 场景 | NetworkManager 行为 |
|---|---|
| 连接新Wi-Fi | 自动获取该网络的DNS服务器,并更新系统配置 |
| 启用VPN | 临时添加VPN提供的DNS(如企业内网DNS),断开VPN后自动恢复原配置 |
| 插入网线 | 以太网接口的DNS优先级高于Wi-Fi,自动切换 |
| DHCP租约更新 | 自动检测路由器DNS变更并应用 |
禁用动态管理
如果需要完全手动控制DNS:
# 停止NetworkManager干预
sudo systemctl stop NetworkManager
# 手动编辑 /etc/resolv.conf
echo "nameserver 1.1.1.1" | sudo tee /etc/resolv.conf
思考问题:
1、对于本地DNS而言,该如何去搭建一个DNS服务器,让本地的DNS流量去,我们本地搭建的服务器上去解析,同时让所有的流量去走搭建DNS服务器。
2、根据DNS递归查询来说,当根域名和顶级域名解析不到的时候,最终会到达权威DNS,那我们该如何可以去搭建?
3、对于提到的安全风险隐患,造成该风险的原因以及我们该如何去防御?从防御和攻击者的角度去学习。
- DNS劫持
- DNS欺骗
- DNS隧道--(隐蔽通信)
以上问题会会在之后的文章去输出。
3167

被折叠的 条评论
为什么被折叠?



