网络排查决策指南:IP 与 CIDR 算术、IPv6、DNS、端口与 WHOIS 的判断顺序
网络问题难在同一个症状对应四层完全不同的原因,而四层的答案来源、保鲜期与可信度都不同。这篇不教你点按钮,而是给判断:先按「答案由谁发布」定层,再用可以手算的地址算术、记录类型与 TTL 语义、TCP 与 UDP 探测结果的含义、RDAP 记录的时效,逐层收敛。每一节都写清什么时候选哪种查法、代价是什么、哪一步丢信息不可逆。
先定层:地址、名字、端口,还是注册信息
「打不开」背后至少有两种不同的故障:名字没换成地址,和地址有了但端口不通。定层的办法是问「这个答案由谁发布」。地址层由位数与掩码决定,名字层由权威区文件与各级缓存决定,端口层由那一刻路径上的防火墙与监听进程决定,注册层由注册局和区域互联网注册机构的数据库决定。
判据看代价。要判断两个地址是否同网段、一个段能放多少主机,走地址层:不联网、结论恒成立,但永远不会告诉你拓扑现状。要把域名换成地址,走名字层:答案带 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 和网关一起写进地址池,设备往往只报「地址冲突」而不提「广播地址」。
| 前缀 | 地址总数 | 可用主机 | 点分掩码 |
|---|---|---|---|
| /24 | 256 | 254 | 255.255.255.0 |
| /25 | 128 | 126 | 255.255.255.128 |
| /26 | 64 | 62 | 255.255.255.192 |
| /30 | 4 | 2 | 255.255.255.252 |
| /31 | 2 | 2(点对点) | 255.255.255.254 |
| /32 | 1 | 1(单主机) | 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 | 点间链路 | 2 | RFC 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 侧只能靠控制请求间隔。查历史归属别指望这两者,它们回答的都只是当前状态,历史要靠带时间戳的快照。
| 项目 | WHOIS | RDAP |
|---|---|---|
| 传输 | 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 查不到注册人,是不是域名有问题?
- 不是。隐私规则下注册人字段普遍被涂黑或改为角色对象,滥用联系人通常保留。要判断可信度应看创建时间、状态码、解析与路由是否一致,而不是看个人信息。