首页 / 资讯中心 / 文章详情

一文讲透IP地址、hosts与DNS解析:从请求链路到排障实战

一文讲透IP地址、hosts与DNS解析:从请求链路到排障实战 ★ FEATURED ARTICLE
在日常网络排查和基础运维里IP地址、公网私网、hosts文件、DNS解析这些概念属于那种好像都懂一细问就说不清的典型。不少刚接触服务器的朋友会问为什么本机ipconfig看到的IP和别人访问我网站时看到的IP不一样hosts文件改了为什么不生效IPv6来了是不是DNS就多余了这篇文章不打算讲多高深的理论就按一条真实的数据请求链路把这些概念挨个掰开揉碎讲清楚它们之间的区别、协作关系以及实际工作中最容易踩的坑。1. 一个请求的网络旅程先分清局域与广域、公网与私网先从一个最常见的疑惑开始你的电脑、手机通过WiFi连上路由器后在网络设置页里看到的IP地址通常长这样192.168.1.105 或 10.0.0.8。但如果你去搜索引擎查我的IP是多少网页返回的却是另一个IP比如 116.25.21.xx。为什么同一台设备有两个IP哪个才是真正的IP答案很简单两个都是真IP只不过作用范围不同。前者是私网IP只在内网里有效后者是公网IP是你在互联网上的唯一身份标识。理解这一点要先分清局域网和广域网的区别。局域网LAN是家庭、办公室、学校这类小范围内设备组成的网络设备间通过交换机或路由器直接通信。广域网WAN则是跨越城市、国家的大范围网络互联网本质上就是一个超大型广域网。家用路由器恰好横跨这两者它对内是局域网的核心对外是广域网的接入点。路由器把内网和外网隔开的机制专业叫法就是NAT网络地址转换。你可以把公网IP理解成写字楼的门牌号私网IP理解成楼内员工的工位号。访客要寄文件给你收件地址只能写写字楼门牌号公网IP不可能直接写3楼301号工位私网IP。大楼前台路由器收到文件后会根据登记表把文件转交给具体工位。这套登记表就是NAT表。所以私网IP是为了内网沟通方便出的号码公网IP才是外界找到你的唯一依据。这里有个核心原因必须讲透IPv4的地址总数只有约42.9亿个早已不够全球设备分了。如果每台设备都直接分配公网IP地址早就枯竭了。于是标准组织定义了几个专门的私网地址段允许任何人在自己的局域网内随便使用不需要向任何机构申请10.0.0.0 到 10.255.255.255A类16,777,216个地址172.16.0.0 到 172.31.255.255B类1,048,576个地址192.168.0.0 到 192.168.255.255C类65,536个地址家用路由器默认分配的就是 192.168.x.x 段。这些地址只在你的局域网里有意义出了局域网路由器做NAT时会把它们全都转换成同一个公网IP。这也是为什么同一家庭网络里的多台设备从外网看都像一个IP——它们共用了一个门牌号出口。进一步补充公网IP也不全是给你用的。其中还有一段特殊地址比如 127.0.0.0/8 是回环地址localhost本机自己访问自己169.254.0.0/16 是链路本地地址设备没拿到DHCP分配的IP时自动生成的临时地址224.0.0.0/4 是组播地址用于多播通信。这些地址都叫保留地址不能出现在公网路由表里。搞懂了公网与私网的分工再回头看局域网和广域网的区别就更清晰了局域网看私网IP广域网看公网IP路由器负责在两边之间做NAT转换。这个模型是后面理解端口映射、远程访问、IPv6过渡方案的基础。很多远程桌面连不上、摄像头外网看不了的问题90%都能归结到NAT表没有正确放行这一点上。2. IPv4与IPv6的对比从地址长度、表示法到配置方式聊完IPv4的私网公网区别紧接着绕不开的就是IPv6。因为IPv6的出现正是为了解决IPv4公网地址不够用这个问题。很多朋友对IPv6的第一印象就是一串很长的十六进制数字但IPv6远不止长它在设计逻辑上和IPv4有本质区别。先看最直观的地址长度IPv4是32位二进制分4段每段8位写成点分十进制比如 192.168.1.1地址总量约42.9亿个。IPv6是128位二进制被分成8组每组16位写成冒号分隔的十六进制比如 240e:390:5f2e:1000:1234:abcd:5678:90ef。128位意味着什么地址总量是2的128次方大约3.4×10^38个地球上每一粒沙子都可以分到好几亿个地址。所以IPv6的核心理念是全世界的设备直接拥有公网IP不再需要NAT。IPv6的地址写法有个压缩规则实际工作中经常看到也经常搞混每一组十六进制数最前面的0可以省略比如 2001:0db8:0000:0000:0000:00ab:0000:0000 可以写成 2001:db8:0:0:0:ab:0:0。连续的0组可以用两个冒号代替但只能用一次比如上面的地址可以压成 2001:db8::ab:0:0。如果地址后面带/数字比如 /64表示前缀长度相当于IPv4里的子网掩码。在地址类型上IPv6比IPv4分得更细。IPv4主要分单播、组播、广播三类IPv6取消了广播新增了任播Anycast——同一组地址对应多台设备路由选择最近的一台。常见的IPv6单播地址有三类全局单播地址GUA / 2000::/3相当于IPv4的公网地址全球唯一用于互联网通信。唯一本地地址ULA / fc00::/7相当于IPv4的私网地址只在本地网络里有效不会在公网路由。链路本地地址链路本地地址 fe80::/10每个IPv6接口自动生成的地址只能在同一物理链路内通信路由器不会转发这个地址的报文。实际配置中还有一个很大的区别IPv4拿IP地址主要靠DHCP动态主机配置协议服务端分配一个IP、网关、DNS。IPv6则有两种方式一种是类似DHCP的DHCPv6另一种是无状态地址自动配置SLAAC。SLAAC很有意思它让设备根据路由器通告的前缀和网卡MAC地址自动生成IPv6地址完全不需要DHCP服务器。这正好呼应了IPv6的设计哲学设备接入网络即自动获得全局地址零手工配置。做网络规划时IPv6最让人头疼的是习惯转变过去写IP白名单、防火墙规则都是写一个IPv4地址段现在要习惯写 /48、/64 这种前缀还要注意IPv6地址里的字母是区分大小写的但在DNS记录里不区分。不过好消息是IPv6的地址空间太大扫描攻击在IPv6上成本极高这反而带来了安全红利。3. hosts文件每个系统里最早生效的本地DNS很多新手不理解既然有DNS了为什么还要一个hosts文件等实际动手改过hosts、发现优先级问题之后才会明白这个文件在网络命名系统里有多关键。hosts文件是一个纯文本文件作用是建立一个域名到IP地址的静态映射表。它存在于每台电脑上位置如下WindowsC:\Windows\System32\drivers\etc\hostsmacOS / Linux/etc/hosts文件格式极其简单每一行就是一条记录先写IP地址空格或制表符再写域名。比如192.168.1.10 api.test.com 10.0.0.5 registry.internal那么hosts文件和DNS是什么关系最直观的回答是只要系统要访问一个域名一定是先问hosts文件hosts里没有答案才去问DNS服务器。这个优先级顺序写在系统解析函数里几乎是所有操作系统通用的行为。可以理解为hosts是一张放在抽屉里的本地通讯录DNS则是打给总机查号台的电话。先翻抽屉找不到再打电话。hosts文件最实用的几个场景本地开发联调。开发环境和测试环境的域名都可以指到本机比如把 api.test.com 指向 127.0.0.1请求就发到本地服务了。这比改代码里的API地址省事得多尤其适合多项目并行的情况。屏蔽不想访问的域名。把广告追踪域名指向 127.0.0.1请求直接落在本机自然就屏蔽了。很多开源广告过滤方案就是这么干的。跳过CDN或灰度测试。把一个线上域名临时指向某个特定机房IP绕过CDN调度规则快速切换到新版本服务器做验证。可为什么很多人改了hosts却感觉不生效我见过太多人栽在这几个细节上文件编码错误。Windows下如果用记事本另存为默认编码是UTF-8或带BOM但hosts文件如果和系统区域设置不匹配可能无法正常解析。建议用Notepad或VS Code编辑编码选UTF-8无BOM或用系统默认的ANSI。修改后没刷新DNS缓存。hosts文件虽然优先级高但系统会把解析结果缓存一段时间。改完hosts后一定要执行 ipconfig /flushdnsWindows或 sudo dscacheutil -flushcachemacOS刷新缓存才能看到变化。域名带了端口。hosts文件里只能写IP和域名不能写端口号。比如192.168.1.10:8080 api.test.com这种写法是无效的。端口冲突时会直接导致解析失败这是新手最常见的错误。行结束符问题。Linux下编辑过的hosts文件如果用了CRLF换行符在部分解析器里也可能读到最后一片空白。用 UnixLF换行是最稳妥的。有个真实场景想多说一句有一次排查线上故障某服务报域名解析失败登到服务器一看发现运维同事在这台服务器的hosts里写了一条老项目的过期映射恰好把这个域名指向了一台已下线的内网IP。系统优先读hosts压根没去请求DNS结果新项目一启动就莫名其妙连不上。排查了很久才发现是这条看不见的配置在作祟。经历这么一次之后我的习惯就变成凡是容器化或自动扩容场景一律禁用hosts所有依赖域名解析的服务信息交给环境变量或配置中心管理。给各位也提个醒别小看这个文件排查问题和造问题都是它。4. DNS解析全流程从浏览器到根服务器的逐级递进如果说hosts是本地通讯录那DNS就是一个分布在全球的巨型通讯录系统。很多概念性文章把DNS解析讲得很玄其实最核心的就一句话DNS把域名翻译成IP地址但翻译动作是分级、分层、多步骤完成的。为什么不能像 hosts 一样直接查一个总表因为互联网体量太大、更新太快没有任何一台服务器能装下所有域名映射。所以DNS被设计成树状分级结构根服务器管顶级域顶级域管权威服务器权威服务器管具体域名记录。解析请求从本地出发一层层问上去。我以一个实际请求为例完整走一遍。假设你在浏览器地址栏输入 blog.example.com浏览器先查自己的缓存再查操作系统缓存然后查hosts文件。这三关都没命中才开始走网络解析。系统把查询请求发给本机配置的DNS服务器——通常是你路由器分配的比如运营商DNS 或 223.5.5.5。这台服务器叫本地DNS服务器/递归解析服务器。它也不知道答案但它负责替你去问。本地DNS先向根服务器问blog.example.com 的IP是多少全球有13个根服务器集群它们不负责具体域名只指路查 .com 的顶级域服务器地址。根服务器返回 .com 顶级域服务器的地址列表。本地DNS转向 .com 顶级域服务器继续问。顶级域服务器也不负责具体域名返回的是 example.com 权威服务器的地址。本地DNS再向 example.com 的权威服务器发查询。权威服务器在域名注册时配置好管理着 example.com 下所有子域名的记录。它查到了 blog 这条A记录返回IP比如 93.184.216.34。本地DNS拿到IP后返回给系统同时把结果缓存起来。浏览器拿到IP建立TCP连接正式发起HTTP请求。这个流程里有两个关键概念容易被搞混递归查询和迭代查询。上面第2步系统信任本地DNS并等着它给出最终答案这是递归查询——一个帮我问到答案再告诉我的机制。而本地DNS从根到权威服务器的这几步每一步都是你告诉我下一站去哪这种是迭代查询——本地DNS自己一步步往下追。很多面试题爱考这点实操中也确实能帮我们理解为什么DNS解析有时慢递归服务器负载高、某级服务器响应慢、缓存过期被穿透都会增加查询时间。记录类型也是排查中的高频知识点。DNS里不只有A记录记录类型作用典型场景A域名指向IPv4地址最常见的解析记录AAAA域名指向IPv6地址网站支持IPv6访客时配置CNAME域名别名指向另一个域名CDN回源、子域名跳转MX邮件交换记录收发邮件时定位邮件服务器TXT任意文本记录域名验证、SPF反垃圾邮件NS指定域名由哪个域名服务器负责域名托管在第三方DNS时配置实际工作中DNS问题最常见的表现有三个解析缓慢。用 nslookup 或 dig 查看解析耗时重点确认本地DNS服务器是否靠谱可切换 223.5.5.5 或 114.114.114.114 做对比。解析结果被劫持/污染。典型现象是域名被解析到一个可疑IP或运营商强制跳转到广告页。排查时先看本机hosts有没有被改再看本地DNS返回结果对不对。解析结果不一致。同一域名在不同网络环境返回不同IP一般和CDN调度有关不一定是故障。可以用全球在线DNS查询工具确认记录值是否统一。修改域名记录后为什么常常要等很久才生效因为TTL生存时间设定了缓存时长。比如A记录TTL设为600秒所有递归服务器和客户端缓存6小时内有效。所以每次改记录前先把TTL调低到60秒等生效后再调回正常值这是业内标配操作。这个细节能避免很多我改了域名为什么别人还访问到旧IP的尴尬。5. 实战中容易踩的IP与DNS相关坑位概念讲完来点实在的。日常做Web运维和内网服务时有几个场景隔三差五就有人踩坑这里集中梳理一遍。第一个坑端口映射配置错误导致外网访问不到内网服务。前文说了家用路由器把内网多台设备的流量转换为一个公网IP出去。但这个转换是单向的内网主动连外网NAT表会临时建一条记录回包自动放行外网主动连内网则没有对应记录数据包会被丢弃。要让外网用户访问你家里或办公室内网某台机器的服务就得在路由器上配置端口映射/虚拟服务器。设置方法一般是登录路由器管理页面找到端口转发有的叫虚拟服务器填3个信息公网端口外网访问时使用的端口号比如 8080内网IP及端口比如 192.168.1.50:80协议类型TCP/UDP单选或双选HTTP服务选TCP即可配置完之后外网用户访问 公网IP:8080路由器会把流量转给 192.168.1.50:80。这里有个很容易忽略的问题很多运营商会把家庭宽带的80、8080、443等常用端口封禁做个人建站时部署到8080端口却死活打不开多半就是被封端口。建议避开这些端口用高位端口如 8443、9080。另外普通家庭宽带的公网IP是动态的隔几十小时就会变外网访问要用动态域名DDNS配合使用。第二个坑回环地址和本机IP的混用。127.0.0.1 是回环地址代表本机自己完全不出网卡。有些开发者调试时把配置写成了 127.0.0.1结果同一个局域网里的同事访问不到他的服务因为同事访问的还是他本机的地址而不是局域网IP。调试Web服务时监听地址要设为 0.0.0.0监听所有网卡同事访问的则是路由器分配给这台电脑的局域网IP。0.0.0.0 和 127.0.0.1 的区别一句话总结0.0.0.0 是所有网卡都听127.0.0.1 是只听本机。这个搞混了局域网服务基本必挂。第三个坑DNS设置带来的玄学网络故障。有些机器上不了网ping IP能通ping域名不通问题多半出在DNS。前文说过系统解析顺序是浏览器缓存 - 系统缓存 - hosts - DNS缓存 - DNS服务器。如果hosts里有一条错误的映射或者系统配置的DNS服务器不可用就会产生IP通、域名不通的奇怪现象。排查思路也比较固定ping 一个公网IP比如 223.5.5.5确认到网络链路的连通性ping 一个域名比如 www.example.com确认解析是否正常如果第一步通、第二步不通直接检查本地DNS配置尝试换成 119.29.29.29 或 223.5.5.5 再测试如果域名能解析但访问超时重点检查本地安全软件或系统代理设置是否干扰了HTTP层通信。顺便说一个让很多人意外的结论DNS解析本身并不通过HTTP它走的是UDP或TCP的53端口。所以不要因为在抓包工具里看到发往DNS服务器的流量就误以为443端口出问题了。DNS请求一般用UDP但响应数据过大或需要可靠性传输时会切换到TCP。防火墙如果把TCP 53放行、UDP 53拦截DNS照样会时不时出问题。第四个坑IPv6网络中公网可访问带来的新麻烦。前面强调IPv6不需要NAT设备获得的往往是公网可达地址。对于那些不熟悉IPv6防火墙策略的人来说这是一个巨大的隐患过去靠NAT默认隐藏的内网设备在IPv6网络下可能直接暴露在公网——如果路由器防火墙默认允许所有入站连接摄像头、NAS、打印机都可能被全网扫描到。所以切换IPv6后第一件事不是炫我有公网IP了而是检查路由器的IPv6防火墙默认策略确认非必要入站请求被拒绝。这算是IPv6普及带来的新运维要点建议读到这里的各位提前养成习惯。6. 排查网络问题时先画一张清晰的解析路径图讲了这么多概念和坑位最后分享一个方法论。我自己做网络排查时一般不背命令、不背参数而是先在心里画一张图从客户端到目标服务中间经过哪些解析环节、哪些转发设备。这张图一旦清晰很多问题直接用排除法就能定位。以手机App无法访问某个接口为例排查路径大概是这样的第一层手机连的WiFi从路由器拿到的IP是否正确DNS配置是不是被手动改成奇怪的值了第二层路由器上行链路是否正常拨号有没有掉线公网IP是否正常第三层域名解析是否正常手机访问接口用的域名在hosts里没写、系统缓存里没有实际走DNS返回的IP是期望的那台服务器吗第四层服务器端防火墙放行了吗云安全组入站规则有没有允许对应端口第五层服务进程真的在监听吗监听的是0.0.0.0还是127.0.0.1进程有没有崩每一层用一条命令就能验证看网卡地址用 ipconfig / ifconfig看路由和连通性用 ping / route / traceroute查解析用 nslookup / dig查端口监听用 netstat -an。频繁被问到的另一个问题是域名解析慢怎么定位环节我的做法是直接看时间戳。用 dig www.example.com 观察查询耗时如果本地解析用了1000ms以上基本可以断定是本地DNS或上游迭代慢。再用 dig 223.5.5.5 www.example.com 对比如果换了公共DNS就变快了说明问题出在运营商DNS或本地路由器转发上。同理如果把域名换成IP直接访问速度明显更快那瓶颈基本锁定在DNS环节和服务器本身没关系。最后把IP体系和域名体系的关系用一句话总结IP负责在网络中定位设备DNS负责让人类记住并找到IPhosts则是一张本地优先的快速映射表私网让多设备共享一个出口公网让设备被外界找到IPv6则试图让每台设备都直接拥有公网身份。理解了这个完整链条再遇到网络无法访问就能快速判断卡在哪一环而不是靠重启路由器碰运气。实际工作里我很久才真正理解hosts和DNS的优先级不是可以商量的而是系统硬编码的顺序也花了不止一次代价才正视NAT对入站流量的限制。网络这块就是这样——概念看起来每个都认识但把它们放进同一条请求链路里协同工作时细节上的差异才是决定成败的关键。希望这篇尽可能讲透了你真正开一台云服务器、配一次域名解析、改一次hosts的时候能少踩几个坑。
阅读完成 · 觉得有帮助?
咨询建站