Linux 网络排查
Linux 网络排查按解析、连接和应用响应逐层定位。本文负责命令、抓包证据与 netfilter 路径。
1. 面试核心
先记住这几条,再读正文- 网络与业务可达性。 ping 检查 ICMP 回显,业务端口仍需独立验证。卡 · 分层确认连通性
- 监听与连接状态。
ss -lntp查看 TCP 监听,ss -Hant输出无表头连接列表。卡 · 端口与连接状态 - 连接关闭。 TIME_WAIT 保留关闭状态,CLOSE_WAIT 等待本地应用关闭。卡 · TIME_WAIT 与 CLOSE_WAIT 诊断
- 报文路径。 tcpdump 的双端抓包可缩小报文丢失范围。卡 · tcpdump 抓包
- 连接跟踪与路由。 conntrack 保存连接状态与 NAT 映射,路由表选择下一跳。卡 · iptables 规则
2. 分层确认连通性
| 层次 | 命令与证据 |
|---|---|
| DNS | dig example.com、dig @解析器 example.com |
| 路由 | ip route get 目标IP 查看出口与源地址 |
| 三层路径 | ping、traceroute、mtr |
| TCP 端口 | nc -zv host 443 |
| TLS 与 HTTP | curl -v https://example.com |
| 本机监听 | ss -lntp 查看地址、端口与进程 |
| 防火墙 | 按实际后端检查 iptables 或 nftables 规则 |
ping 发送 Echo Request,并等待 Echo Reply。time 是往返时间,ttl 是响应包的剩余跳数。初始 TTL 未知时,无法精确推算路径跳数。
序号缺口需结合最终统计判断。抓取时尚未返回的响应也会形成暂时缺口。ICMP 被过滤时,业务 TCP 连接仍能正常工作。
TCP 连接还依赖监听地址、端口及路径策略。只监听 127.0.0.1 的服务只能接受本机回环访问。排查应按实际源地址与目的地址验证。
3. 端口与连接状态
ss -lntp 'sport = :8080'
lsof -nP -iTCP:8080 -sTCP:LISTEN
ss -s
ss -Hant | awk '{print $1}' | sort | uniq -c | sort -nr
ss -Hant state time-wait | wc -l
精确端口过滤避免把 18080 等端口混入。-H 去掉表头,计数时只统计连接。查看其他用户的进程信息需要相应权限。
| 状态 | 排查方向 |
|---|---|
| LISTEN | 地址、端口与监听队列 |
| SYN-RECV | 握手未完成、丢包与 SYN 请求压力 |
| ESTABLISHED | 活跃连接及收发队列 |
| CLOSE-WAIT | 本地关闭路径与阻塞线程 |
| TIME-WAIT | 短连接速率、端口与内存压力 |
4. TIME_WAIT 与 CLOSE_WAIT 诊断
TIME_WAIT 的协议作用和复用条件见 TCP 连接。本篇只处理现场定位。
先确认主动关闭端、目标分布和连接创建速率。短连接多时,检查客户端连接池及代理上游复用。端口不足需结合临时端口范围和目标四元组判断。
Nginx 上游连接复用可显式配置 HTTP/1.1 与 keepalive。是否复用仍取决于请求头和对端行为。配置方式见 Nginx 与负载均衡。
持续 CLOSE_WAIT 表示本地发送方向尚未关闭。先用 ss -antp state close-wait 定位进程和对端。再检查异常分支、流关闭逻辑与线程栈。应用有意半关闭时,也需核对其业务期限。
5. tcpdump 抓包
tcpdump -i eth0 -nn 'host 10.0.0.2 and tcp port 8080' -c 1000 -w a.pcap
tcpdump -i any -nn 'tcp port 443 and (tcp[tcpflags] & (tcp-syn|tcp-fin|tcp-rst) != 0)'
tcpdump -nn -r a.pcap
-i 指定接口,-nn 关闭名称解析。-c 限制数量,-w 保存原始包。-r 读取已有文件。-s 控制截取长度,-s 0 使用工具支持的最大默认长度。
| 现象 | 证据边界 |
|---|---|
| 只有 SYN | 尚未看到应答,需继续查目标与回程 |
| 收到 RST | 对端或中间设备主动拒绝或复位 |
| SYN 重传 | 发送方等待确认,需区分去程与回程丢失 |
| 接收窗口趋近零 | 接收端提供的缓冲空间不足 |
单端抓包无法确认包在哪里丢失。双端对比能区分请求未达和响应未返。时间间隔还会受处理延迟、抓包丢失与卸载影响。应结合序列号、重传和工具丢包统计。
6. iptables 规则
iptables 配置 netfilter 规则。内核在网络路径中提供多个 hook。
| 内建链 | 主要路径位置 |
|---|---|
| PREROUTING | 入站后的路由判断前 |
| INPUT | 送往本机进程 |
| FORWARD | 经本机转发 |
| OUTPUT | 本机进程发包 |
| POSTROUTING | 出站前 |
| 表 | 作用 |
|---|---|
| filter | 过滤与放行 |
| nat | DNAT、SNAT 和 MASQUERADE |
| mangle | 修改标记、TTL 等字段 |
| raw | 在连接跟踪前处理 |
| security | 强制访问控制相关规则 |
同一 hook 的表按内核优先级执行。每条链内再按规则顺序匹配。ACCEPT 结束当前相关过滤处理。后续 hook 仍可丢弃报文。
NAT 规则主要为连接首包建立映射。后续包按 conntrack 保存的映射转换。修改 NAT 规则后,已有连接仍会使用旧映射。
kube-proxy 的 iptables 模式用 DNAT 选择后端。其他代理模式的数据路径不同。模式选择和集群网络见 工作负载、Service 与集群网络。
7. DNS、TLS 与 HTTP 耗时
curl 的 time 字段多为从请求开始累计的时间。
curl -sS -o /dev/null --connect-timeout 3 --max-time 10 \
-w 'dns=%{time_namelookup} tcp=%{time_connect} tls=%{time_appconnect} first=%{time_starttransfer} total=%{time_total}\n' \
https://example.com/
curl --resolve example.com:443:192.0.2.10 https://example.com/
一次新的直连 HTTPS 请求可用相邻时间差定位阶段。TCP 时间用 time_connect 减 time_namelookup。TLS 时间用 time_appconnect 减 time_connect。首字节时间还包含请求传输与服务端处理。
重定向、代理和连接复用会改变解释方式。排查时应先固定访问路径。
--resolve 指定连接地址,并保留域名语义。HTTP Host、TLS SNI 与证书校验仍使用原域名。仅访问 IP 再修改 Host,会遗漏 TLS 名称差异。
8 · 面试题卡片
本页题目与参考回答
8.1 怎样查看某个端口被哪个进程监听?怎样统计服务器上各状态(TIME_WAIT、ESTABLISHED 等)的连接数?
考察重点
ss、lsof的常用参数。- 用管道统计状态;各状态的含义。
相关内容:端口与连接状态。
参考回答
监听 8080 可用 ss -lntp 'sport = :8080'。
-l 选监听,-t 选 TCP,-p 显示进程。-n 关闭名称解析。其他用户进程信息需要相应权限。
统计状态可用 ss -Hant | awk '{print $1}' | sort | uniq -c。-H 去掉表头,避免计数多一行。再按对端、端口和时间趋势缩小异常范围。
8.2 TIME_WAIT 和 CLOSE_WAIT 是什么?服务器上这两种状态过多分别是什么原因,怎样处理?
考察重点
- 两个状态分别出现在主动关闭和被动关闭的一方。
- 结合资源压力判断 TIME_WAIT,并检查 CLOSE_WAIT 关闭路径。
相关内容:TIME_WAIT 与 CLOSE_WAIT 诊断、TCP 连接。
参考回答
TIME_WAIT 保留关闭状态,CLOSE_WAIT 等待应用关闭。
协议细节与内核参数见 TCP 连接。
TIME_WAIT 多时先确认短连接和实际资源压力。检查应用连接池及 Nginx 上游 keepalive。Nginx 可显式配置 HTTP/1.1,配合上游连接复用。
CLOSE_WAIT 持续堆积时,定位进程和对端。再检查关闭路径、异常分支及阻塞线程。半关闭业务也应有完成期限。
8.3 能 ping 通对方 IP,是否说明业务端口一定是通的?ping 的原理是什么,怎样确认端口连通?
考察重点
- ICMP 与 TCP 端口是不同的检查;ping 输出各字段的含义。
- 分层排查的工具;端口不通的常见原因。
相关内容:分层确认连通性。
参考回答
ping 通只能确认 ICMP 回显路径。
业务端口还依赖 TCP 监听与路径规则。nc -zv B 3389 可验证 TCP 建连。HTTP 服务需继续用 curl 验证响应。
ping 的 time 是往返时间,ttl 是剩余跳数。序号和最终统计帮助确认丢包。端口不通时,检查监听地址、防火墙与安全组。再用两端抓包定位去程和回程。
8.4 用 tcpdump 抓 TCP 握手时会用哪些参数?抓包后关注哪些字段?
考察重点
- 网卡、过滤表达式、不解析名称、写文件等参数。
- 从标志位、序列号和时间间隔判断问题位置。
相关内容:tcpdump 抓包。
参考回答
用接口、地址和端口过滤缩小抓包范围。
例如 tcpdump -i eth0 -nn 'tcp port 8080' -c 1000 -w a.pcap。-nn 避免解析干扰,-c 限制数量。
分析 SYN、ACK、FIN、RST 和序列号。只有 SYN 表示当前抓包未看到应答。它不足以确定目标未监听。对比双端抓包,再检查回程路由和策略。接收窗口、重传和时间间隔提供进一步线索。
8.5 iptables 的原理是什么?有哪些表和链?工作在网络的哪一层?Kubernetes 中哪里用到了 DNAT?
考察重点
- netfilter 的五个挂载点与常用表的用途。
- 工作层次与连接跟踪;kube-proxy 的 DNAT 与 IPVS 的区别。
相关内容:iptables 规则。
参考回答
iptables 配置 netfilter 的过滤与转换规则。
五条主要内建链对应入站、本地和转发路径。filter 用于过滤,nat 用于地址转换。mangle 修改报文属性,raw 在连接跟踪前处理。
规则可匹配 IP、端口和连接状态。这些匹配覆盖网络层与传输层。conntrack 保存状态及 NAT 映射。路由表则选择下一跳和出口。
Kubernetes 的 iptables 代理模式用 DNAT 转到端点。IPVS 等模式有各自实现。
8.6 怎样区分 DNS、TLS 与应用响应慢?为什么只改 Host 头还不够?
考察重点:累计时间差、SNI 与指定解析。
相关内容:DNS、TLS 与 HTTP 耗时。
参考回答
先用 curl 的 time 字段区分请求阶段。
新建直连 HTTPS 可通过相邻时间差估算耗时。首字节时间包含请求传输和服务端处理。访问 IP 只改 Host,TLS SNI 仍会不同。使用 --resolve 可固定 IP,同时保留域名与证书校验。