ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

DNS解析原理与排查实战:从域名到IP的完整链路

DNS解析原理与排查实战:从域名到IP的完整链路 你有没有想过我们在浏览器里敲下一个域名比如example.com回车之后发生了什么背后的“翻译官”DNS是怎么把这一串人类友好的字母变成机器能理解的IP地址的这个问题看起来基础但真正把它掰开揉碎、讲清楚每一步流程再结合实操排查很多人其实并没有吃透。这篇内容适合刚入门网络的小白也适合已经写过不少配置、但遇到DNS问题还会抓狂的运维和开发。我会从DNS的核心原理讲起拆解解析流程、记录类型、配置方法再给一套我在实际排查中反复使用的命令与思路把“DNS域名与IP的翻译器”这个标题讲透。1. 项目概述DNS到底在干什么1.1 域名与IP一对别扭的“双胞胎”先说一个基本事实IP地址是网络的“真实坐标”数据包要靠它才能找到目的地而域名是人类为了方便记忆而发明的“别名”。比如example.com比93.184.216.34好记多了对吧但问题在于网络设备只认IP不认字母。所以必须有一个系统在域名和IP之间做翻译。这就是DNSDomain Name System域名系统本质上就是一台分布在全球的“翻译器”。有过办公网维护经验的朋友大概率遇到过这样的情况用户报修说“网页打不开”你ping域名不通但ping IP通。这基本就能锁定是DNS解析出了问题。这说明DNS虽然只是一个“翻译”动作但它一旦出错整个网络访问就会直接瘫痪而且症状还特别容易伪装成“网络中断”“服务器挂了”等更常见的问题。1.2 没有DNS的世界会怎样我做实验的时候曾经故意把本机DNS指到一个不可达的地址然后打开浏览器那种体验很多人应该都经历过页面长时间转圈最后报错ERR_NAME_NOT_RESOLVED。这就是“没有DNS”的现代网络体验。如果全世界真的没有DNS你会遭遇什么首先你得背下一串数字才能上网。IPv4还好最多12位数字IPv6就夸张了像2400:cb00:2049:1::c629:d7a2这种地址正常人根本记不住。其次一个互联网服务如果要换服务器、做迁移、搞负载均衡就得通知所有用户换IP这完全不现实。DNS的存在让“改名不改址”成为可能你用同样的域名后端IP可以随时切换。可以说没有DNS今天互联网的可用性、灵活性和可扩展性全部归零。2. DNS解析的核心流程一次访问背后的完整链路2.1 递归查询与迭代查询谁在承担什么角色很多朋友一上来就背概念“递归查询是客户端发起的迭代查询是服务器之间发起的”。这么说没错但不够具体。我更喜欢用一个比喻你打电话问朋友A“某某餐厅在哪”A也不知道但他不嫌麻烦自己挨个打电话去查最后告诉你确切地址——这是递归查询服务方替你跑腿。另一种情况是A说“我不知道但你应该去问B”然后给你B的电话你自己去问B如果B还不知道B又让你去问C——这是迭代查询服务方只负责指路不替你跑腿。在实际解析过程中你配置的本地DNS服务器无论是运营商给的还是如1.1.1.1、8.8.8.8之类的公共DNS会为你做递归查询。而它去问根域名服务器、顶级域名服务器、权威服务器的过程则是迭代查询。注意公共DNS之间也有差异像1.1.1.1背后有Anycast网络响应速度和调度策略都好一些一些本地运营商DNS虽然延迟低但有时缓存更新慢解析记录可能会有滞后。2.2 从浏览器输入域名到获取IP的完整步骤我用一个最简单的例子拆解当你在地址栏输入www.example.com并回车。浏览器先查自己的DNS缓存。Chrome里可以通过chrome://net-internals/#dns查看大多数浏览器会缓存最近解析过的记录TTL还没过的就直接用了根本不会发起网络请求。缓存未命中系统来接手。Windows下会查本机的DNS Client服务缓存Linux下要看systemd-resolved是否在管理缓存。这里有个常见的坑很多人明明改了网卡DNS却发现解析结果没变就是系统缓存捣的鬼。Windows执行ipconfig /flushdnsLinux执行systemd-resolve --flush-caches老版本或resolvectl flush-caches新版本就能解决。缓存依然未命中系统才会把解析请求发给你在网卡上配置的DNS服务器。这台服务器就是你“默认的递归解析器”它负责把域名“翻译”成IP。本地DNS服务器如果也没有缓存就开始一路往上问。先问根服务器根服务器说“我不知道完整答案但.com的权威服务器在某某地址”接着问.com顶级域服务器它说“这个域名的权威服务器是ns1.example.com”最后问example.com的权威服务器这次拿到了真正的A记录或AAAA记录。拿到IP后本地DNS会把它缓存起来同时返回给你的电脑你的电脑也缓存一份浏览器开始发起TCP连接。这整套流程走下来正常情况下只需要几十毫秒。为什么这么快因为每一步都有缓存浏览器缓存、系统缓存、本地DNS缓存。TTL值也就是记录的有效期就是控制这个缓存时间的。TTL太短每次解析都要回源压力大TTL太长服务器切换IP后客户端迟迟不更新就会大面积“访问异常”。后面我会单独讲TTL怎么设。2.3 一个域名为什么能解析出多个IP你在命令行执行nslookup www.example.com经常能看到返回多个IP。这就是DNS的“一题多解”。最常见的原因是负载均衡和内容分发。比如大型网站会通过权威DNS根据你的地理位置、运营商线路返回不同的IP。同一个域名联通用户拿到的可能是联通机房的IP电信用户拿到的是电信机房的IP这就是“智能DNS调度”。CDN服务商更是把这种玩法用到极致同一个域名在全世界不同的地方解析会得到完全不同的结果但都能正常访问。理解了这一层再看“域名解析到IP之后为什么有时候这个IP不能用”这个问题就有思路了。排查的时候不能只看这个IP通不通还要看你所处的网络环境是否被调度到了正确的节点。3. 核心细节DNS记录类型与TTL设置3.1 常用DNS记录类型一览域名不仅需要A记录来指向IPv4地址还需要各种各样的记录来支撑不同业务。我在管理域名时最常用的记录有这么几种A记录把域名指向IPv4地址比如 A 1.2.3.4。AAAA记录把域名指向IPv6地址。CNAME记录别名记录把域名指向另一个域名。比如www CNAME example.com。注意CNAME的记录值只能是域名不能是IP。很多人会问能不能用一个域名同时配置CNAME和MX记录严格来说CNAME是“独占”的一个域名的根或主机名一旦设置了CNAME就不能再设置其他记录类型包括MX这是RFC规范的要求实操中不少平台会校验这一点。MX记录邮件交换记录指定收件服务器。它的值同样必须是域名且可以被多条组合使用每条前面有优先级数字数值越小优先级越高。TXT记录任意文本信息常用在发信验证SPF、DKIM和域名所有权验证场景。比如微信公众平台、小程序后台会让你配置一条TXT记录来证明域名是你的。NS记录指定该域名的权威DNS服务器。PTR记录反向解析记录把IP反查为域名。邮件服务器发信时会做PTR反查来验证对端域名是否合法这也是为什么企业邮箱的服务器IP往往需要配置PTR记录。这里我提醒一句PTR记录一般是IP段的所有者比如云服务商或IDC机房才可以在你的IP管理面板里配置。普通域名商平台改不了PTR别在那里找了半天。3.2 TTL设置一个容易被忽略但很关键的参数TTL全称Time To Live单位是秒它告诉缓存服务器“这条记录可以缓存多久”。取值太小比如30秒每一次查询都会穿透到权威DNS虽然更新很及时但权威服务器压力大取值太大比如86400秒一天一旦你变更IP全球解析要等一天甚至更久才能生效。我个人的经验是这样常规业务用300秒到600秒稳定服务可以用3600秒。做迁移或切换IP之前提前一天把TTL降到60秒等切换完成、确认全球解析正常后再把TTL调回正常值。这个操作能明显缩短业务变更后的“阵痛期”。3.3 在Linux上快速搭建一个内网DNSdnsmasq实操前面讲了不少原理现在来个手上活用dnsmasq在局域网里搭建一个轻量DNS服务。这适合在家用路由器、树莓派、云主机上快速部署解决内网设备互相用主机名访问的问题也可以直接把上游DNS设置为公共DNS。环境假设一台Ubuntu 22.04的服务器内网IP为192.168.1.10。安装dnsmasqsudo apt update sudo apt install -y dnsmasq编辑配置文件/etc/dnsmasq.conf先把原来的内容备份一下再追加# 指定本地域名后缀 domainlab.local # 为本机配置固定解析记录 address/db.lab.local/192.168.1.11 # 上游DNS可以写多个 server1.1.1.1 server8.8.8.8 # 监听内网网卡忽略不会应答的接口 interfaceeth0 bind-interfaces重启服务看端口是否监听sudo systemctl restart dnsmasq sudo ss -lntup | grep 53把局域网其他设备的DNS改成192.168.1.10然后执行nslookup db.lab.local。如果返回192.168.1.11说明内网DNS已经生效。这个方案比手动改每台机器的hosts文件要省事太多。假如你手里有三五台内部服务器我今天把应用迁移到新地址只需要改dnsmasq的一条配置全公司机器的解析结果立即更新完全没有“挨个改hosts”的痛苦。4. 动手配置从Linux到Windows再到多网卡环境4.1 Linux下修改DNS的完整步骤Linux改DNS其实有不少坑尤其是用了systemd-resolved的现代发行版。很多教程只让你改/etc/resolv.conf写着写着就被系统重置了。最推荐的方式是用systemd的网络配置来固定DNS。假设网卡名是eth0在/etc/netplan/下的YAML配置文件里加DNS信息network: version: 2 ethernets: eth0: dhcp4: true nameservers: addresses: [1.1.1.1, 1.2.4.8] search: [example.com]执行sudo netplan apply之后检查resolvectl status确认DNS是否生效。注意检查是否有其他服务在覆盖配置比如NetworkManager、docker0网桥等。我之前遇到过docker启动后resolv.conf被生成的虚拟网卡DNS覆盖导致容器内域名解析异常的案例。排查顺序建议是resolvectl status看全局DNS - 看各网卡实际配置 - 看/etc/resolv.conf是否被符号链接。4.2 Windows与Win11下修改与刷新DNSWindows的好处是有图形界面步骤简单网络设置 - 更改适配器选项 - 右键网卡 - 属性 - IPv4 - 属性 - 填入DNS。但在Windows 11上我建议用“设置”里的“DNS服务器分配”来配置因为新版系统的界面路径变化比较快脚本化配置反而更稳定。管理员身份打开PowerShell执行Set-DnsClientServerAddress -InterfaceAlias WLAN -ServerAddresses (1.1.1.1,8.8.8.8)改完以后务必验证而且验证要分两步先ipconfig /flushdns清掉缓存再nslookup example.com看结果。如果在Windows上改了DNS但解析结果还是旧的大概率是浏览器里的DNS缓存或者系统“智能连接”功能在捣乱。打开chrome://net-internals/#dns清一下浏览器缓存也行。4.3 多网卡环境与AD域控制器场景的特别提醒热词里有人问“ad域内3台dc域控制器dc的网卡dns应该如何配置”这个问题我很有共鸣。在多域控制器环境下DC的DNS指向是非常讲究的。一个常见错误给域控制器网卡填了公共DNS或外部DNS。这会导致AD域名的SRV记录无法正常解析域的登录、组策略应用都会出问题。标准做法是每台DC的网卡DNS首先指向其他DC最好是同域的其他DC其次可以指向自己但绝对不能把外部DNS作为主DNS。比如有三台DCIP分别为10.0.0.11、10.0.0.12、10.0.0.13那第一台的DNS顺序可以配置为10.0.0.12和10.0.0.13注意不要随便加公共DNS进去。多网卡还有一种常见翻车情况服务器有多块网卡每块网卡的DNS各不相同而且网卡之间的“接口跃点数”没有配置好。结果就是解析时会随机或优先走错网卡导致部分域名走错出口内网域名解析失败。我建议服务器上尽量只保留一块业务网卡的DNS配置其他网卡把Gateway和DNS留空避免路由表打架。5. 排查DNS问题一套真实可复用的命令序列5.1 nslookup、dig和host三个诊断工具怎么用Windows上常用的是nslookupLinux上最推荐的是dig。dig的信息量大且展示清晰我每次排查的第一步永远是dig 1.1.1.1 example.com shortshort只返回核心的解析结果适合快速确认。如果需要看详细过程去掉short输出里能看到权威服务器的响应、TTL、查询耗时等。对某个域名的解析状态有疑问时可以显式指定一个公共DNS去查比如dig 8.8.8.8 example.com这样可以绕过你本机的本地DNS判断问题是在本地配置还是权威DNS。nslookup还支持查特定类型nslookup -typemx example.com nslookup -typens example.com注意有些系统nslookup需要安装dnsutils或bind-utils在CentOS上通过yum install bind-utils安装在Ubuntu上通过apt install dnsutils安装。5.2 网页打不开、域名解析失败的排查步骤我这里给一个优先顺序明确的排查序列先用ping 114.114.114.114看基础网络通不通IP都ping不通就说明不是DNS问题往链路层排查。再nslookup example.com看域名能否解析如果能解析出IP说明DNS服务正常工作问题可能出在应用或防火墙。如果解析失败用nslookup example.com 1.1.1.1换公共DNS验证如果公共DNS能解析说明你原来配置的DNS服务器有问题或网络到不了它。检查本机缓存Windows执行ipconfig /displaydns看看缓存里是否有错误的解析记录。这里有个很有用的判断如果解析出的IP和实际服务端不符很可能是缓存了旧纪录。我记得有个经典故障网站新换了一次CDN节点但老用户持续访问失败清缓存无效。最后发现是本地路由器长时间缓存了旧的DNS记录重启路由器之后一切正常。这类问题在家庭组网和办公网中占比不低排查时不要只盯终端设备路由器、运营商DNS都要考虑进去。5.3 端口连通性测试telnet和nc的正确用法做网络排查时DNS解析正常只是第一步要判定服务是否可用还需要测端口。热词里也专门有人问“telnet ip 端口 命令怎么看通不通”。测试端口要看三种状态连接成功命令行会进入一个空白终端或出现欢迎信息说明端口开放。连接被拒绝返回Connection refused说明IP没问题但端口没有服务在监听。超时卡住不动直到报错说明中间有防火墙丢弃或IP不可达。实际工作中我更推荐用nc因为可以配合-v输出更明确的结果nc -vz 1.2.3.4 80 nc -vz 1.2.3.4 443如果只是检测端口通不通不用等它交互-z参数很合适。注意有些云服务器安全组和防火墙是两层本地端口监听正常但外部连不上要先ss -lntp确认进程在监听再用iptables -L -n或firewalld看规则最后再检查安全组。5.4 内网IP冲突的排查思路热词里有“ip冲突排查”这也是和DNS并列的高发网络故障之一。IP冲突的症状很迷惑网络时而通时而不通ping同一个地址偶尔响应很快偶尔超时。排查思路是这样的在被冲突IP的主机上用arp -a看看这个IP对应的MAC地址是否频繁变化。如果有条件直连交换机抓包或看交换机ARP表查找同一个IP对应两个MAC的情况。华为、H3C交换机上通常可以执行display arp | include 10.0.0.88来快查。使用arping工具单独发包探测arping -D -I eth0 10.0.0.88如果有回复说明冲突。解决冲突最直接的办法是查DHCP的租约记录结合交换机的端口定位到具体设备。内网环境建议给核心服务器分配固定IP并在交换机上做IP-MAC绑定能大幅降低这类问题。6. 安全要点与经验从DNS劫持到渗透视角的防御6.1 内网DNS劫持与防护我们常说的DNS劫持本质上是你发出的解析请求被篡改返回了错误IP。在公网里如果你的运营商或所在地域的路由设备被恶意配置就可能打开某个网站时被迫跳到广告页或钓鱼页。在内网里如果攻击者通过ARP欺骗拦截了终端的DNS请求也可以伪造解析结果。防御思路不复杂内网终端尽量使用加密DNS比如DoHDNS over HTTPS或DoTDNS over TLS。Chrome、Edge等浏览器都内置了“安全DNS”选项开启后解析请求走HTTPS通道能明显减少被明文篡改的风险。自建DNS服务时一定要限制来源IP不要把53端口裸奔到公网否则很容易被利用成放大攻击的反射点。定期检查你家或办公网的路由器DNS设置看是否被改成了陌生的地址。如果是光猫拨号还要检查光猫的DNS配置。6.2 公共DNS怎么选1.1.1.1、8.8.8.8、1.2.4.8、114.114.114.114热词里出现了“dns服务器1.2.4.8”和“网易dns”等我就顺便做个横向比较。公共DNS常见的有1.1.1.1Cloudflare的服务全球Anycast解析速度快隐私性好。8.8.8.8Google的服务在国内延迟偏大但胜在稳定适合海外的服务器。223.5.5.5、1.2.4.8国内可用前者是阿里DNS后者是CNNIC的国内访问速度快。114.114.114.114国内老牌公共DNS广告拦截效果相对明显一些但也有人反馈某些运营商会做DNS劫持所以具体要看真实环境表现。在选DNS时建议至少配置两个一个是主一个是备。主备不要选同一个服务商的万一那家服务商出故障你还留了后手。还有一些朋友问“西安联通运营商dns服务器地址”我一般不建议直接问运营商要DNS用公共DNS会省心很多。如果你必须用本地运营商DNS最可靠的方法是拨号成功后从拨号日志或路由器上行口信息里抓取而不是在网上搜一个很可能已过期的地址。6.3 自己域名如何配置证书与二级域名做网站的朋友经常会遇到“网页授权回调域名”“域名证书”这类配置。以Nginx为例二级域名的DNS配置只要在权威DNS控制台加一条A记录比如app A 1.2.3.4然后Nginx配置两个server块分别监听80和443即可。证书申请方面最省心的是用acme.sh脚本配合DNS API完成自动签发不用手动创建CSR和私钥。公钥私钥的知识也可以了解一下但日常工作中没必要手动去生成所有集成商都提供API自动对接。这里有一个我踩过的坑配置二级域名证书时总是忘记在DNS控制台添加对应的TXT验证记录结果申请流程一直卡在“等待验证”。解决办法是申请证书前先把验证记录提前添加好等DNS生效后再执行签发脚本。有些DNS服务商生效很快但也要学会用dig txt _acme-challenge.example.com short验证是否同步。6.4 物联网设备该用IP直连还是DNS解析这次热词里也提到了“物联网设备一般使用ip直连还是dns解析”这个得分场景。简单说设备长期固定在内网且数量不大IP直连完全够用但如果设备数量多或经常更换网络环境强烈建议用DNS解析。我管理过一批摄像头和传感器设备它们分布在多个子网如果全部用固定IP后期扩容和调整非常痛苦。后来统一规划成设备域名在dnsmasq里按camera-01.lab.local这样的规则做静态解析DNS服务器同时兼任DHCP下发一旦设备重新上线域名会始终指向最新IP。效果是维护工作量直接下降了一个量级。核心经验动态环境优先DNS固定环境优先IP。7. 保留余量日志、缓存与反向解析的管理经验7.1 善用DNS日志进行排错我自己管理DNS服务的时候日志是排错利器。dnsmasq默认日志输出得比较密可以用log-queries开启查询日志看到每个域名被谁在什么时间请求。有一次办公网出现访问异常我打开日志发现大量终端在反复请求一个不存在的子域名顺藤摸瓜定位到是一台打印机NTP时间不同触发了恶意扫码程序半天就找到源头。没有日志的话这种问题只能靠抓包慢慢碰。但要注意日志会产生大量IO写入生产环境开启log-queries要考虑磁盘压力建议按天切割日志文件或者放在tmpfs目录里。7.2 缓存策略的“速度与激情”DNS缓存是把双刃剑。合理使用缓存可以降低外部DNS请求的数量也能明显加快内网用户访问速度但缓存过期策略不对也可能导致服务切换后仍访问旧IP。在设计缓存层时要区分“外部公共域名”和“内部权威域名”。外部域名可以放心让dnsmasq或unbound缓存内部域名建议把缓存TTL调小或者直接关闭缓存因为内部域名变更频率更高实时性最重要。unbound有一个local-zone配置可以把内部域名设置成直接走权威解析不走缓存效果很好。7.3 反向解析PTR的实战意义前面提到PTR记录主要用于邮件反垃圾验证。这里补一个真实场景企业邮箱给外部发送邮件时如果发件服务器IP没有配置反向解析或PTR记录指向的域名与HELO域名不一致对方服务器很可能直接拒信。很多新手第一次配企业邮箱时在域名商添加了各种MX记录却在“裸奔IP”里翻车检查了半天才发现是PTR问题。处理方式找IDC或云服务商提交工单申请PTR记录同时把邮件服务器设置的EHLO/HELO域名与公网PTR记录的域名保持一致。这算是最容易忽略的一项“隐形配置”。8. 个人经验运维中总结的DNS配置要诀说了这么多最后分享几个我踩过坑之后沉淀下来的习惯。很多人配置DNS只做一步“把地址填上”但真正稳定的DNS规划需要全局思考。第一内网静态解析要集中管理。能走DNS的不要散落到各设备hosts里。hosts文件在个别场景下确实快但一旦数量多了改动非常痛苦。我用dnsmasq统一管理之后任何域名变更都只需改一个地方还能顺手加注释。第二至少规划两条上游DNS并做好主备切换测试。不要只在配置里写一个地址。曾经遇到运营商DNS在高峰期解析很慢整个办公室的网页访问像蜗牛切换到一个公共DNS后问题秒解。后续我在所有路由器上都是双DNS配置。第三变更前查TTL变更后查缓存。这句相当于排错口诀。无论你在DNS控制台改了A记录、CNAME还是MX先看TTL剩多少估算一下全国生效时间改完以后用不同的公共DNS分别解析确认结果一致再宣布变更完成。第四安全配置要前置。内网的DNS服务器不建议直接做递归解析后又把端口暴露到公网。如果必须暴露至少开启访问控制列表限制只允许特定IP段的客户端来查询并启用结合防火墙的限速策略。DNS这个“翻译器”看似不起眼但它连接了用户体验、系统架构、网络安全几个层面。真把它吃透了很多网络疑难杂症都会变得有迹可循。希望这篇实操笔记能帮你少走点弯路遇到解析类故障时能有条不紊地一步步查下去。
返回列表