第3章 第14.4天
DNS协议:互联网的导航系统
大家好,今天我们来拆解互联网的"电话簿"——DNS协议。每次在浏览器输入网址时,背后都是它在默默工作。我会用校园网访问教务系统、搭建实验室本地域名服务这些场景,带你理解域名解析的全过程。
一、DNS核心原理:域名与IP的翻译官
协议本质:分布式数据库系统,完成 域名←→IP地址 的双向转换
运行机制:基于UDP 53端口(少量场景用TCP)的查询/响应模型
# 查看Linux系统的DNS解析器配置
cat /etc/resolv.conf
# 输出示例:
# nameserver 202.119.112.1# 学校DNS服务器
# nameserver 114.114.114.114 # 备用公共DNS
# 注释:系统按顺序使用DNS服务器
二、域名结构:互联网的命名体系
层次结构:从右向左层级递减的树状命名空间
示例解析:lab.pinginglab.net.
- 根域:末尾隐藏的
.(实际为.root) - 顶级域:
.net(商业机构) - 二级域:
pinginglab(注册的机构名) - 三级域:
lab(部门或服务名)
graph TD
Root[根域 .] --> TLD_net[.net]
TLD_net --> SLD[pinginglab]
SLD --> Host[lab]
实际访问时末尾点常省略,系统自动补全
三、解析流程:递归与迭代的协作
递归查询(用户→本地DNS):
"帮我查lab.pinginglab.net的IP,查到告诉我结果"
迭代查询(本地DNS→根域/顶级域):
"请问.net的权威服务器在哪?" → "请问pinginglab.net的权威服务器在哪?"
# 模拟本地DNS的递归解析流程
def recursive_resolve(domain):
# 先查本地缓存
if result in local_cache:
return result
# 迭代查询开始
current_server = root_server# 从根服务器开始
while True:
# 向当前服务器查询
response = ask_server(current_server, domain)
if response.has_final_answer:# 得到最终答案
cache_result(response)# 缓存结果
return response.answer
elif response.referral:# 得到下级服务器指引
current_server = response.referral_server
else:# 查询失败
raise Exception("DNS resolution failed")
四、资源记录:DNS的数据库字段
| 类型 | 功能 | 实际案例 |
|---|---|---|
| A | 域名→IPv4 | lab.pinginglab.net → 192.168.1.10 |
| AAAA | 域名→IPv6 | ipv6.google.com → 2001:4860:4860::8888 |
| NS | 指定域名的权威服务器 | pinginglab.net → ns1.alidns.com |
| MX | 邮件服务器地址 | gmail.com → alt4.gmail-smtp-in.l.google.com |
| CNAME | 域名别名 | www.pinginglab.net → pinginglab.net |
| PTR | IP→域名(反向解析) | 10.1.168.192.in-addr.arpa → server1.lab |
使用
dig命令指定记录类型查询:dig MX gmail.com +short # 输出: # 5 gmail-smtp-in.l.google.com. # 10 alt1.gmail-smtp-in.l.google.com.
五、实战抓包:Wireshark解析DNS
实验目标:捕获nslookup发起的DNS查询
- Windows环境操作:
:: 清空DNS缓存
ipconfig /flushdns
:: 发起查询(显示详细过程)
nslookup -debug www.pinginglab.net
- Wireshark过滤设置:
dns && ip.addr == <本地DNS服务器IP>
- 关键字段解析:
- Transaction ID:请求/响应对的唯一标识(16位)
- Flags:
QR:0=请求 / 1=响应Opcode:0=标准查询AA:权威答案标志TC:截断标志(响应超长时用)RD/RA:递归请求/可用标志- Questions:查询的问题(域名+记录类型)
- Answers:回复的资源记录(包含TTL)
六、自建DNS服务:dnsmasq实战
场景需求:实验室内部服务器域名解析
解决方案:轻量级DNS服务dnsmasq
- 安装配置:
# Kali安装
sudo apt install dnsmasq
# 主配置文件
sudo vim /etc/dnsmasq.conf
# 关键配置项:
# listen-address=192.168.1.100# 监听本机IP
# server=202.119.112.1# 转发查询到学校DNS
# address=/labserver/192.168.1.50 # 自定义域名解析
- 客户端测试:
# 指定使用自建DNS查询
dig @192.168.1.100 labserver
七、DNS安全威胁与防御
攻击类型:
- DNS劫持:篡改解析结果(如教务系统指向钓鱼网站)
- DNS污染:伪造响应包(防火墙主动返回错误IP)
- DDoS攻击:海量查询击垮DNS服务器
防御方案:
- DNSSEC:数字签名验证响应真实性
- DoH/DoT:加密DNS查询(避免监听)
# Firefox启用DoH
about:config → network.trr.mode → 2 (只使用DoH)
总结:DNS的工程价值
- 命名解耦:域名不变即可屏蔽后端IP变更
- 负载均衡:单个域名解析到多个IP(CDN基础)
- 故障隔离:通过DNS切换故障节点
思考题:
当你在宿舍访问学校官网时,DNS解析经过了哪些服务器?用dig +trace命令验证一下吧!
感谢浏览和学习,作者:鱼油YOU,转载请注明原文链接:https://www.cnblogs.com/OmegaYOU3/p/19020801,或者可以➕主播WX:OmegaAnimeman_desu;QQ:3819054512
浙公网安备 33010602011771号