🌀 鱼油のB10g

✦ 不定期更新技术随想

✦ 分享奇妙发现

📌 近期动态:

探索AI和工具使用...

第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查询

  1. Windows环境操作
:: 清空DNS缓存
ipconfig /flushdns

:: 发起查询(显示详细过程)
nslookup -debug www.pinginglab.net
  1. Wireshark过滤设置
dns && ip.addr == <本地DNS服务器IP>
  1. 关键字段解析
  • Transaction ID:请求/响应对的唯一标识(16位)
  • Flags
  • QR:0=请求 / 1=响应
  • Opcode:0=标准查询
  • AA:权威答案标志
  • TC:截断标志(响应超长时用)
  • RD/RA:递归请求/可用标志
  • Questions:查询的问题(域名+记录类型)
  • Answers:回复的资源记录(包含TTL)

六、自建DNS服务:dnsmasq实战

场景需求:实验室内部服务器域名解析
解决方案:轻量级DNS服务dnsmasq

  1. 安装配置
# 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 # 自定义域名解析
  1. 客户端测试
# 指定使用自建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的工程价值

  1. 命名解耦:域名不变即可屏蔽后端IP变更
  2. 负载均衡:单个域名解析到多个IP(CDN基础)
  3. 故障隔离:通过DNS切换故障节点

思考题
当你在宿舍访问学校官网时,DNS解析经过了哪些服务器?用dig +trace命令验证一下吧!

posted on 2025-08-04 07:02  鱼油YOU  阅读(21)  评论(0)    收藏  举报