Linux 网络配置与故障排查完全指南
一、引言:为什么你需要掌握这些工具?
在 Linux 服务器的日常运维中,网络问题占据了故障案例的半壁江山——服务不可用、连接超时、响应缓慢、丢包严重……问题表现形式千变万化,但背后的根源往往集中在有限的几个层面。
过去的网络排查依赖于 ifconfig、netstat、route、arp 等传统工具集。然而,这些工具在当今大规模、高性能的网络环境下逐渐暴露短板:netstat 在处理数万条连接时性能骤降,ifconfig 无法完整展示 VRF、网络命名空间等现代网络特性。
新一代的 iproute2 套件(包含 ip、ss、tc、bridge 等工具)应运而生,它不仅统一了网络配置的入口,更在性能和功能上全面超越了传统工具。tcpdump 作为抓包分析的神器,则能让你"看见"线路上真实流动的数据包,是定位疑难杂症的终极武器。
本文的目标:不仅教会你每个命令怎么用,更要让你理解——在什么样的场景下该用什么工具,如何从现象推演到根因,以及如何用组合拳快速定位生产环境中的网络问题。
二、Linux 网络配置与故障排查全景图
在深入每个工具之前,先用一张全景图建立整体认知:
| 排查层面 | 核心工具 | 主要用途 | 判断标准 |
|---|---|---|---|
| 物理层 | ip link、ethtool |
检查网卡状态、速率、双工模式 | 状态为 UP,速率正常 |
| 网络层 | ip addr、ip route、ping |
检查 IP 配置、路由表、基本连通性 | IP 正确,路由可达 |
| DNS 层 | dig、nslookup、host |
域名解析是否正常 | 返回正确 IP |
| 传输层 | ss、nc、telnet |
检查端口监听、连接状态 | 端口 LISTEN,连接 ESTABLISHED |
| 防火墙层 | iptables、firewalld、nft |
检查包过滤规则 | 规则允许目标流量 |
| 应用层 | curl、tcpdump、Wireshark |
验证服务响应、抓包深度分析 | 返回预期内容 |
排查故障时,自下而上是最稳妥的路径:从物理链路开始,逐层向上验证,每一层确认无误后再进入下一层。切忌在物理层还没确认时就一头扎进应用层抓包分析。
三、ip 命令详解:现代 Linux 网络配置的瑞士军刀
ip 命令是 iproute2 套件的核心工具,它统一了传统 ifconfig、route、arp、netstat -i 等命令的功能,提供了更强大、更一致的管理接口。
3.1 命令语法与核心对象
text
ip [ OPTIONS ] OBJECT { COMMAND | help }
其中 OBJECT 是 ip 操作的核心对象,常见的有:
| 对象 | 简写 | 用途 |
|---|---|---|
link |
l |
网络设备(网卡)配置与管理 |
address |
addr / a |
IP 地址管理 |
route |
r |
路由表管理 |
neigh |
n |
ARP/NDP 邻居表管理 |
netns |
ns |
网络命名空间管理 |
rule |
ru |
策略路由规则管理 |
maddress |
m |
组播地址管理 |
tunnel |
t |
隧道配置 |
3.2 常用选项
| 选项 | 作用 |
|---|---|
-s / -stats |
显示更详细的统计信息 |
-d / -details |
显示详细信息 |
-h / -human |
人类可读格式输出 |
-j / -json |
JSON 格式输出(便于脚本处理) |
-p / -pretty |
美化的 JSON 输出 |
-br / -brief |
精简输出(一行一个接口) |
-4 |
仅操作 IPv4 |
-6 |
仅操作 IPv6 |
-o / -oneline |
每条记录输出到一行 |
-c / -color |
彩色输出 |
3.3 ip link — 网络设备管理
查看所有网络接口
bash
$ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 08:00:27:f1:77:7e brd ff:ff:ff:ff:ff:ff
每个接口输出包含:
-
标志位:
<UP>表示接口已启用,LOWER_UP表示物理层有信号 -
MTU:最大传输单元
-
qdisc:排队规则(队列管理算法)
-
state:
UP/DOWN/UNKNOWN/DORMANT -
MAC 地址(
link/ether)
精简模式(一行一个接口,非常实用):
bash
$ ip -br link show lo UNKNOWN 00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP> eth0 UP 08:00:27:f1:77:7e <BROADCAST,MULTICAST,UP,LOWER_UP>
启用/禁用网络接口
bash
$ sudo ip link set eth0 up # 启用网卡 $ sudo ip link set eth0 down # 禁用网卡
禁用接口后,接口标志位中的 UP 会消失,变为 <BROADCAST,MULTICAST>。
修改 MTU 与队列长度
bash
$ sudo ip link set eth0 mtu 1400 # 设置 MTU 为 1400 $ sudo ip link set eth0 txqueuelen 2000 # 设置发送队列长度
降低 MTU 常用于解决"黑洞 MTU"问题——当路径中某个路由器 MTU 较小而数据包携带 DF 标记时,会导致丢包。ping -M do -s 1472 可探测路径 MTU。
启用/关闭混杂模式
bash
$ sudo ip link set eth0 promisc on # 启用混杂模式 $ sudo ip link set eth0 promisc off # 关闭混杂模式
混杂模式让网卡接收所有经过它的数据包(不仅限于发往本机 MAC 的包),是抓包分析的必要前置条件。
3.4 ip address — IP 地址管理
查看 IP 地址配置
bash
$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.1.10/24 brd 192.168.1.255 scope global eth0
valid_lft forever preferred_lft forever
更常用的精简模式:
bash
$ ip -4 -br addr show lo UNKNOWN 127.0.0.1/8 eth0 UP 192.168.1.10/24
添加/删除 IP 地址
bash
$ sudo ip addr add 192.168.1.10/24 dev eth0 # 添加主 IP $ sudo ip addr add 192.168.1.11/24 dev eth0 label eth0:1 # 添加别名 IP $ sudo ip addr del 192.168.1.10/24 dev eth0 # 删除 IP
清除所有 IP 地址
bash
$ sudo ip addr flush dev eth0 # 清空 eth0 上所有 IP
3.5 ip route — 路由表管理
查看路由表
bash
$ ip route show default via 192.168.1.1 dev eth0 proto dhcp metric 100 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.10 metric 100
添加/删除静态路由
bash
$ sudo ip route add 10.0.0.0/8 via 192.168.1.254 dev eth0 # 添加网段路由 $ sudo ip route add default via 192.168.1.254 # 添加默认网关 $ sudo ip route del 10.0.0.0/8 # 删除路由 $ sudo ip route del default # 删除默认网关
特殊路由操作
bash
$ sudo ip route add blackhole 192.168.100.0/24 # 黑洞路由(丢弃流量) $ sudo ip route add prohibit 10.0.0.0/8 # 返回 ICMP 禁止 $ sudo ip route get 8.8.8.8 # 查询某 IP 的路由决策
ip route get 非常实用——它会告诉你内核实际会从哪个接口、使用哪个源 IP 去访问目标地址,排除了路由策略的猜测误差。
3.6 ip neigh — ARP 邻居表管理
bash
$ ip neigh show 192.168.1.1 dev eth0 lladdr 00:11:22:33:44:55 REACHABLE 192.168.1.2 dev eth0 lladdr aa:bb:cc:dd:ee:ff STALE
邻居状态含义:
-
REACHABLE:确认可达,正常 -
STALE:上次确认后超过可达时间,不确定是否仍可达 -
DELAY:等待确认中 -
PROBE:正在主动探测 -
FAILED:解析失败 -
INCOMPLETE:ARP 请求已发出但未收到响应
3.7 ip netns — 网络命名空间
网络命名空间是容器网络的核心基础技术,允许在同一台主机上创建多个相互隔离的网络栈。
bash
$ sudo ip netns add ns1 # 创建命名空间 $ sudo ip netns exec ns1 ip addr show # 在 ns1 中执行命令 $ sudo ip link set eth0 netns ns1 # 将 eth0 移入 ns1 $ sudo ip netns delete ns1 # 删除命名空间
四、ss 命令详解:高性能 Socket 统计工具
ss(Socket Statistics)是 iproute2 套件的另一核心工具,用于转储 Socket 统计信息。它直接读取内核数据结构,不经过用户空间程序转换,因此在大规模连接场景下性能远超 netstat。
4.1 核心选项
| 选项 | 作用 |
|---|---|
-a / --all |
显示所有 Socket(包括监听和非监听) |
-l / --listening |
仅显示监听状态的 Socket |
-t |
仅显示 TCP Socket |
-u |
仅显示 UDP Socket |
-x |
仅显示 UNIX Domain Socket |
-4 |
仅 IPv4 |
-6 |
仅 IPv6 |
-n / --numeric |
不解析服务名(显示端口号而非服务名) |
-r / --resolve |
尝试解析域名 |
-p / --processes |
显示进程 PID 和名称 |
-e / --extended |
显示扩展信息(UID、Inode、Socket Cookie 等) |
-o / --options |
显示计时器信息(重传计时器、保活计时器、TIME_WAIT 计时器等) |
-s / --summary |
显示协议级别的统计摘要 |
-i / --info |
显示 TCP 内部信息(RTT、拥塞窗口、MSS 等) |
-m / --memory |
显示 Socket 内存使用情况 |
-H / --no-header |
不显示表头(便于脚本处理) |
4.2 查看所有 TCP 连接
bash
$ ss -t -a State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:22 *:* ESTAB 0 0 192.168.1.10:54322 93.184.216.34:80
Recv-Q / Send-Q 的含义:
-
LISTEN 状态:
Recv-Q表示已完成的连接等待队列长度,Send-Q表示 backlog 最大值 -
非 LISTEN 状态:
Recv-Q是已收到但未被应用读取的数据量;Send-Q是已发送但未被对方确认的数据量
4.3 常用组合命令
bash
$ ss -tuln # 显示所有 TCP/UDP 监听端口(不解析服务名) $ ss -tlnp # 显示 TCP 监听端口及对应进程(最常用) $ ss -tanp # 显示所有 TCP 连接及进程 $ ss -tunlp # TCP + UDP 监听端口 + 进程 $ ss -t -a -o # 显示所有 TCP 连接及计时器信息 $ ss -t -a -i # 显示所有 TCP 连接及内部信息
4.4 过滤器与状态筛选
ss 支持按多种条件过滤连接:
bash
$ ss -t state established # 仅 ESTABLISHED 状态的连接 $ ss -t state listening # 仅 LISTEN 状态的连接 $ ss -t state time-wait # 仅 TIME_WAIT 状态的连接 $ ss -t state fin-wait-1 # FIN_WAIT_1 状态
按目标端口/地址过滤:
bash
$ ss -t dst :80 # 目标端口 80 $ ss -t dst 192.168.1.100 # 目标 IP $ ss -t src :22 # 源端口 22
4.5 TCP 内部信息详解(-i 选项)
bash
$ ss -t -a -i
ESTAB 0 0 192.168.1.10:45678 93.184.216.34:443
cubic wscale:7,7 rto:204 rtt:0.75/0.375 ato:40 cwnd:10 bytes_acked:21374 segs_out:210 segs_in:239 send 1050.2Mbps lastsnd:13 lastrcv:13 lastack:13 pacing_rate 2100.4Mbps delivered:210 app_limited busy:13ms
输出解读(部分关键字段):
| 字段 | 含义 |
|---|---|
cubic |
拥塞控制算法 |
wscale:7,7 |
窗口缩放因子(7 表示实际窗口 × 128) |
rto:204 |
重传超时时间(ms) |
rtt:0.75/0.375 |
平均 RTT / RTT 偏差(ms) |
cwnd:10 |
拥塞窗口大小(单位:MSS) |
pacing_rate |
内核尝试维持的发送速率 |
4.6 内存使用查看(-m 选项)
bash
$ ss -t -a -m
ESTAB 0 0 192.168.1.10:45678 93.184.216.34:443
skmem:(r0,rb131072,t0,tb87040,f0,w0,o0,bl0,d0)
skmem 字段解读:
-
r:读队列中的数据量 -
rb:接收缓冲区大小 -
t:写队列中的数据量 -
tb:发送缓冲区大小 -
f:已排队但尚未发送的数据量 -
o:已发送但未确认的数据量
4.7 统计摘要(-s)
bash
$ ss -s Total: 1024 (kernel 0) TCP: 342 (estab 45, closed 280, orphaned 0, timewait 275) Transport Total IP IPv6 RAW 0 0 0 UDP 12 8 4 TCP 62 52 10 INET 74 60 14 FRAG 0 0 0
这个命令能快速评估系统 Socket 资源的整体状况,尤其关注 timewait 的数量——过多的 TIME_WAIT 可能表明应用频繁短连接。
五、netstat vs ss:全面对比与迁移指南
5.1 核心差异
| 对比维度 | netstat |
ss |
|---|---|---|
| 所属包 | net-tools |
iproute2 |
| 数据来源 | 遍历 /proc 文件系统 |
直接读取内核 netlink 接口 |
| 性能(万级连接) | 缓慢,CPU 消耗高 | 快速,几乎无性能衰减 |
| 输出详细程度 | 基础信息 | 更丰富的 TCP 状态信息 |
| 输出格式 | 人类友好 | 可选 JSON,适合脚本 |
| 过滤能力 | 有限 | 强大(状态、端口、地址组合过滤) |
性能差异的根本原因:netstat 需要遍历 /proc/net/tcp 等虚拟文件,每条连接都要进行用户态-内核态的上下文切换和数据解析;而 ss 通过 netlink 直接从内核读取数据结构,一次性获取所有信息,效率高出数倍。
5.2 命令对照表(从 netstat 迁移到 ss)
| 需求 | netstat 命令 |
ss 命令 |
|---|---|---|
| 查看所有连接 | netstat -a |
ss -a |
| 查看 TCP 监听 | netstat -tln |
ss -tln |
| 查看所有 TCP 连接 + 进程 | netstat -antp |
ss -antp |
| 查看所有 UDP 监听 | netstat -uln |
ss -uln |
| 查看协议统计 | netstat -s |
ss -s |
| 查看接口统计 | netstat -i |
ip -s link |
| 查看路由表 | netstat -r |
ip route |
| 查看端口占用 | netstat -tlnp | grep :80 |
ss -tlnp | grep :80 |
实际案例对比:在一台拥有 50000 条 TCP 连接的服务器上,netstat -antp 执行时间可能超过 30 秒,而 ss -antp 通常在 1 秒内完成。
六、tcpdump 深度实战:让网络流量"可视化"
tcpdump 是基于 libpcap 的命令行抓包工具,能实时捕获经过指定网络接口的数据包并进行分析。它是 Linux 网络故障排查中最后的"真相仲裁者"——当上层工具无法定位问题时,抓包分析往往能一锤定音。
6.1 安装与基础语法
bash
# Debian/Ubuntu $ sudo apt install tcpdump # CentOS/RHEL $ sudo yum install tcpdump
基础语法结构:
text
tcpdump [选项] [过滤表达式]
6.2 核心选项详解
| 选项 | 作用 | 示例 |
|---|---|---|
-i |
指定监听的网络接口 | -i eth0 |
-c |
捕获指定数量的数据包后停止 | -c 100 |
-w |
将原始数据包写入文件(.pcap 格式) | -w capture.pcap |
-r |
从 pcap 文件读取并分析 | -r capture.pcap |
-n |
不解析主机名(显示 IP) | 加快输出 |
-nn |
不解析主机名和端口名 | 最快输出 |
-v/-vv/-vvv |
增加输出详细程度 | 逐步深入调试 |
-s |
设置抓取的数据包长度(字节),-s 0 表示抓取完整包 |
-s 1500 |
-e |
显示数据链路层头部(MAC 地址) | 二层问题排查 |
-A |
以 ASCII 格式显示包内容 | 应用层文本协议分析 |
-X |
以十六进制和 ASCII 混合格式显示 | 二进制协议分析 |
-tttt |
显示人类可读的时间戳(精确到微秒) | 时序问题分析 |
6.3 BPF 过滤表达式详解
tcpdump 使用 BPF(Berkeley Packet Filter)语法,过滤表达式极其灵活,可以在内核层面提前过滤数据包,极大降低 CPU 开销。
按主机过滤
bash
$ sudo tcpdump -i eth0 host 192.168.1.100 # 源或目标为此 IP $ sudo tcpdump -i eth0 src 192.168.1.100 # 源 IP $ sudo tcpdump -i eth0 dst 192.168.1.100 # 目标 IP $ sudo tcpdump -i eth0 not host 192.168.1.100 # 排除此 IP
按端口过滤
bash
$ sudo tcpdump -i eth0 port 80 # 端口 80(源或目标) $ sudo tcpdump -i eth0 src port 80 # 源端口 80 $ sudo tcpdump -i eth0 dst port 443 # 目标端口 443 $ sudo tcpdump -i eth0 portrange 8000-8080 # 端口范围
按协议过滤
bash
$ sudo tcpdump -i eth0 tcp # 仅 TCP $ sudo tcpdump -i eth0 udp # 仅 UDP $ sudo tcpdump -i eth0 icmp # 仅 ICMP $ sudo tcpdump -i eth0 arp # 仅 ARP
按网段过滤
bash
$ sudo tcpdump -i eth0 net 192.168.1.0/24 # 此网段的流量 $ sudo tcpdump -i eth0 src net 10.0.0.0/8 and dst net 172.16.0.0/12
逻辑组合
bash
$ sudo tcpdump -i eth0 'tcp port 80 or tcp port 443' # 或 $ sudo tcpdump -i eth0 'tcp port 80 and src 192.168.1.1' # 且 $ sudo tcpdump -i eth0 'not arp and not icmp' # 排除 ARP 和 ICMP
高级过滤(TCP 标志位)
bash
$ sudo tcpdump -i eth0 'tcp[13] & 0x02 != 0' # SYN 包 $ sudo tcpdump -i eth0 'tcp[13] & 0x10 != 0' # ACK 包 $ sudo tcpdump -i eth0 'tcp[13] == 0x12' # SYN-ACK 包(SYN+ACK) $ sudo tcpdump -i eth0 'tcp[13] == 0x11' # FIN-ACK 包
理解 TCP 标志位偏移:TCP 头部第 13 字节(从 0 计数)包含标志位。
tcp[13] & 0x02 != 0即检查第 2 位(SYN)是否为 1。
6.4 实战场景命令
基础捕获
bash
$ sudo tcpdump -i eth0 -c 100 -w capture.pcap # 抓 100 个包保存 $ sudo tcpdump -i eth0 -nn -e # 显示 MAC 地址,不解析名称 $ sudo tcpdump -i eth0 -A -s 0 | head -50 # 查看应用层数据(前 50 行)
Web 流量分析
bash
$ sudo tcpdump -i eth0 -nn -A 'tcp port 80' # 查看 HTTP 请求/响应内容 $ sudo tcpdump -i eth0 'tcp port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420' # 仅捕获 HTTP GET 请求(0x47455420 = "GET ")
排查重传与丢包
bash
$ sudo tcpdump -i eth0 'tcp[13] & 0x04 != 0' # RST 包(连接重置) $ sudo tcpdump -i eth0 'tcp[13] & 0x01 != 0' # FIN 包(连接关闭) $ sudo tcpdump -i eth0 'tcp[13] & 0x02 != 0' # SYN 包(新连接)
过滤出非本地流量
bash
$ sudo tcpdump -i eth0 not host 192.168.1.10 # 排除本机 IP
七、TCP 状态详解:读懂连接的生命周期
理解 TCP 状态转移是排查网络问题的基础。当服务端口无法访问时,通过 ss -tlnp 查看端口是否处于 LISTEN 状态;当连接异常增多时,分析各种状态的比例往往能快速定位问题根因。
7.1 完整 TCP 状态图
TCP 连接的双方在任一时刻都处于以下 11 种状态之一:
| 状态 | 含义 | 出现位置 |
|---|---|---|
CLOSED |
初始状态,无活动连接 | 任意 |
LISTEN |
服务端等待连接 | 服务端 |
SYN_SENT |
已发送 SYN,等待 SYN+ACK | 客户端 |
SYN_RECV |
收到 SYN,已发 SYN+ACK,等待 ACK | 服务端 |
ESTABLISHED |
连接已建立,数据传输中 | 双方 |
FIN_WAIT_1 |
主动关闭方发出 FIN 后 | 主动关闭方 |
FIN_WAIT_2 |
收到 ACK 后,等待对方 FIN | 主动关闭方 |
CLOSE_WAIT |
被动关闭方收到 FIN,等待应用关闭 | 被动关闭方 |
LAST_ACK |
被动关闭方发出 FIN 后,等待 ACK | 被动关闭方 |
TIME_WAIT |
主动关闭方收到 FIN+ACK 后,等待 2MSL | 主动关闭方 |
CLOSING |
双方同时发出 FIN | 双方 |
7.2 三次握手建立连接
-
客户端 → 服务端:
SYN(状态:客户端进入SYN_SENT) -
服务端 → 客户端:
SYN+ACK(状态:服务端从LISTEN进入SYN_RECV) -
客户端 → 服务端:
ACK(双方进入ESTABLISHED)
7.3 四次挥手断开连接
-
主动关闭方 → 被动关闭方:
FIN(状态:主动方ESTABLISHED→FIN_WAIT_1) -
被动关闭方 → 主动关闭方:
ACK(状态:主动方FIN_WAIT_1→FIN_WAIT_2;被动方ESTABLISHED→CLOSE_WAIT) -
被动关闭方 → 主动关闭方:
FIN(状态:被动方CLOSE_WAIT→LAST_ACK) -
主动关闭方 → 被动关闭方:
ACK(状态:主动方FIN_WAIT_2→TIME_WAIT;被动方LAST_ACK→CLOSED)
7.4 状态异常排查
大量 TIME_WAIT:主动关闭方在发送 FIN 后需等待 2 倍 MSL(通常 60 秒)。过多 TIME_WAIT 表明应用频繁创建和关闭短连接(如短连接 HTTP/1.0 未使用 Keep-Alive)。
大量 CLOSE_WAIT:被动关闭方收到 FIN 后应用层未调用 close(),通常是应用 bug 导致 socket 泄露。使用 ss -tanp | grep CLOSE-WAIT 找出问题进程。
大量 SYN_RECV:可能遭受 SYN Flood 攻击,检查 netstat -s | grep "SYNs to LISTEN" 统计。
大量 FIN_WAIT_2:主动关闭方发出 FIN 后未收到对方 ACK,可能对方网络不通或进程僵死。
八、生产环境排错案例
案例一:端口监听正常但无法访问
现象:Nginx 服务在 80 端口监听(ss -tlnp | grep :80 显示 LISTEN),但客户端 curl 超时。
排查思路:
-
本地自检:
curl -v localhost:80正常返回 → 服务本身无问题 -
防火墙检查:
iptables -L -n -v | grep 80发现 DROP 规则 → 问题定位 -
解决:添加放行规则
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
关键洞察:服务监听成功不等于外部可访问,防火墙、安全组、SELinux 都是常见的"隐形拦截者"。
案例二:连接数过高导致服务响应慢
现象:业务高峰期应用响应时间从 50ms 飙升到 5s,数据库连接池频繁超时。
排查思路:
-
统计摘要:
ss -s显示Total: 524288(超过系统限制) -
查看连接状态分布:
ss -tan | awk '{print $1}' | sort | uniq -c发现大量TIME_WAIT -
问题根因:应用使用短连接模式,每次请求新建连接并关闭,产生海量 TIME_WAIT 耗尽端口资源
-
解决方案:
-
短期调优:
sysctl -w net.ipv4.tcp_tw_reuse=1允许复用 TIME_WAIT 连接 -
长期:应用改用连接池或 HTTP Keep-Alive
-
案例三:抓包定位 TCP 重传问题
现象:跨地域业务偶发超时,客户端日志显示 connection timeout,频率约 5%。
排查思路:
-
ss -ti查看活跃连接,发现大量rto:204(重传超时)和retrans:3 -
抓包分析:
tcpdump -i eth0 -nn host 目标IP -w retrans.pcap -
用 Wireshark 分析,Statistics → TCP StreamGraph → Time-Sequence Graph,观察到大量重复 ACK 和快速重传
-
问题根因:网络路径中存在丢包,但重传恢复正常
-
解决方案:调整内核参数
net.ipv4.tcp_retries2(控制重传次数)并联系网络团队排查链路质量
案例四:网络服务启动失败排查
现象:重启服务器后,systemctl restart network 失败,ip addr 无 IP 地址。
排查思路:
-
检查网络服务状态:
systemctl status network显示inactive (dead) -
查看配置文件:
cat /etc/sysconfig/network-scripts/ifcfg-eth0,发现ONBOOT=no -
修复:改为
ONBOOT=yes,systemctl restart network恢复正常
案例五:DNS 解析故障导致域名无法访问
现象:ping 8.8.8.8 可达,但 curl https://www.baidu.com 失败。
排查思路:
-
DNS 解析测试:
nslookup www.baidu.com返回NXDOMAIN -
检查 DNS 配置:
cat /etc/resolv.conf发现 nameserver 指向 198.18.254.30(不可达) -
修复:更换公共 DNS
echo "nameserver 8.8.8.8" > /etc/resolv.conf -
验证:
dig baidu.com正常返回 IP,curl 恢复
九、网络性能分析与优化
9.1 网络瓶颈的四个维度
网络瓶颈通常表现为:
-
带宽过载:链路容量不足
-
高延迟:RTT 过大或波动剧烈
-
丢包率高:网络拥塞或设备故障
-
连接数过多:系统资源耗尽
9.2 性能分析工具链
| 工具 | 用途 | 典型命令 |
|---|---|---|
iftop |
主机间实时带宽监控 | sudo iftop -i eth0 |
nethogs |
按进程查看带宽占用 | sudo nethogs eth0 |
iperf3 |
端到端带宽性能测试 | iperf3 -c server -t 30 |
ss -ti |
查看每个连接的 RTT、拥塞窗口 | ss -ti state established |
sar -n DEV |
历史网卡流量统计 | sar -n DEV 1 10 |
netstat -i |
网卡错误统计(丢包、错误帧) | netstat -i |
9.3 常见性能问题优化
| 问题 | 诊断命令 | 解决方案 |
|---|---|---|
| 发送/接收缓冲区不足 | ss -m 查看 skmem |
sysctl -w net.core.rmem_max=26214400 |
| TIME_WAIT 过多 | ss -s 统计 timewait |
tcp_tw_reuse=1,应用改用长连接 |
| TCP 重传过多 | ss -ti 查看 retrans |
排查网络链路质量,调整 tcp_retries2 |
| 网卡软中断过高 | top 查看 si 占用 |
开启 RPS/RFS,调整中断亲和性 |
| 连接队列溢出 | ss -lnt 查看 Send-Q |
增大 net.core.somaxconn 和应用 backlog |
十、总结:从"会用"到"会查"的进阶路径
掌握 Linux 网络故障排查,本质是建立一套系统化的思维方式:
第一步:建立排查框架——永远从物理层开始逐层向上验证,避免在底层未确认的情况下陷入上层细节。
第二步:熟练核心工具——ip 负责配置与状态查看,ss 负责连接与性能分析,tcpdump 负责深度抓包验证。三者形成闭环。
第三步:理解协议状态——TCP 状态转移图是所有传输层问题的"地图",看懂它,连接问题就不再是黑盒。
第四步:积累模式识别——大量的 TIME_WAIT 指向短连接问题;大量的 CLOSE_WAIT 指向应用代码 bug;SYN_RECV 堆积可能指向攻击或服务端 backlog 不足。模式识别越丰富,排查速度越快。
最后的建议:在生产环境操作任何配置变更前,务必先在测试环境验证;抓包文件保存后,建议配合 Wireshark 进行深度分析——图形化界面能让你更直观地发现 TCP 重传、乱序、零窗口等隐蔽问题。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)