尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

DNS域名解析全流程详解:从浏览器输入到IP获取的完整链路与故障排查

DNS域名解析全流程详解:从浏览器输入到IP获取的完整链路与故障排查 1. 项目概述为什么我们需要彻底搞懂DNS如果你在浏览器里输入“www.baidu.com”并按下回车几毫秒后网页就加载出来了。这个看似简单的动作背后其实经历了一场跨越全球互联网的精密“寻址”接力赛。这场接力赛的核心协议就是DNS。我遇到过太多因为DNS配置不当导致的“灵异”故障内网应用突然访问不了、某个网站加载奇慢无比、甚至安全证书报错。很多运维和开发朋友排查了半天网络、服务器最后发现根子出在DNS上。所以花点时间把DNS域名解析的完整过程掰开揉碎了看绝对是一笔稳赚不赔的投资。它不仅是网络工程师的基础课也是后端开发、运维乃至安全工程师排查复杂问题的必备技能。今天我就用多张流程图和场景还原带你从一次普通的网页访问出发直抵DNS解析的每一个隐秘角落让你不仅知道它“是什么”更明白它“为什么”要这么设计。2. DNS解析的核心流程全景拆解一次完整的DNS解析远不止“本地查缓存”那么简单。它是一个分层递归与迭代查询相结合的精妙系统。为了让你有个全局观我们先看下面这张核心流程图它描绘了从你在浏览器输入域名到获得IP地址的完整旅程flowchart TD A[用户输入域名brwww.example.com] -- B{本地DNS缓存查询} B -- 命中 -- C[返回缓存IPbr解析结束] B -- 未命中 -- D[/本地Hosts文件查询/] D -- 命中 -- C D -- 未命中 -- E[向本地DNS解析器br发起递归查询请求] E -- F{解析器缓存查询} F -- 命中 -- G[解析器返回IP] F -- 未命中 -- H[递归查询开始br解析器向根DNS服务器查询] subgraph I [迭代查询过程] H -- I1[根服务器返回br.com域TLD服务器地址] I1 -- I2[解析器向TLD服务器查询] I2 -- I3[TLD服务器返回brexample.com域权威服务器地址] I3 -- I4[解析器向权威服务器查询] end I4 -- J[权威服务器返回brwww.example.com的IP地址] J -- K[解析器缓存该记录] K -- L[解析器将IP返回给用户] L -- M[用户获得IP建立连接]上图展示了一个递归查询用户向本地DNS解析器内部包含迭代查询解析器向根、TLD、权威服务器的混合模式这是互联网上最常见的解析方式。接下来我们深入每一个环节。2.1 第一站客户端的本地查询当你的应用程序比如浏览器需要解析一个域名时它并不会直接冲向互联网。操作系统会先进行几层快速的本地检查目的是用最快的速度得到答案。1. 浏览器缓存检查现代浏览器为了极致性能会将自己解析过的域名缓存起来。缓存时间遵循DNS记录中的TTL值。你可以在Chrome的chrome://net-internals/#dns里看到这些缓存。这是一个内存级的查询速度在纳秒级。2. 操作系统缓存与Hosts文件如果浏览器缓存没有请求就交给操作系统。操作系统同样维护着一个DNS缓存在Windows中可以通过命令ipconfig /displaydns查看在Linux/macOS中则常用systemd-resolve --statistics或sudo killall -HUP mDNSResponder来清除缓存。在查询系统缓存的同时系统会同步读取hosts文件。这个文件的路径通常是Windows:C:\Windows\System32\drivers\etc\hostsLinux/macOS:/etc/hostshosts文件的优先级通常高于DNS查询这意味着你在这里写死的映射关系会直接覆盖从网络上查询到的结果。这是本地测试、屏蔽某些网站或者开发时绑定本地服务的常用手段。注意修改hosts文件后通常需要重启浏览器或刷新DNS缓存ipconfig /flushdns或sudo systemd-resolve --flush-caches才能立即生效因为应用程序可能缓存了之前的解析结果。3. 向本地DNS解析器发起请求如果本地缓存和hosts文件都没有找到记录操作系统就会按照网络配置向预设的本地DNS解析器发起一个递归查询请求。这个解析器通常由你的ISP互联网服务提供商如电信、联通自动分配也可以手动配置成公共DNS如223.5.5.5阿里云或119.29.29.29腾讯云。至此客户端的工作就暂时告一段落它把“找到www.example.com的IP”这个任务全权委托给了本地DNS解析器并等待其最终答复。2.2 第二站本地DNS解析器的递归与迭代之旅本地DNS解析器收到客户端的递归查询请求后它立下“军令状”不拿到最终IP地址绝不回头。它的查询过程是递归中包含迭代。1. 解析器缓存查询解析器自身也有一个庞大的缓存数据库。如果最近有其他用户查询过同一个域名并且缓存未过期TTL未到期它就会直接返回缓存结果查询就此结束。这是提升整体解析效率、减少上游查询压力的关键。2. 迭代查询根域名服务器如果缓存没有真正的“环球寻址”就开始了。解析器首先会查询根域名服务器。全球只有13组根服务器编号A到M但它们通过任播技术在全球有上千个镜像节点。解析器内置了这些根服务器的IP地址列表叫做“根提示”。 解析器向根服务器询问“.com”域该去找谁管理根服务器不会直接告诉你“www.example.com”的IP它只负责管理顶级域。它会回复一个TLD服务器的地址列表。3. 迭代查询顶级域服务器拿到.com域的TLD服务器地址后解析器接着向其中一台TLD服务器发起查询“example.com”这个域名的权威服务器是谁TLD服务器存储了所有以.com结尾的域名的权威服务器信息。它回复给解析器负责“example.com”的权威DNS服务器的地址。4. 迭代查询权威域名服务器最后解析器向“example.com”的权威服务器发起查询“请问www.example.com的IP地址是多少”这台权威服务器掌握着该域名下的所有记录它检查自己的区域文件找到对应的A记录或CNAME记录将最终的IP地址返回给本地DNS解析器。5. 缓存并返回结果本地DNS解析器拿到IP后首先会根据自己的缓存策略尊重记录中的TTL将这条结果缓存起来以备后续查询。然后它履行承诺将这个IP地址返回给最初发起请求的客户端操作系统。实操心得理解“递归”和“迭代”的区别至关重要。对你的电脑来说它只发起了一次“递归查询”坐等最终答案。而对本地DNS解析器来说它为了完成这个递归承诺对外发起了一系列“迭代查询”一步步追问直到找到权威答案。你可以用dig trace www.example.com命令完整地模拟并看到这个迭代过程从根到TLD再到权威每一步的返回都清晰可见。2.3 第三站记录类型与响应的深层解析DNS协议的精妙之处不仅在于分层查询还在于它丰富的记录类型用以应对不同的网络服务需求。当权威服务器返回答案时答案可能不止一种形式。1. 核心记录类型详解A记录最基础的记录将域名直接指向一个IPv4地址。例如www.example.com - 93.184.216.34。AAAA记录等同于A记录但指向的是IPv6地址。CNAME记录别名记录。它不直接提供IP而是告诉你这个域名是另一个域名的别名解析器需要去解析另一个域名。例如cdn.example.com - example.gslb.cdn.com。重要提示CNAME记录不能与其他记录类型如MX, TXT共存于同一主机名。MX记录邮件交换记录指定负责接收该域名邮件的服务器地址。它有优先级priority参数值越小优先级越高。TXT记录文本记录常用于域名所有权验证如谷歌站长工具、SPF反垃圾邮件策略等。NS记录指定该域名的权威DNS服务器是哪些。通常你会在TLD那里设置你域名的NS记录指向你的域名注册商或自建的DNS服务器。SOA记录起始授权机构记录包含域名的管理信息如主DNS服务器、管理员邮箱、序列号用于辅同步、刷新间隔等。2. 响应报文结构与TTL一个DNS响应报文包含多个部分回答区包含直接查询的资源记录RR。授权区包含指向下一级权威服务器的NS记录在迭代查询中非常关键。附加区包含一些额外的“友情提示”记录例如在返回NS记录的同时可能会把对应NS服务器的A记录也一并附上减少解析器额外的查询次数。TTL是生存时间以秒为单位。它告诉各级缓存这条记录可以保存多久。设置TTL需要权衡较短的TTL如300秒便于快速更改记录但会增加权威服务器负载较长的TTL如86400秒能极大提升缓存命中率但记录变更后全球生效慢。3. 高级场景与内部机制剖析掌握了基本流程我们再看几个复杂但常见的场景这些往往是故障排查的难点。3.1 解析方式递归与迭代的混合模型前面提到客户端到本地DNS是递归本地DNS到外部是迭代。但还有一种纯递归查询即本地DNS服务器也充当“甩手掌柜”将查询请求转发给另一台转发器如运营商更大的DNS中心由转发器去完成迭代查询自己只等待最终结果。这种模式常见于企业内网将内网DNS服务器的请求转发到公网DNS。配置示例Linux BIND DNS服务器在named.conf或named.conf.options中可以这样配置转发器options { forwarders { 223.5.5.5; 119.29.29.29; }; forward only; // 或 forward first; };forward only;表示只转发自己不进行迭代查询forward first;表示先尝试转发如果转发器无响应则自己进行迭代查询。3.2 负载均衡与高可用CNAME与A记录的智慧大型网站绝不会只有一个IP地址。DNS是实现第一层负载均衡和容灾的关键。多A记录轮询在权威服务器上为同一个主机名如www.example.com配置多个A记录指向不同的服务器IP。DNS解析器在返回结果时通常会以轮询方式提供这些IP列表从而将流量分散到不同服务器。基于CNAME的智能解析更高级的做法是使用CNAME将域名指向一个智能DNS服务商的域名如example.com.gslb.xxx.com。这个智能DNS服务商可以根据查询者的来源IPEDNS Client Subnet、服务器健康状态、负载情况动态返回最优的IP地址。这就是CDN和全球负载均衡的基础原理。3.3 容器与云原生环境下的DNS挑战在现代的Kubernetes或Docker Swarm集群中DNS变得尤为重要和复杂。每个Pod或服务都有一个内部域名如my-svc.my-namespace.svc.cluster.local。集群内会运行一个CoreDNS或kube-dns作为集群的权威DNS服务器。解析流程Pod内的应用解析内部服务名时请求被Pod的/etc/resolv.conf指向的集群DNS服务CoreDNS捕获。CoreDNS根据Kubernetes的Service和Endpoint资源返回对应的ClusterIP或Pod IP。外部域名解析对于集群外域名如www.example.comCoreDNS可以配置转发规则将查询请求转发到宿主机的上游DNS服务器进而完成公网解析。排错要点在容器环境中DNS问题常表现为服务间网络不通。排查时首先在Pod内使用nslookup或dig命令测试是否能解析目标服务名然后检查CoreDNS Pod是否运行正常最后检查CoreDNS的配置Corefile是否正确。4. 实战DNS问题诊断工具箱与排查实录理论懂了上手排查才是关键。下面是我在多年运维中总结的一套DNS问题诊断命令和思路。4.1 常用诊断命令详解nslookup最基础的交互式查询工具。适用于快速检查。# 查询A记录 nslookup www.example.com # 指定使用特定DNS服务器查询 nslookup www.example.com 223.5.5.5 # 查询MX记录 nslookup -typemx example.comdig更强大、输出更详细的DNS查询“瑞士军刀”。它是排查DNS问题的首选。# 最常用查询显示精简答案 dig www.example.com short # 显示完整的、详细的响应过程包括回答区、授权区、附加区 dig www.example.com # 跟踪完整的迭代解析过程模拟本地DNS解析器的查询步骤 dig www.example.com trace # 查询特定记录类型 dig example.com MX # 指定DNS服务器查询 dig 8.8.8.8 www.example.comhost一个简单的、用于快速将主机名转换为IP地址的工具。host www.example.com host 93.184.216.34 # 反向PTR查询操作系统缓存管理Windows:查看缓存ipconfig /displaydns清空缓存ipconfig /flushdnsLinux (systemd-resolved):查看统计systemd-resolve --statistics清空缓存sudo systemd-resolve --flush-cachesLinux (非systemd) / macOS:清空缓存命令因发行版和DNS服务而异常见的有sudo /etc/init.d/nscd restart或sudo killall -HUP mDNSResponder(macOS)。4.2 典型问题排查场景实录场景一某个网站突然无法访问其他网站正常。本地排查首先ping一下目标域名。如果ping不通但能ping通它的IP如果你知道的话那很可能是DNS问题。更换DNS测试在命令行用dig 8.8.8.8 目标域名或nslookup 目标域名 8.8.8.8指定一个公共DNS查询。如果返回了正确的IP说明是你本地网络配置的DNS服务器通常是ISP的出了问题可能是缓存了错误记录或无法访问。临时解决方案是修改电脑或路由器的DNS设置为公共DNS。检查解析结果用dig 目标域名查看返回的IP是否正常。有时返回的是错误的IP被劫持有时返回SERVFAIL权威服务器故障有时返回REFUSED查询被拒绝。场景二内网服务域名解析失败。确认DNS服务器检查客户端/etc/resolv.conf或Windows网卡配置DNS服务器地址是否正确指向了内网DNS。测试连通性从客户端ping或telnet内网DNS服务器的IP地址和53端口确保网络可达。检查区域配置登录内网DNS服务器检查对应域名的区域文件是否正确定义了该主机的A记录或CNAME记录。检查转发配置如果内网DNS需要转发外部查询检查其转发器配置和网络连通性。场景三DNS解析速度慢。使用dig测量时间dig 目标域名输出的最后一行会显示Query time: 25 msec这就是本次查询耗时。分析dig trace通过dig trace查看是卡在哪一步。如果卡在查询根服务器可能是本地DNS服务器到根服务器的网络问题如果卡在权威服务器可能是目标域名的DNS服务器性能不佳。检查本地DNS服务器如果所有外部查询都慢问题可能出在本地DNS解析器本身。检查其负载、网络带宽或考虑更换为更优质的公共DNS。避坑技巧修改DNS服务器后一定要记得刷新本地DNS缓存否则操作系统可能还在使用旧的、缓存的错误记录。在Linux下有时还需要注意/etc/nsswitch.conf文件中hosts:行的配置顺序它决定了系统先查hosts文件还是先查DNS。5. 安全、优化与未来演进5.1 DNS安全威胁与防护DNS设计之初缺乏安全考虑因此面临多种威胁DNS劫持攻击者篡改DNS响应将域名指向恶意IP。防护手段是使用DNSSEC它通过数字签名验证DNS数据的真实性和完整性。DNS缓存投毒攻击者向DNS解析器注入伪造的缓存数据。DNSSEC同样可以防护。DNS放大攻击利用DNS查询响应报文大于查询报文的特性伪造源IP向开放DNS服务器发起大量查询形成DDoS攻击。配置DNS服务器不响应来自任意地址的递归查询、限制响应速率是常见缓解方法。隐私泄露传统的DNS查询是明文的你的ISP或网络监听者可以知道你访问了哪些网站。DoH和DoT应运而生。DoTDNS over TLS在853端口上使用TLS加密DNS通信。DoHDNS over HTTPS将DNS查询封装在HTTPS协议中通过443端口传输更难被识别和拦截。5.2 性能优化实践客户端优化合理设置本地缓存确保操作系统DNS缓存服务正常运行。选择优质的本地DNS使用延迟低、可靠性高的公共DNS如国内用户可选用阿里云223.5.5.5/223.6.6.6腾讯云119.29.29.29。可以用namebench等工具测试并选择最快的DNS。服务器端优化合理设置TTL对于不常变的记录设置较长的TTL减少查询压力对于需要快速切换的记录如CDN、故障转移设置较短的TTL。启用响应速率限制防止DNS服务器被用于放大攻击。部署任播对重要的DNS服务如根、TLD、公共DNS部署任播让用户访问到地理上最近的节点。5.3 IPv6与未来随着IPv6的普及DNS需要同时处理A记录和AAAA记录。在双栈网络环境中客户端会同时发起A和AAAA记录的查询。权威服务器需要正确配置这两种记录。一些公共DNS如阿里云和腾讯云DNS都已支持IPv6地址的查询和解析。我个人在实际运维中的体会是DNS就像互联网的“隐形地图”。平时感觉不到它的存在可一旦它出问题整个网络世界就仿佛失去了坐标。花时间深入理解DNS不仅能让你在故障排查时思路清晰更能让你在设计系统架构时考虑到域名解析这一环的可用性、性能与安全比如通过智能解析实现灰度发布、通过多路DNS提供商实现容灾。下次再遇到网站打不开或者服务连不上的情况不妨先从dig trace开始你的侦探之旅吧。
返回列表