一、引言:为什么你需要掌握这些工具?

在 Linux 服务器的日常运维中,网络问题占据了故障案例的半壁江山——服务不可用、连接超时、响应缓慢、丢包严重……问题表现形式千变万化,但背后的根源往往集中在有限的几个层面。

过去的网络排查依赖于 ifconfignetstatroutearp 等传统工具集。然而,这些工具在当今大规模、高性能的网络环境下逐渐暴露短板:netstat 在处理数万条连接时性能骤降,ifconfig 无法完整展示 VRF、网络命名空间等现代网络特性。

新一代的 iproute2 套件(包含 ipsstcbridge 等工具)应运而生,它不仅统一了网络配置的入口,更在性能和功能上全面超越了传统工具。tcpdump 作为抓包分析的神器,则能让你"看见"线路上真实流动的数据包,是定位疑难杂症的终极武器。

本文的目标:不仅教会你每个命令怎么用,更要让你理解——在什么样的场景下该用什么工具,如何从现象推演到根因,以及如何用组合拳快速定位生产环境中的网络问题。


二、Linux 网络配置与故障排查全景图

在深入每个工具之前,先用一张全景图建立整体认知:

排查层面 核心工具 主要用途 判断标准
物理层 ip linkethtool 检查网卡状态、速率、双工模式 状态为 UP,速率正常
网络层 ip addrip routeping 检查 IP 配置、路由表、基本连通性 IP 正确,路由可达
DNS 层 dignslookuphost 域名解析是否正常 返回正确 IP
传输层 ssnctelnet 检查端口监听、连接状态 端口 LISTEN,连接 ESTABLISHED
防火墙层 iptablesfirewalldnft 检查包过滤规则 规则允许目标流量
应用层 curltcpdumpWireshark 验证服务响应、抓包深度分析 返回预期内容

排查故障时,自下而上是最稳妥的路径:从物理链路开始,逐层向上验证,每一层确认无误后再进入下一层。切忌在物理层还没确认时就一头扎进应用层抓包分析。


三、ip 命令详解:现代 Linux 网络配置的瑞士军刀

ip 命令是 iproute2 套件的核心工具,它统一了传统 ifconfigroutearpnetstat -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:排队规则(队列管理算法)

  • stateUP/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 三次握手建立连接

  1. 客户端 → 服务端:SYN(状态:客户端进入 SYN_SENT

  2. 服务端 → 客户端:SYN+ACK(状态:服务端从 LISTEN 进入 SYN_RECV

  3. 客户端 → 服务端:ACK(双方进入 ESTABLISHED

7.3 四次挥手断开连接

  1. 主动关闭方 → 被动关闭方:FIN(状态:主动方 ESTABLISHED → FIN_WAIT_1

  2. 被动关闭方 → 主动关闭方:ACK(状态:主动方 FIN_WAIT_1 → FIN_WAIT_2;被动方 ESTABLISHED → CLOSE_WAIT

  3. 被动关闭方 → 主动关闭方:FIN(状态:被动方 CLOSE_WAIT → LAST_ACK

  4. 主动关闭方 → 被动关闭方: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 超时。

排查思路

  1. 本地自检curl -v localhost:80 正常返回 → 服务本身无问题

  2. 防火墙检查iptables -L -n -v | grep 80 发现 DROP 规则 → 问题定位

  3. 解决:添加放行规则 iptables -A INPUT -p tcp --dport 80 -j ACCEPT

关键洞察:服务监听成功不等于外部可访问,防火墙、安全组、SELinux 都是常见的"隐形拦截者"。

案例二:连接数过高导致服务响应慢

现象:业务高峰期应用响应时间从 50ms 飙升到 5s,数据库连接池频繁超时。

排查思路

  1. 统计摘要ss -s 显示 Total: 524288(超过系统限制)

  2. 查看连接状态分布ss -tan | awk '{print $1}' | sort | uniq -c 发现大量 TIME_WAIT

  3. 问题根因:应用使用短连接模式,每次请求新建连接并关闭,产生海量 TIME_WAIT 耗尽端口资源

  4. 解决方案

    • 短期调优:sysctl -w net.ipv4.tcp_tw_reuse=1 允许复用 TIME_WAIT 连接

    • 长期:应用改用连接池或 HTTP Keep-Alive

案例三:抓包定位 TCP 重传问题

现象:跨地域业务偶发超时,客户端日志显示 connection timeout,频率约 5%。

排查思路

  1. ss -ti 查看活跃连接,发现大量 rto:204(重传超时)和 retrans:3

  2. 抓包分析:tcpdump -i eth0 -nn host 目标IP -w retrans.pcap

  3. 用 Wireshark 分析,Statistics → TCP StreamGraph → Time-Sequence Graph,观察到大量重复 ACK 和快速重传

  4. 问题根因:网络路径中存在丢包,但重传恢复正常

  5. 解决方案:调整内核参数 net.ipv4.tcp_retries2(控制重传次数)并联系网络团队排查链路质量

案例四:网络服务启动失败排查

现象:重启服务器后,systemctl restart network 失败,ip addr 无 IP 地址。

排查思路

  1. 检查网络服务状态systemctl status network 显示 inactive (dead)

  2. 查看配置文件cat /etc/sysconfig/network-scripts/ifcfg-eth0,发现 ONBOOT=no

  3. 修复:改为 ONBOOT=yessystemctl restart network 恢复正常

案例五:DNS 解析故障导致域名无法访问

现象ping 8.8.8.8 可达,但 curl https://www.baidu.com 失败。

排查思路

  1. DNS 解析测试nslookup www.baidu.com 返回 NXDOMAIN

  2. 检查 DNS 配置cat /etc/resolv.conf 发现 nameserver 指向 198.18.254.30(不可达)

  3. 修复:更换公共 DNS echo "nameserver 8.8.8.8" > /etc/resolv.conf

  4. 验证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 重传、乱序、零窗口等隐蔽问题。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐