从安全角度分析-应用层协议-DNS详解(一)

名词概念

DNS查询:指客户端向DNS服务器发出请求,目的是将域名(如 www.baidu.com) 解析为192.168.2.1。

  • 发起方:客户端(APP、浏览器)
  • 协议:通常使用UDP (端口53),少数使用TCP
  • 查询类型
    1. A记录:IPV4地址
    2. AAAA记录:IPV6地址
    3. 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缓存服务)
  1. 主机映射(/etc/hosts):静态的域名到IP的映射,优先级高于DNS查询;生效范围仅影响当前主机,修改需要手动编辑文件。
  2. 本地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?

  1. 统一管理DNS
    systemd-resolved 需要拦截所有DNS请求,才能实现:

    • 本地缓存

    • 多网络接口的DNS优先级(如VPN和Wi-Fi共存时)

    • 支持LLMNR/mDNS等扩展协议

  2. 兼容性考虑
    即使应用直接读取 /etc/resolv.conf,请求仍会被 systemd-resolved 代理处理。

区别:

行为systemd-resolved 启用时禁用后
DNS缓存✅ 有(resolvectl statistics 可查看)❌ 无
/etc/resolv.conf指向 127.0.0.53(代理)直接显示真实DNS服务器
多网络优先级✅ 自动处理(如VPN优先)❌ 需手动管理
修改DNS的方法通过 resolvectlnmcli直接编辑 /etc/resolv.conf

NetworkManager

动态配置管理中的NetworkManager 管理网络接口的DNS设置,指的是 Linux 系统中通过 NetworkManager 服务动态控制网络接口(如以太网、Wi-Fi)的 DNS 服务器配置。它的核心作用是 自动适应网络环境变化(如切换Wi-Fi、插拔网线、连接VPN),并动态调整DNS设置。

# 核心功能

  • 当设备通过 DHCP 连接到网络时,NetworkManager 会自动从路由器或企业网络获取DNS服务器地址(如 192.168.1.18.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隧道--(隐蔽通信)

以上问题会会在之后的文章去输出。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值