第5章:网络通信故障排查常用命令
对齐原书第 5 章:ifconfig、ping、telnet、netstat、lsof、nc、curl 与 tcpdump,建立可证伪的分层排障流程。
学习目标
- 能设计从 interface、route、reachability、listener、process、application 到 packet 的最小排障命令链,并为每步写出可证伪 hypothesis
- 能比较 ifconfig/ip、ping、telnet/nc、netstat/ss、lsof 与 curl 的观察边界,把 socket tuple、TCP state、PID/fd 和应用响应对齐
- 能写出受限 tcpdump BPF filter,分析 handshake、RST、retransmission 和时序,同时控制 pcap 敏感数据与权限风险
为什么“把所有命令都跑一遍”不是排障
命令只产生观察,排障需要 hypothesis。ping 成功不能证明 TCP port 可用,nc 连通不能证明 HTTP 正确,curl 200 也不能说明其他客户端路径没有 packet loss。每一步都应回答一个问题,并决定下一步,而不是堆积互不关联的输出。
先预测“connection refused”“connect timeout”“HTTP 503”分别最接近哪一层,再切换下图,看命令顺序是否在最早可证伪处收敛。
从症状选择第一条假设
5.1 ifconfig:接口地址、状态与计数器
ifconfig -a 可查看 interface、IPv4/IPv6 address、flags、MTU 和 RX/TX counters;现代 Linux 更常用 ip -br addr、ip link -s 与 ip route,信息更完整。排查时确认 interface 是否 UP、地址/prefix 是否正确、route 选中的 source 是否符合预期,并比较 drop/error counter 的时间增量。
ip -br addr
ip -s link show dev eth0
ip route get 10.0.0.9
# 兼容旧环境
ifconfig -a容器/namespace 中的 lo、veth 和 route 与 host 不同。必须在故障流量实际所在 namespace 执行命令。
5.2 ping:ICMP 往返不是应用健康
ping 观察 ICMP echo reply、round-trip time、loss 和 TTL,可快速验证 DNS 解析后的 IP 与基本 L3 reachability。但 firewall 可能禁 ICMP 而允许 TCP,也可能 ICMP 正常而 application port 被拒绝。
ping -c 5 -W 1 10.0.0.9
ping -M do -s 1472 -c 3 10.0.0.9 # Linux IPv4 path-MTU probe5.3 telnet:交互式 TCP 明文探测
telnet host port 可验证 TCP connect,并手工输入简单明文协议;它不验证 TLS certificate、HTTP redirect 或结构化 payload。连接后出现空白只说明 session 建立,不代表 server 已正确响应。
telnet 10.0.0.9 8080
GET /health HTTP/1.1
Host: service.example
Connection: close
不要把 production credentials 输入 telnet;终端 history、proxy 和 capture 都可能保留明文。
5.4 netstat/ss:tuple、state 与 queue
netstat -lntp 展示 listener,netstat -ant 展示 TCP states;现代 Linux 通常用更快的 ss -lntp、ss -ant 和 ss -ti。关注 local/peer tuple、LISTEN/ESTABLISHED/SYN-SENT/TIME-WAIT、Recv-Q/Send-Q、timer 与 retransmission 信息。
选择目标 TCP state 与端口
5.5 lsof:从端口找到进程与文件描述符
lsof -nP -iTCP:8080 -sTCP:LISTEN 把 endpoint 映射到 command、PID、user 和 fd;-nP 避免 DNS/service-name lookup 干扰。权限不足时可能看不到其他 user 的 process,空输出不一定证明没有 owner。
sudo lsof -nP -iTCP:8080 -sTCP:LISTEN
sudo lsof -nP -a -p 4242 -iTCP
readlink /proc/4242/exePID 可能重用;incident 记录还要保存 process start time、executable path、container/pod identity 与 binary build-id。
5.6 nc:可脚本化的 TCP/UDP 探针
nc -vz -w 3 host port 做 TCP connect probe,nc -l 可建立临时 listener,nc -u 可发送 UDP datagram。不同 nc 实现参数有差异,脚本先记录版本。UDP “发送成功”只表示 datagram 交给本机 kernel,不证明对端收到。
nc -vz -w 3 10.0.0.9 8080
printf 'PING\r\n' | nc -w 2 10.0.0.9 6379
nc -l 127.0.0.1 90905.7 curl:拆分 DNS、connect、TLS、TTFB 与 body
curl -v 展示解析、connect、TLS 和 headers;--resolve 可固定 hostname 到指定 IP,同时保留 Host/SNI;-w 输出分阶段 timing。使用 -k 跳过证书验证会改变结论,不能把它作为正常健康证明。
curl -sS -o /dev/null \
--connect-timeout 2 --max-time 5 \
--resolve service.example:443:10.0.0.9 \
-w 'dns=%{time_namelookup} connect=%{time_connect} tls=%{time_appconnect} ttfb=%{time_starttransfer} total=%{time_total}\n' \
https://service.example/healthheader 可能包含 bearer token、cookie 或内部 topology。分享 curl -v 输出前先脱敏,生产探测使用只读 endpoint 和最小权限身份。
5.8 tcpdump:用最小抓包证明 wire 上发生了什么
tcpdump 能观察 interface 上的 timestamp、direction、五元组、flags、sequence/ack、length 与 payload snapshot。先定义要证明 handshake、RST、retransmission 还是应用时序,再写 BPF filter;同时在 client/server 抓包可区分 packet 在哪一段丢失。
选择抓包目标与最小过滤器
sudo timeout 30 tcpdump -i any -nn -s 128 \
'host 10.0.0.9 and tcp port 8080' \
-w /secure/inc-042.pcap
tcpdump -nn -tttt -r /secure/inc-042.pcap本章回顾:让每条命令回答一个问题
- ifconfig/ip 证明 interface/address/route;ping 只证明有限的 ICMP reachability。
- telnet/nc 探测 transport;ss/netstat 说明 tuple/state/queue;lsof 说明 PID/fd owner。
- curl 把 HTTP 路径拆成 DNS/connect/TLS/TTFB/body,不能用
-k伪造健康。 - tcpdump 提供 packet-level evidence,但必须有假设、过滤器、时间窗口和数据安全边界。
- 客户端与服务端证据对齐后,才能区分请求未发、途中丢失、内核排队和应用未处理。
练习
问题 1:客户端报 connect timeout;ping 通,服务端 ss -lntp 也有 listener。下一步如何最小化取证?
问题 2:ss 显示 Send-Q 持续增长,怎样避免直接断言“网络慢”?
问题 3:怎样设计一次可分享给外部团队的 tcpdump 取证,避免泄露?
术语表
名词解释
本章出现的专业名词,用大白话再讲一遍。
- network evidence chain
- route selection
- ICMP reachability
- connection five-tuple
- socket queue evidence
- socket ownership evidence
- active port probe
- time to first byte
- BPF capture filter
- retransmission evidence