干网络运维这些年,我发现自己跟人解释最多的问题,不是哪个设备坏了,而是IP地址、域名、DNS这三者到底什么关系。明明每次出故障,最后都能绕回到这三位身上。今天不整虚的,就着这几个基础概念,把原理讲透,再把排查网络故障的实战套路捋一遍。不管是刚入行的运维、写接口要配域名的后端,还是做实验被IP规划烦到的学生,这篇看完都能直接用上。
1. 基础概念:IP地址、域名与DNS分别是干什么的
1.1 IP地址:网络中的门牌号
IP地址就是一台设备在网络里的门牌号。只要设备接入网络,不管是电脑、手机、打印机,还是路由器,都得有一个IP地址才能被找到。没有IP,数据包发出去都不知道该往哪儿送,就像寄快递没有收件地址一样。
最常见的IPv4地址是32位二进制,平时看到的点分十进制只是给人看的形式,比如192.168.1.10。IPv4总地址量约43亿个,听起来不少,但全球设备早就远超这个数了,所以又有IPv6,128位地址,基本可以给地球上的每粒沙子分配地址。现在很多设备虽然显示的是IPv6地址,但日常排障仍以IPv4为主。
IP地址还分公网和私网。公网地址在全球唯一,能在互联网上直接访问;私网地址只在局域网内部使用,常见的私网网段包括:
| 网段 | 地址范围 | 典型用途 |
|---|---|---|
| 10.0.0.0/8 | 10.0.0.0 - 10.255.255.255 | 大型企业内部网络 |
| 172.16.0.0/12 | 172.16.0.0 - 172.31.255.255 | 中大型网络,云服务器VPC |
| 192.168.0.0/16 | 192.168.0.0 - 192.168.255.255 | 家庭和企业局域网 |
私网地址不能直接在公网路由,要通过路由器做NAT转换才能上外网。这也是为什么一个办公室几十台电脑,但只有路由器上有一个公网IP。
找设备的IP地址也是排障基本功。Windows下用ipconfig,Linux下用ip addr或ifconfig,macOS通常用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的通讯录
DNS(Domain 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服务器和本地电脑都会缓存解析结果,缓存时间由TTL(Time To Live)控制。比如某个A记录的TTL是600秒,在这10分钟内,再次查询直接命中缓存,不会重新向上级索取。这也解释了为什么修改域名解析后,不是立刻生效,而是等全球各地的缓存过期后,新IP才会逐步生效。
在实际排障中,如果域名刚改了解析,但本机还是旧IP,可以用命令清掉本地DNS缓存,再等待公共DNS缓存到期。如果用了CDN或云解析,不同地区生效时间有差异,这个要提前跟业务方说清楚,免得被误以为是故障。
2.2 DNS记录类型:A/AAAA/CNAME/MX/NS/TXT
DNS并不是只存一个IP,它包含多种记录类型,每种记录解决不同需求。最常用的有:
| 记录类型 | 全称 | 作用 |
|---|---|---|
| A | Address Record | 域名指向IPv4地址 |
| AAAA | IPv6 Address Record | 域名指向IPv6地址 |
| CNAME | Canonical Name | 域名别名,指向另一个域名 |
| MX | Mail Exchange | 邮件服务器地址 |
| NS | Name Server | 指定域名的权威DNS服务器 |
| TXT | Text Record | 文本信息,常用于验证或SPF防垃圾邮件 |
比如你有个域名提供Web服务,需要加A记录;如果你希望www指向主域名,可以加CNAME记录;公司有邮箱系统,则必须正确配置MX记录。很多人配置邮件一直发不出去,检查后才发现MX记录写错或者优先级不对。
查看记录最常用的工具是nslookup和dig。Windows自带nslookup,Linux通常有dig。执行nslookup -type=A 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连通性,注意看丢包率和延迟。ipconfig(Windows)/ip addr(Linux):查看本机IP、掩码、网关和DNS。nslookup/dig:查询DNS解析结果。tracert(Windows)/traceroute(Linux):查看数据包经过的路径,定位卡在哪一跳。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 典型故障案例与处理
案例1:Linux修改DNS后重启失效
用户反馈,在/etc/resolv.conf里把DNS改成114.114.114.114,重启网络后又被改回去了。这个问题的根因是NetworkManager或systemd-resolved自动管理了DNS配置。处理方法是先看系统用了哪种网络管理工具:CentOS 7/8用nmcli,Ubuntu用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,才彻底解决。
案例2:Apache配置域名无法访问
服务器上Apache配置了ServerName和VirtualHost,域名也解析到了服务器IP,但浏览器访问域名还是打不开。排查时先看IP能否连通,结果IP能通,再telnet 80端口也是通的,说明防火墙没问题。最后才发现Apache没监听对应的端口,或者虚拟主机配置没生效。用httpd -t检查配置语法,再用ss -tlnp | grep httpd看监听状态。如果是刚改完配置,记得systemctl reload httpd。还有一个常见问题:域名解析到了CDN或云服务商IP,但服务器本机防火墙只放行了源站IP,需要检查安全组和iptables规则。
案例3:DNS服务器响应慢
公司网络访问某个网站老卡,先怀疑带宽,结果下载速度正常。后来用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。
案例5:DNS缓存损坏导致网页卡死
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\hosts,Linux在/etc/hosts。hosts文件优先级高于DNS查询,如果里面有错误的映射,就会覆盖正常解析。曾遇到过同事工位电脑访问内网系统一直失败,最后发现是hosts文件残留了旧的IP地址。清理后故障消失。
3.4 排查技巧:DNS缓存、hosts文件、抓包验证
排障过程中,清DNS缓存是避免误判的重要手段。Windows执行ipconfig /flushdns,Linux如果用的是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/25(128个地址)和192.168.1.128/25(128个地址)。一个给行政,一个给技术,这样既能减少广播域,也方便做安全策略。
在华为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配置里可以指定DNS:
ip 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,说不定就真相大白了。