诊断工具与排障路径¶
第一步:固定问题¶
先记录:
- 失败对象:域名、IP、端口、URL 与协议。
- 时间和频率:持续失败、偶发、只在高峰出现。
- 范围:单进程、单主机、单网络还是跨地区。
- 最近变化:证书、DNS、路由、代理、系统更新、发布。
- 对照组:换网络、换设备、直接访问源站是否不同。
用一个最小请求替代复杂 GUI。例如浏览器失败时先尝试 curl -v,这样能看出失败发生在解析、连接、TLS 还是 HTTP。
本机配置与路由¶
Linux 常用:
macOS 常用:
检查接口是否启用、地址与前缀是否合理、默认路由指向哪里、目标将从哪个接口发出。127.0.0.1 只代表本机;服务只监听环回地址时,远端不能通过网卡地址访问。
DNS:名称是否得到预期答案¶
dig api.example.com A
dig api.example.com AAAA
dig @1.1.1.1 api.example.com A
dig +trace api.example.com
比较系统配置解析器与指定公共解析器可以帮助定位缓存或企业 DNS 差异,但公共解析器未必拥有内部域名视图。关注响应状态、记录类型、TTL、权威信息和返回地址。
不要把 dig 成功等价为应用一定解析相同结果。应用可能使用系统搜索域、hosts 文件、自己的缓存或加密 DNS。必要时检查应用实际连接的地址。
可达性与路径¶
macOS 和不同 Linux 工具的选项略有差异。ping 成功证明回显请求和响应在当时可达,不证明 TCP 443 可用;失败也可能只是 ICMP 被限速。traceroute 中某一跳不响应而后续跳响应,通常说明该路由器不返回探测消息,不等于流量在那里中断。
判断丢包时应看终点和业务流,而不是只看中间路由器的 ICMP 响应率。路径可能负载均衡,连续探测也可能走不同路线。
端口与传输层¶
常见结果:
| 现象 | 初步含义 | 下一步 |
|---|---|---|
立即 connection refused |
可达但无监听,或设备主动拒绝 | 查服务监听与目标端口 |
| 长时间超时 | 静默过滤、无路由、回程问题或严重丢包 | 查防火墙、路由、抓包 |
| 建连后立刻关闭 | 应用协议或访问策略不匹配 | 查服务日志与协议 |
| 偶发成功 | 负载均衡后端、路径或资源耗尽 | 分地址、分后端重复测试 |
服务端同时检查监听地址、连接队列、文件描述符和进程状态。只监听 IPv6 或只监听 127.0.0.1 都可能造成“本机能访问、远端不能”。
TLS 与证书¶
检查证书链、有效期、主机名、协商版本、ALPN 和验证返回码。-servername 提供 SNI;遗漏它可能拿到同一 IP 上的默认证书。系统时间错误会让有效证书看似过期或尚未生效。
若命令行成功而浏览器失败,比较代理、信任库、客户端证书、HSTS 和浏览器扩展。不要以 -k 跳过验证作为修复,它只掩盖身份问题。
HTTP 与应用层¶
curl -v https://api.example.com/health
curl -I https://api.example.com/static/app.js
curl -L -v https://example.com/
查看状态码、重定向位置、Host、缓存字段、内容类型与响应时间。200 也可能携带业务错误;503 常指代理没有健康上游或服务过载;301/302 循环可能来自代理协议识别错误。
用 --resolve 可在保留 URL 主机名和 TLS SNI 的同时指定测试 IP:
这能区分 DNS 调度与某个后端,但不要长期写入错误地址绕过正式服务发现。
抓包:看实际发生了什么¶
sudo tcpdump -i any -nn 'host 203.0.113.5 and port 443'
sudo tcpdump -i any -nn -w capture.pcap 'host 203.0.113.5'
macOS 常选择明确接口如 en0,Linux 的 any 便于观察多接口但链路层信息可能不同。抓包重点寻找:
- DNS 查询有没有响应,应用最终选择哪个地址。
- SYN 是否发出,SYN+ACK 是否回来,是否反复重传。
- TLS Alert 出现在握手哪一步。
- TCP 是否有重复 ACK、重传、零窗口或 RST。
- ICMP 是否报告不可达或分组过大。
抓包看到“客户端发送了 SYN”只证明分组到达抓包点;要定位路径,最好在客户端、服务端或关键中间点同时观察。TLS 加密后通常看不到 HTTP 内容,但仍能分析握手和时序。
一个完整排障例子¶
现象:域名偶尔连接超时。
dig发现域名轮询返回三个 IP。- 用
curl --resolve分别测试,只有一个 IP 超时。 - 客户端抓包显示发出 SYN 但无 SYN+ACK。
- 故障后端抓包没有看到 SYN,正常后端可看到。
- 比较路由与防火墙,发现新网段未加入入口 ACL。
- 修复 ACL 后分别测试三个 IP,再测试正常 DNS 调度。
这个过程没有一开始就重启所有服务器,而是用地址拆分把“偶发”转化为“固定后端必现”,再用双端抓包缩小到入口之前。
排障工具的限制¶
工具返回的是一次观测,不是完整真相。缓存会改变路径,负载均衡会改变后端,防火墙会对 ICMP 和 TCP 区别处理,抓包位置也可能在硬件卸载前后看到不同分段。结论应由多条相互支持的证据构成。
最短运行手册
先 dig,再 route,再测实际端口,然后验证 TLS 与 HTTP;只有现有证据无法区分假设时再抓包。每一步都记录时间和目标地址。