DEVTOOLBOX / GUIDES 本篇

网络排查决策指南:IP 与 CIDR 算术、IPv6、DNS、端口与 WHOIS 的判断顺序

网络问题难在同一个症状对应四层完全不同的原因,而四层的答案来源、保鲜期与可信度都不同。这篇不教你点按钮,而是给判断:先按「答案由谁发布」定层,再用可以手算的地址算术、记录类型与 TTL 语义、TCP 与 UDP 探测结果的含义、RDAP 记录的时效,逐层收敛。每一节都写清什么时候选哪种查法、代价是什么、哪一步丢信息不可逆。

内容复核 10 分钟阅读

先定层:地址、名字、端口,还是注册信息

「打不开」背后至少有两种不同的故障:名字没换成地址,和地址有了但端口不通。定层的办法是问「这个答案由谁发布」。地址层由位数与掩码决定,名字层由权威区文件与各级缓存决定,端口层由那一刻路径上的防火墙与监听进程决定,注册层由注册局和区域互联网注册机构的数据库决定。

判据看代价。要判断两个地址是否同网段、一个段能放多少主机,走地址层:不联网、结论恒成立,但永远不会告诉你拓扑现状。要把域名换成地址,走名字层:答案带 TTL,换个网络就可能换个数。要确认端口可达,走端口层:结论只对「你这一侧、这一刻」成立。要查归属与举报联系人,走注册层:记录滞后,联系人常被涂黑。

误用有三条。拿 WHOIS 的地址段推断服务器物理位置,注册地、路由地、机房所在地是三件事;拿反向解析 PTR 证明某 IP 属于某公司,PTR 由地址持有者自由填写,没有权威性;拿「解析成功」当「服务可用」,它只证明有人公布了这条记录。

还有一条取舍不可逆:抓包位置决定你能看到哪一半事实。在客户端抓,只能看到自己没收到什么,看不到服务端有没有发出,也分辨不出中间的 RST 由谁伪造。所以定层之后紧接着要定观测点,否则证据再多也拼不出因果链。

层要回答的问题权威来源失效方式
地址是否同网段、能放几台位运算与掩码算错即全错,但不随网络变化
名字域名对应哪个地址权威区与各级缓存TTL 内改变不了答案
端口此刻能否建立连接路径上的策略与监听换源地址或换时刻即失效
注册归属、举报联系人与到期注册局与 RIR 记录更新时间以天计,字段被涂黑

先定层再选工具,能省掉大半无效查询

IPv4 算数:前缀长度、可用主机数,与两个保留地址

IPv4 共 32 位,前缀长度 n 的网段含 2^(32−n) 个地址,掩码是把前 n 位写成 1,例如 /26 对应 255.255.255.192,/20 对应 255.255.240.0。每段首尾各有一个保留地址:首地址即网络号,用来指代整个网段;末地址是广播地址,发给段内所有主机。因此可用主机数不是一律减 2:n 小于等于 30 时可用 2^(32−n)−2 个;/31 按 RFC 3021 用于点对点链路,2 个都可用;/32 只有 1 个地址,代表单个主机。

常用值要能手算:/24 是 256 与 254,/25 是 128 与 126,/26 是 64 与 62,/30 是 4 与 2。RFC 1918 划出三段私网:10.0.0.0/8、172.16.0.0/12(即 172.16 到 172.31,共 16 个 /16)、192.168.0.0/16(256 个 /24)。RFC 6598 另给 100.64.0.0/10 作运营商级 NAT 地址,它既非公网也非私网,按私网处理会让双向访问假设失效。

还有几段地址不能当普通主机配:127.0.0.0/8 整段是回环,最常用的是 127.0.0.1;169.254.0.0/16 是链路本地,只在拿不到地址时自动生成,看到这个开头就该先查 DHCP 是否可达,而不是怀疑网线;224.0.0.0/4 是多播,不能配成主机地址;0.0.0.0/0 表示默认路由,不是某台主机。把这几个段当普通地址用,症状往往像「网络时通时断」,其实是配置本身错。

RFC 4632 的 CIDR 带来一个后果:转发按最长前缀匹配,10.0.0.0/8 与 10.1.0.0/16 同时存在时,去 10.1.2.3 的流量走 /16。所以相邻网段写成不同长度不是冗余,是两套策略在抢同一批地址。默认值坑有三个:把 172.16.0.0/12 当成 /16,直接少掉 15 个 /16;把 192.168.0.0/16 当成「只有 192.168.0.x 可用」;把 /24 的 .255 和网关一起写进地址池,设备往往只报「地址冲突」而不提「广播地址」。

前缀地址总数可用主机点分掩码
/24256254255.255.255.0
/25128126255.255.255.128
/266462255.255.255.192
/3042255.255.255.252
/3122(点对点)255.255.255.254
/3211(单主机)255.255.255.255

2^(32−n) 与再减 2 的边界:只在 n 小于等于 30 时成立

IPv6:前缀长度、接口标识符与压缩隐藏了什么

IPv6 是 128 位,写 8 组、每组 4 位十六进制。前缀要按用途挑:/64 留给接口标识符 2^64 个地址,/56 是一个站点常见的 2^56 个地址、可切 256 个 /64,/48 可切 65536 个 /64。RFC 4291 规定单播地址的接口标识符为 64 位,无状态自动配置与隐私地址(RFC 4941)都依赖这条边界,切成 /72 之类会让自动配置直接失效。

RFC 5952 收紧了文本表示:小写十六进制、去掉每组前导零、连续全零组用双冒号压缩且全文只出现一次、多段等长时压缩最左那段、单组全零不压缩。压缩隐藏了两件事。一是相等性:2001:db8::1 与 2001:db8:0:0:0:0:0:1 是同一地址,字符串却不相等,比对前必须归一化。二是长度感:双冒号省了几组要靠剩余组数倒推,人工核对常常差一组。

特殊前缀必须记全:2000::/3 为全球单播,现行分配都在其中;fc00::/7 是唯一本地地址,其中 fd00::/8 可自由使用;fe80::/10 是链路本地,注意是 10 位而非 16 位,范围到 febf::;::1 是回环,:: 表示未指定;ff00::/8 是多播;2001:db8::/32 专供文档示例;64:ff9b::/96 是 NAT64。误用集中在两处:把带 %eth0 的链路本地地址整体存库,zone 标识随主机而变;把 ::ffff:192.0.2.1 这类映射地址当作可路由单播。

双栈也不等于等价。只有 A 记录而没有 AAAA 的名字,在优先 IPv6 的客户端上会多一次失败再回落,表现为首包明显变慢;反过来只有 AAAA 而路径不可达时,客户端没有 A 记录可退,直接失败。所以「IPv6 是否真可用」不能只看解析出了 AAAA,要实测一条到该地址的连接。

前缀用途地址数前提或代价
/64单个子网2^64自动配置的前提
/56常见站点分配2^56,含 256 个 /64须切出 /64 才能自动配置
/48大型站点2^48,含 65536 个 /64路由表压力换灵活性
/127点间链路2RFC 6164,避开子网路由冲突
/128单主机1回环或服务专用地址

先按 64 位边界分配,再讨论切多细

DNS:记录类型、TTL,以及为什么缓存结果与工具不一致

RFC 1035 定义了 A、NS、CNAME、SOA、PTR、MX、TXT,AAAA 见 RFC 3596,SRV 见 RFC 2782,CAA 见 RFC 8659。按答案形状选记录:一个名字对多个地址就写多条 A 或 AAAA,客户端挑哪条不定;一个名字指向另一个名字用 CNAME,但它不能与其他记录共存,也不能放在区顶,区顶别名只能靠厂商私有的 ALIAS 或 ANAME;邮件路由用 MX 带优先级,服务发现用 SRV 带端口与权重。

TTL 是秒数,缓存按它逐秒扣减,改动后旧值仍会被用满一个周期,所以迁移前先把 TTL 降到 300 秒左右并等过旧 TTL,改完再调回。否定答案也缓存:记录不存在时按 SOA 的 minimum 字段扣减(RFC 2308),常见 300 到 3600 秒,这就是「刚加了解析却仍报不存在」的来由。

工具与浏览器不一致,多半不是工具错,而是三个变量不同:问的服务器不同,本机 stub、运营商递归、公共加密 DNS 各自独立缓存;权威侧按来源返回不同结果,即分线路解析;一个名字有多条记录而展示顺序不同。要消掉变量就用指定服务器比对缓存,或从根开始逐级追到权威应答。另一个默认值坑是 ANY:RFC 8482 之后它被允许只回一条记录集或一条 HINFO,把 ANY 当「导出全部记录」已不可靠。

第四个变量是解析通道。加密 DNS(RFC 8484 的 DoH、RFC 7858 的 DoT)改变了谁能看见查询,也让系统里的 DNS 设置不再代表实际使用的服务器,浏览器可能自带解析器。判据:排障时先确认这次查询走的是哪条通道,再比较结果;长期则把监控固定到明确的递归服务器上,否则同一份告警在不同网络里会给出不同答案。

记录回答什么常见误用
A / AAAA名字对应的 IPv4 / IPv6 地址把解析成功当作服务可用
CNAME别名指向另一个名字与 MX 共存,或放在区顶
MX收信主机与优先级只配一条导致单点
TXT任意文本,常用于校验长度超限被拆段后校验失败
NS / SOA谁负责这个区、否定缓存多久忽略 minimum 字段
PTR地址反查名字当作归属证明

记录类型选错时,症状与「没配」几乎一样

端口:TCP 与 UDP,以及「端口关闭」到底说明什么

端口号 0 到 65535。RFC 6335 把 0 到 1023 定为系统端口,Unix 上绑定需特权或对应能力位;1024 到 49151 是注册端口;49152 到 65535 是动态端口,Linux 实际范围由 net.ipv4.ip_local_port_range 给出,默认 32768 到 60999。TCP 有三次握手,所以探测能落到三种状态:收到 SYN-ACK 是开放,收到 RST 是关闭,什么都没等到就是被丢包过滤。

UDP 没有握手,「没回应」本身不构成结论:可能服务在听但不回,也可能被静默丢弃。只有收到 ICMP 端口不可达(type 3 code 3)才能判为关闭,其余一律记不确定,这也是 UDP 扫描慢且误报高的根源。

「端口关闭」只说明从你的源地址、经这条路径、在这一刻没收到 SYN-ACK。它排除不了负载均衡后面的另一台机器、只放行特定源的安全组、NAT 回流失效、以及中间设备伪造 RST。反过来开放也不等于可用:应用可能回 500,可能要求特定 SNI 与 Host,可能被 WAF 拦。两个默认值坑最费时间:把 80 或 443 通当作服务在线;忽略 TIME_WAIT,主动关闭方要保留四元组 2×MSL,Linux 固定 60 秒,高并发短连接会先耗尽临时端口,而不是带宽。

两个数值边界也常被混为一谈。监听队列有上限,积压满了的表现是握手成功但随后被断开,与端口关闭完全不同;临时端口用尽时报的是「无法分配请求的地址」,要扩范围或改连接复用,而「连接被拒绝」才是目标没在听。把这两种失败当成同一件事,方向会一路追错。

探测结果说明什么下一步
SYN-ACK该路径上端口开放查应用层状态码与 SNI 是否匹配
RST目标回了拒绝确认是否安全组或本机未监听
超时无回应丢包或过滤,未定论换源地址与换路径再测
ICMP 端口不可达UDP 端口确实关闭换协议或换端口号
握手后立刻断开中间设备或限额拦截抓包看 RST 由谁发出

三种 TCP 状态、两种 UDP 结论,别把「无回应」写成「关闭」

注册信息:WHOIS 与 RDAP、隐私涂黑与过期数据

WHOIS 走 43 端口、纯文本,响应格式各行其是,字段含义靠猜。RDAP 是替代方案:RFC 7480 规定在 HTTP 上的用法,7481 规定查询路径,7482 规定 JSON 响应,7483 规定 JSON 对象结构,7484 规定 bootstrap 注册表,用来按 IP 或域名定位该问哪台服务器。判据:要程序解析与缓存用 RDAP;要查历史快照或某些国家顶级域,只能退回 WHOIS。

涂黑是常态而非异常。2018 年通用顶级域普遍按隐私规则把注册人姓名、地址、电话、邮箱替换为 REDACTED FOR PRIVACY 或改成角色对象,滥用联系人一般保留。所以「查不到注册人」不能推断域名可疑,「信息完整」也不代表可信。

过期与不一致要分开读。注册局的创建与到期日期反映注册合同,不反映账单状态;区域互联网注册机构的分配记录只说明某地址段分配给了谁,不说明它被路由。判断一个 IP 现在归谁要看三样:RDAP 分配记录、BGP 公告、abuse 邮箱。域名状态字段也有硬边界:clientTransferProhibited 是转移锁,pendingDelete 配合 30 天赎回期表示已过期进入删除流程,这段窗口内续费仍可救回。

覆盖与限速决定能不能自动化。通用顶级域大多提供 RDAP,部分国家顶级域仍只有 WHOIS 或自建接口,所以脚本要留回落路径;RDAP 走 HTTPS,可以借用 HTTP 语义处理缓存与 429 限速,而 WHOIS 侧只能靠控制请求间隔。查历史归属别指望这两者,它们回答的都只是当前状态,历史要靠带时间戳的快照。

项目WHOISRDAP
传输TCP 43,明文HTTPS,RFC 7480
响应纯文本,无固定字段JSON,字段有定义
定位服务器靠约定俗成bootstrap 注册表,RFC 7484
机器解析需按行猜格式可直接取值
缓存与速率无统一约定可用 HTTP 语义与 429

同一条记录,两种取法:能不能被程序读懂是分水岭

一套先排除本地原因的排查顺序

顺序的价值在于每一步都能排除一类原因,且尽量在本地做完。先查本机:hosts 文件、代理与 VPN 设置、系统解析服务器、浏览器是否启用了绕过系统的加密 DNS,这四项任一条都能造出「别人都能访问,只有我不行」。再查出口:逐跳路径在哪一跳断,以及 MTU。

MTU 值得单列:以太网 1500,PPPoE 1492,隧道更小,IPv6 要求链路至少 1280(RFC 8200)。路径 MTU 发现依赖 ICMP 的「需要分片」报文,一旦被丢弃就成黑洞,表现为小包通、大包卡住、TLS 握手在证书阶段超时。用禁止分片的探测包逐步加长即可定位,不必猜。

第三步才查端口与注册信息,并且必须换一侧测:从目标同网段测、从公网测,两次结论不同就说明中间有策略。最后才看服务日志与返回码。代价写清:远端探测快,但不代表用户路径;本地抓包准,但复现成本高。记录证据时固定四元组——时间、源地址、解析到的 A 与 AAAA、端口与 SNI,否则「时好时坏」永远对不上账。

最后一条常被跳过:复现要写成条件。解析结果、源地址、时间窗三者固定住,第二次测到的才是同一件事。现场处置的优先级也很硬:重启会清空监听队列与连接状态,等于把最关键的证据一起删掉,所以顺序是先抓包、存连接表快照、再重启。这一步做反了不可逆,日志里只剩重启之后的现象。

步骤查什么能排除什么
本机解析hosts、代理、解析服务器、加密 DNS只有本机出问题的情况
出口与路径逐跳路径、MTU、丢包率路径中断与分片黑洞
端口换源地址双侧探测安全组、NAT、监听缺失
注册与策略RDAP、BGP 公告、WAF 规则归属误判与策略拦截
应用与日志状态码、SNI、证书、错误日志服务自身故障

从里往外,每一格都要能排除一类原因才继续往下

常见问题

/24 为什么可用 254 个而不是 256 个?
256 个地址里首地址是网络号、末地址是广播地址,都不能分给主机。例外是 /31 与 /32:/31 按 RFC 3021 两点间链路两个都可用,/32 只代表单台主机。
改了 DNS 记录,为什么有些地方还是旧地址?
缓存按原 TTL 扣减,改记录不会取消已发出的缓存。迁移前应先把 TTL 降到 300 秒左右,等过旧 TTL 周期再改;否定答案还会按 SOA 的 minimum 缓存。
端口探测显示关闭,就等于服务没启动吗?
不等于。结论只对本机源地址、当前路径与时刻成立。负载均衡后面的其他机器、只放行特定源的安全组、NAT 回流失效、伪造 RST 都会造成同样现象。
IPv6 地址压缩后为什么字符串比较不相等?
RFC 5952 允许双冒号压缩任意长度的全零段,同一地址有多种合法写法。比对前要先归一化到完整 8 组形式,否则 2001:db8::1 与展开写法会被判为不同。
WHOIS 查不到注册人,是不是域名有问题?
不是。隐私规则下注册人字段普遍被涂黑或改为角色对象,滥用联系人通常保留。要判断可信度应看创建时间、状态码、解析与路由是否一致,而不是看个人信息。

动手试试