干网络运维这些年我发现自己跟人解释最多的问题不是哪个设备坏了而是IP地址、域名、DNS这三者到底什么关系。明明每次出故障最后都能绕回到这三位身上。今天不整虚的就着这几个基础概念把原理讲透再把排查网络故障的实战套路捋一遍。不管是刚入行的运维、写接口要配域名的后端还是做实验被IP规划烦到的学生这篇看完都能直接用上。1. 基础概念IP地址、域名与DNS分别是干什么的1.1 IP地址网络中的门牌号IP地址就是一台设备在网络里的门牌号。只要设备接入网络不管是电脑、手机、打印机还是路由器都得有一个IP地址才能被找到。没有IP数据包发出去都不知道该往哪儿送就像寄快递没有收件地址一样。最常见的IPv4地址是32位二进制平时看到的点分十进制只是给人看的形式比如192.168.1.10。IPv4总地址量约43亿个听起来不少但全球设备早就远超这个数了所以又有IPv6128位地址基本可以给地球上的每粒沙子分配地址。现在很多设备虽然显示的是IPv6地址但日常排障仍以IPv4为主。IP地址还分公网和私网。公网地址在全球唯一能在互联网上直接访问私网地址只在局域网内部使用常见的私网网段包括网段地址范围典型用途10.0.0.0/810.0.0.0 - 10.255.255.255大型企业内部网络172.16.0.0/12172.16.0.0 - 172.31.255.255中大型网络云服务器VPC192.168.0.0/16192.168.0.0 - 192.168.255.255家庭和企业局域网私网地址不能直接在公网路由要通过路由器做NAT转换才能上外网。这也是为什么一个办公室几十台电脑但只有路由器上有一个公网IP。找设备的IP地址也是排障基本功。Windows下用ipconfigLinux下用ip addr或ifconfigmacOS通常用ifconfig也能看到。很多人问“如何查找打印机的IP地址”最快的方法是看打印机面板网络设置或者去路由器后台看DHCP客户端列表也可以打印网络配置页。SUSE图形界面里则可以在Yast的“网络设置”模块里找到网卡和IP信息不用敲命令。1.2 域名人类友好的地址域名是为了让人类不用背一串数字而发明的。比如访问网站时输入example.com而不是输入93.184.216.34。域名不仅仅是“网址”在邮件服务器、文件服务器、API接口等场景里也会用到。域名的结构有层级从右往左看blog.example.com.com是顶级域example是主域名blog是子域名。顶级域可以再细分为通用顶级域.com、.org、.net和国家顶级域.cn、.jp。一个完整的域名需要通过域名注册商购买然后配置DNS解析才能指向服务器IP。查询域名信息可以用whois命令或者去各类免费网站域名查询平台。域名查询的作用不只是看能不能注册还能排查域名到期时间、注册商、解析服务器等关键信息。很多时候网站突然打不开不是服务器挂了而是域名忘记续费解析被暂停了。子域名也很重要比如企业会给不同业务分配oa.example.com、mail.example.com、api.example.com。在做“网页授权回调域名”时第三方平台要求你配置一个可访问的HTTPS域名本质上就是要求有一个已备案并解析正常的子域名保证回调请求能真实回到你的服务器。1.3 DNS把域名翻译成IP的通讯录DNSDomain Name System是个分布式通讯录负责把域名翻译成IP地址。你可以把DNS理解为手机通讯录存了“张三”这个名字对应的电话号码打电话时直接喊名字就行不用去背号码。当你在浏览器输入一个域名时电脑会先向配置的DNS服务器发一个查询请求“请问example.com的IP是多少”DNS服务器会返回一个IP地址浏览器再向这个IP发起HTTP请求。整个过程通常在毫秒级完成用户无感知。但DNS一旦出问题最常见的就是“DNS解析未能找到目标地址”、“网页打不开但能上QQ”等。需要明白一个关键点域名解析和网络连通是两码事。有时候IP能ping通但域名解析不出来问题就出在DNS而不是网络线路。这也是所有网络故障排查里必须把IP层和DNS层分开验证的原因。2. 域名解析原理与关键记录类型2.1 递归查询与迭代查询DNS解析看起来只是一个请求一个应答但实际内部是分层的。当你的电脑向指定的DNS服务器发起查询时通常执行的是递归查询DNS服务器代替你去找答案。假设你用的是公共DNS这个服务器会先从根域名服务器问.com的服务器地址再从.com的服务器问example.com的权威服务器地址最后从权威服务器得到具体IP整个过程叫迭代查询。为了减少重复查询DNS服务器和本地电脑都会缓存解析结果缓存时间由TTLTime To Live控制。比如某个A记录的TTL是600秒在这10分钟内再次查询直接命中缓存不会重新向上级索取。这也解释了为什么修改域名解析后不是立刻生效而是等全球各地的缓存过期后新IP才会逐步生效。在实际排障中如果域名刚改了解析但本机还是旧IP可以用命令清掉本地DNS缓存再等待公共DNS缓存到期。如果用了CDN或云解析不同地区生效时间有差异这个要提前跟业务方说清楚免得被误以为是故障。2.2 DNS记录类型A/AAAA/CNAME/MX/NS/TXTDNS并不是只存一个IP它包含多种记录类型每种记录解决不同需求。最常用的有记录类型全称作用AAddress Record域名指向IPv4地址AAAAIPv6 Address Record域名指向IPv6地址CNAMECanonical Name域名别名指向另一个域名MXMail Exchange邮件服务器地址NSName Server指定域名的权威DNS服务器TXTText Record文本信息常用于验证或SPF防垃圾邮件比如你有个域名提供Web服务需要加A记录如果你希望www指向主域名可以加CNAME记录公司有邮箱系统则必须正确配置MX记录。很多人配置邮件一直发不出去检查后才发现MX记录写错或者优先级不对。查看记录最常用的工具是nslookup和dig。Windows自带nslookupLinux通常有dig。执行nslookup -typeA example.com能查出IPv4地址dig example.com MX能查邮件记录。需要注意dig输出信息更完整包含查询耗时、TTL和权威服务器排障时比nslookup好用得多。2.3 公共DNS与自建DNS日常上网显然不能只靠运营商默认分配的DNS有时候它响应慢甚至解析出错误结果。可以选择一些公共DNS服务比如阿里的223.5.5.5、腾讯的119.29.29.29、百度的180.76.76.76还有老牌的114.114.114.114。这些公共DNS的优点是节点分布广、缓存命中率高多数时候比运营商默认DNS更稳。但如果是企业内网需要解析内部域名比如gitlab.internal.com这类就不能只依赖公共DNS因为公共DNS并不知道你内网的机器名。这时候可以在内网自建DNS服务器。Linux下最常用的是BIND也可以用Dnsmasq做轻量解析。自建DNS的好处是能统一管理内网主机名、做域名过滤、加速外网解析缓存。自己配置DNS服务器有个经典坑修改Linux的/etc/resolv.conf后重启网络就还原了。原因大多是NetworkManager或systemd-resolved接管了DNS配置。在CentOS/RHEL这类系统里正确做法是修改/etc/sysconfig/network-scripts/ifcfg-eth0里的DNS1和DNS2或者用nmcli命令修改。如果是Ubuntu 18.04以上一般通过/etc/netplan/*.yaml配置DNS。改完重启网络后记得用cat /etc/resolv.conf确认没有回去。3. 常见网络故障排查实战3.1 排查思路从现象出发网络故障的排查最怕没有章法。我看到很多人一上来就重启路由器其实问题往往不在路由器。要按层来切分先看物理链路再看IP连通再看DNS解析最后看应用层。比如“网页打不开”这个现象可以按下面几步快速定位先ping网关确认本机到路由器通不通。再ping一个公网IP比如223.5.5.5确认能不能出外网。如果公网IP通了再用nslookup查目标域名确认DNS能不能解析。如果DNS正常再用ping 域名看解析出来的IP通不通。最后用curl -I或telnet 域名 80看目标端口通不通。这个套路能覆盖大多数情况。很多“DNS解析未能找到目标地址”的报错往往在第3步就能定位到DNS服务器配置问题。记住一句话先通IP再查解析最后看服务。方向对了排查时间能缩短一半。3.2 常用命令与工具排查网络故障我日常离不开这几个命令ping验证IP连通性注意看丢包率和延迟。ipconfigWindows/ip addrLinux查看本机IP、掩码、网关和DNS。nslookup/dig查询DNS解析结果。tracertWindows/tracerouteLinux查看数据包经过的路径定位卡在哪一跳。telnet/nc测试目标端口是否开放。curl测试HTTP服务是否正常尤其能看返回码和响应头。比如Linux下查看当前DNS配置最简单的是cat /etc/resolv.conf可以看到nameserver行。也可以用nmcli dev show查看当前网络连接的DNS。如果嫌命令行麻烦SUSE图形界面可以直接在Yast里看到网卡和DNS信息。排查DNS问题时我习惯先确认本机DNS是指向哪里的很多怪问题就是因为DNS被改成了某个不稳定的服务器。测试端口时telnet example.com 80如果能进入一个黑屏或显示欢迎信息说明端口通如果提示Connection refused或超时说明端口被防火墙挡了或服务没启动。对于HTTPS用openssl s_client -connect example.com:443 -servername example.com可以验证证书是否有效。3.3 典型故障案例与处理案例1Linux修改DNS后重启失效用户反馈在/etc/resolv.conf里把DNS改成114.114.114.114重启网络后又被改回去了。这个问题的根因是NetworkManager或systemd-resolved自动管理了DNS配置。处理方法是先看系统用了哪种网络管理工具CentOS 7/8用nmcliUbuntu用netplan或systemd-resolved。如果只想临时生效可以手动改动/etc/resolv.conf如果想永久生效必须在网卡配置里改。我曾经在一台CentOS机器上踩过坑后来直接用nmcli con mod eth0 ipv4.dns 223.5.5.5 119.29.29.29再nmcli con up eth0才彻底解决。案例2Apache配置域名无法访问服务器上Apache配置了ServerName和VirtualHost域名也解析到了服务器IP但浏览器访问域名还是打不开。排查时先看IP能否连通结果IP能通再telnet 80端口也是通的说明防火墙没问题。最后才发现Apache没监听对应的端口或者虚拟主机配置没生效。用httpd -t检查配置语法再用ss -tlnp | grep httpd看监听状态。如果是刚改完配置记得systemctl reload httpd。还有一个常见问题域名解析到了CDN或云服务商IP但服务器本机防火墙只放行了源站IP需要检查安全组和iptables规则。案例3DNS服务器响应慢公司网络访问某个网站老卡先怀疑带宽结果下载速度正常。后来用dig 223.5.5.5 example.com测试发现公共DNS解析只要几十毫秒而本机DNS要几秒才返回。原因就是本机配置的DNS服务器负载过高或链路问题。最简单的解决办法是换成公共DNS同时检查路由器是否分配了错误的DNS给客户端。如果在企业网络可以在网关上看DNS流量判断是否有大量无效域名查询占用资源。案例4如何快速查找打印机IP地址很多人不知道打印机IP怎么看。如果打印机有显示屏在网络设置里能看到IP如果没有屏幕就打印一张网络配置页上面会列出IP和MAC。还有一个办法登录路由器后台在DHCP客户端列表里搜打印机的MAC地址打印机机身标签上有。有些打印机会默认从DHCP拿IP为了避免IP变化导致无法连接我建议在路由器上做IP-MAC绑定让打印机每次都是固定IP。案例5DNS缓存损坏导致网页卡死Windows系统事件日志里出现DNS Client Events 1012同时打开网页时电脑卡死或浏览器长时间无响应。这通常是DNS客户端缓存服务出现问题或者缓存文件损坏。解决方法是重启DNS Client服务并在管理员命令行执行ipconfig /flushdns netsh winsock reset netsh int ip reset重启电脑后基本可以恢复正常。如果是系统服务被禁用手动把DNS Client启动类型改为“自动”并启动即可。案例6域名被hosts文件劫持有时候域名解析出来的IP跟预期不一致或者访问某个域名跳到广告页。就要检查本机hosts文件。Windows在C:\Windows\System32\drivers\etc\hostsLinux在/etc/hosts。hosts文件优先级高于DNS查询如果里面有错误的映射就会覆盖正常解析。曾遇到过同事工位电脑访问内网系统一直失败最后发现是hosts文件残留了旧的IP地址。清理后故障消失。3.4 排查技巧DNS缓存、hosts文件、抓包验证排障过程中清DNS缓存是避免误判的重要手段。Windows执行ipconfig /flushdnsLinux如果用的是systemd-resolved执行systemd-resolve --flush-caches老一些的发行版重启nscd服务。macOS执行sudo killall -HUP mDNSResponder。注意hosts文件的优先级比DNS高但比“本地DNS缓存”更高吗实际顺序是浏览器缓存 - 操作系统hosts文件 - 系统DNS缓存 - DNS服务器。所以测试时最好用nslookup这种不经过hosts的工具来获得真实解析结果而浏览器则可能因为hosts或缓存受影响。如果怀疑DNS解析被中间网络干扰可以抓包验证。用tcpdump -i eth0 port 53或Wireshark过滤dns能看到完整的查询和响应过程。排查“DNS解析慢”时抓包能看到每一步的耗时排查“解析结果不对”时能看到是不是本地DNS服务器被劫持返回了错误的IP。4. 进阶IP地址规划、端口与安全策略4.1 子网划分与IP地址规划IP地址不只是用来上网更是一套逻辑结构。给网络划分IP段相当于把一个大楼分成不同房间。最常用的规划手段是子网掩码和CIDR。比如一个办公网有200台设备如果直接给一个192.168.1.0/24网段只有254个可用地址基本够用但缺乏弹性。想划分更细按部门分VLAN可以把192.168.1.0/24进一步切成192.168.1.0/25128个地址和192.168.1.128/25128个地址。一个给行政一个给技术这样既能减少广播域也方便做安全策略。在华为ensp或真实交换机上做实验时常需要配置DHCP和DNS的联动。比如让DHCP服务器自动给客户端分配IP的同时也下发DNS服务器地址这样客户端拿到IP后无需手动配置DNS。命令思路大致是dhcp enable interface Vlanif 10 ip address 192.168.10.1 255.255.255.0 dhcp select global全局DHCP配置里可以指定DNSip pool office network 192.168.10.0 mask 255.255.255.0 gateway-list 192.168.10.1 dns-list 223.5.5.5 119.29.29.29这样的好处是统一管理DNS配置避免每台电脑手动设置导致后期排查混乱。DHCP客户端有时候需要加第二个IP地址比如Linux上配置多IP可以用ip addr add 192.168.20.2/24 dev eth0。如果是虚拟机比如Hyper-V里固定IP地址最简单的办法是在虚拟机系统内部配置静态IP同时建议将虚拟机网卡在Hyper-V中设置为静态MAC再在DHCP里做保留这样能双重固定。4.2 基于IP地址和端口的安全策略安全策略的核心之一就是基于IP和端口的访问控制。配置防火墙时不能只看IP通不通还要确认端口放没放行。比如一台Web服务器可能只需要开放80和443端口其他端口全部拒绝。这样可以减少被扫描和入侵的风险。Linux平台常用iptables或nftables配置。经典的白名单策略iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT iptables -A INPUT -j DROP这段规则的含义是允许回包数据允许内网网段访问SSH允许所有人访问443其余直接丢弃。对于API服务如果只对内网开放就只放行对应网段和端口。曾经帮客户排查过数据库无法访问的问题最后发现是安全组里只放了应用服务器IP但运维人员直接拿本机IP去连数据库被安全组挡在外面加上白名单后故障消除。如果是在云平台安全组的配置思路也一样。阿里云部署项目和域名时除了在ECS安全组放行80/443端口还要在系统防火墙里放行对应端口双重检查才稳。域名绑定到服务器后还要确认nginx或Apache的监听地址是不是0.0.0.0或者具体的公网IP。有些服务默认只监听127.0.0.1导致域名解析到了但外网访问不了。4.3 域名、DHCP与容器/虚拟机网络联动网络环境里经常会出现DHCP分配的IP和固定IP冲突或者Docker容器和宿主机IP互相干扰。做规划时要区分清楚宿主机、容器、虚拟机各自使用哪个网段避免路由混乱。比如企业里有OpenStack或KVM环境通常会规划10.0.0.0/24给宿主机管理192.168.100.0/24给虚拟机业务网容器则单独用172.17.0.0/16。这样各网段之间可以通过路由或安全组控制互访。如果DHCP分配IP经常变动而服务又要求固定IP可以在DHCP服务器上做保留还可以给网卡配置两个IP一个用于管理一个用于业务。动态IP怎么和域名关联这就是DDNS的用途。家庭宽带或部分企业没有固定公网IP可以通过no-ip等DDNS服务让本机定时上报自己的公网IP域名自动指向最新IP。配置思路是注册一个域名在路由器或客户端上填上DDNS账号密码路由器会自动更新解析记录。用DDNS要注意域名解析生效时间一般快则几秒慢则几分钟别拿刚更新的域名去压测。4.4 DNS安全与域名拦截DNS也能做安全控制。企业内网里常见的是域名白名单和黑名单员工只能访问白名单里的域名或者恶意域名直接被拦截。实现方式有两种一种是在自建DNS服务器上配置zone规则把恶意域名解析到内网告警服务器另一种是使用带上网行为管理的设备在DNS层面过滤。恶意DNS域名检测系统设计的核心逻辑是监控DNS查询流量分析域名是否存在滥用特征比如DGA域名随机生成的域名、已知恶意家族域名、短时间大量不重复子域名查询等。但作为运维人员我更关注实际落地的方案企业内部可以部署一个DNS日志服务器把所有内网DNS查询记录下来按小时统计域名请求频率一旦发现异常的请求模式就预警。这不仅能防恶意软件也能排查本机中毒后不断尝试连接外网的设备。域名拦截检测里还有一个常见场景备案域名被恶意解析到私有IP导致访问不了。处理方法是检查该域名是否有未授权的A记录及时删除并在DNS配置里添加SPF或TXT记录防止被滥用发送垃圾邮件。总之DNS不仅是解析工具也是内网安全的第一道门。干网络这行久了我有个很深的体会越是基础的概念越容易在故障时被忽略。IP地址、域名、DNS这三者看着简单实际上环环相扣。每次出问题先从IP连通性开始验证再顺着DNS解析一步步往下查最后聚焦到目标服务本身的端口和进程。这套排查思路帮我在无数个“重启路由器”的重复操作里真正找到过问题的根源。下次遇到网页打不开别急着拍设备先敲一句nslookup说不定就真相大白了。