当前位置:首页>Linux>Linux网络诊断工具——ping/traceroute/ss/netstat/tcpdump

Linux网络诊断工具——ping/traceroute/ss/netstat/tcpdump

  • 2026-10-11 05:37:27
Linux网络诊断工具——ping/traceroute/ss/netstat/tcpdump

大家好,我是冯哥的缓存。今天我们聊一下Linux 上的网络问题,大多数人第一反应就是"ping 一下",但实际上 ping 只是起点,更有用的往往是ss、traceroute、dig、tcpdump这些工具。这篇我们从基础开始,层层深入,掌握这套工具,以后遇到网络问题心里不慌。

💡提示:本文所有命令在 Ubuntu 22.04 / Debian 12 / Fedora 38 / Arch Linux 下验证。部分工具需要额外安装,文中会注明。

一、工具总览:各司其职

遇到网络问题,用什么工具取决于:

问题

工具

目标主机通不通?

ping

哪一跳出了问题?

traceroute / mtr

哪个端口在监听?哪些连接活跃?

ss / netstat

HTTP 服务有没有响应?

curl / wget

DNS 解析有没有问题?

nslookup / dig

抓包看具体数据?

tcpdump

实时看网络带宽?

iftop / nethogs

先学会问对问题,再选对工具,排查效率翻倍。如果看到大段输出不知道从哪看起,先用 ss -tlnp 确认端口,再用 curl -v 看响应,这两步能解决 70% 的服务连接问题。

二、ping——基础连通性测试

2.1 基本用法

# 基本 ping

ping baidu.com

# 只 ping 4 次就停(不加 -c 会一直 ping)

ping -c 4 baidu.com

# 指定间隔 0.5 秒 ping 一次

ping -i 0.5 -c 8 192.168.1.1

# 指定包大小(默认 56 字节,加上 ICMP 头实际 64)

ping -s 1400 baidu.com

# 显示时间戳(排查间歇性丢包有用)

ping -D baidu.com

2.2 看懂 ping 输出

PING baidu.com (39.156.66.10) 56(84) bytes of data.

64 bytes from 39.156.66.10: icmp_seq=1 ttl=48 time=28.3 ms

64 bytes from 39.156.66.10: icmp_seq=2 ttl=48 time=27.9 ms

64 bytes from 39.156.66.10: icmp_seq=3 ttl=48 time=28.1 ms

--- baidu.com ping statistics ---

3 packets transmitted, 3 received, 0% packet loss, time 2002ms

rtt min/avg/max/mdev = 27.9/28.1/28.3/0.163 ms

字段

含义

icmp_seq

序号,中断说明丢包

ttl

剩余生存时间,可以粗略判断目标距离,TTL 初始值因操作系统而异(Linux 64、Windows 128、某些设备 255),通过 ttl 变化可以推断数据包经过了多少跳

time

往返延迟(RTT),越低越好

packet loss

丢包率,偶发 1-2% 可接受,持续 >5% 有问题

mdev

延迟抖动,高了说明网络不稳定

2.3 ping 能做什么,不能做什么

ping 能判断

ping 判断不了

基本 IP 层连通性

具体端口/服务是否正常

DNS 解析是否成功(带域名时)

服务器是否故意屏蔽 ICMP

大概延迟水平

防火墙策略

⚠️注意: ping 不通不等于服务一定挂了,但也不等于服务一定正常——它只说明 ICMP 协议层面不通(防 DDoS),ping超时但网站可以正常打开是完全正常的现象。所以,ping 可以作为‘第一关’,但不要把它当成‘最终结论’。

三、traceroute / mtr——追踪每一跳

3.1 traceroute:路由追踪

ping只表达"到没到",traceroute表达"每一跳经过哪里,在哪里慢了"。

# 安装(Ubuntu)

sudo apt install traceroute

# 基本用法

traceroute baidu.com

# 使用 TCP 模式(绕过部分防火墙对 UDP/ICMP 的拦截)

traceroute -T -p 80 baidu.com

# -T 需要 root 权限或 sudo,否则可能无法发送 TCP SYN

# 不做 DNS 反向解析(更快)

traceroute -n baidu.com

输出示例:

traceroute to baidu.com (39.156.66.10), 30 hops max, 60 byte packets

1192.168.1.1 (192.168.1.1)1.2 ms1.1 ms1.0 ms

210.0.0.1 (10.0.0.1)5.3 ms5.1 ms5.2 ms

3* * *

4113.96.4.112.1 ms11.9 ms12.0 ms

...

现象

含义

延迟突然变大的那一跳

很可能是瓶颈所在

* * *(三个星号)

该跳路由器不响应 ICMP,不代表断了,后面如果通了就没问题

某跳开始全部 * * *

从那里开始断路,问题在那附近

3.2 mtr:实时路由追踪(更好用)

mtr是 traceroute的增强版,实时刷新,能看到每一跳的丢包率和延迟统计:

# 安装

sudo apt install mtr

# 启动(交互式界面)

mtr baidu.com

# 非交互模式,跑 20 次后输出报告

mtr -r -c 20 baidu.com

# 只用数字 IP,不做 DNS 解析

mtr -n baidu.com

💡提示:排查网络慢的时候,mtr比 traceroute更好用——它会持续测量每一跳的丢包率和延迟,一眼就能看出哪一跳最"卡"。

四、ss / netstat——查端口和连接

这两个工具用来回答:"这台机器上哪些端口在监听?当前有哪些网络连接?"

netstat 在 Ubuntu 22.04+ 中默认不安装。;ss是替代品,更快、输出更规范。

4.1 ss 常用用法

# 查看所有监听的端口(常用!)

ss -tlnp

# 参数说明:

# -t只看 TCP(-u 看 UDP,-a 看全部)

# -l只看 listening 状态(去掉 -l 看全部连接)

# -n不做 DNS 反解,显示数字端口(更快)

# -p显示是哪个进程在用这个端口

# 查看所有已建立的连接

ss -tn

# 查找占用某端口的进程

ss -tlnp | grep :8080

# 查看 UDP 监听(DNS/NTP 等服务)

ss -ulnp

# 看摘要统计

ss -s

典型输出:

StateRecv-QSend-Q Local Address:PortPeer Address:PortProcess

LISTEN01280.0.0.0:220.0.0.0:*users:(("sshd",pid=892,fd=3))

LISTEN05110.0.0.0:800.0.0.0:*users:(("nginx",pid=1234,fd=6))

ESTAB00192.168.1.100:22192.168.1.50:51234users:(("sshd",pid=5678,fd=4))

4.2 netstat 用法(老系统备用)

# 安装(Ubuntu 上已被移出默认包,需要手动装)

sudo apt install net-tools

# 查看监听端口

netstat -tlnp

# 查看全部连接

netstat -anp

# 查看路由表

netstat -r

# 或者用更现代的替代:

ip route show

4.3 端口被占了怎么办

# 场景:启动服务报 "Address already in use"

# 第一步:找是哪个进程占了端口(以 8080 为例)

ss -tlnp | grep :8080

# 或者

sudo lsof -i :8080

# 第二步:确认是什么进程

ps aux | grep <PID>

# 第三步:决定要不要 kill 掉

sudo kill <PID># 正常终止

sudo kill -9 <PID># 强制终止(最后手段)

五、curl / wget——测试 HTTP 服务

5.1 curl 常用用法

curl是测试 HTTP/HTTPS 接口的必备工具:

# 基本请求(显示响应体)

curl https://example.com

# 只看响应头(不显示 body)

curl -I https://example.com

# 同时看请求头和响应头(调试利器)

curl -v https://example.com

# POST 请求,发送 JSON

curl -X POST https://api.example.com/data \

-H "Content-Type: application/json" \

-d '{"key": "value"}'

# 下载文件

curl -O https://example.com/file.tar.gz

# 跟随重定向(默认不跟)

curl -L https://example.com

# 指定超时时间(秒)

curl --connect-timeout 5 --max-time 10 https://example.com

# 测试连接但不输出 body,只看状态码

curl -o /dev/null -s -w "%{http_code}\n" https://example.com

💡提示:curl -v是调试 HTTP问题的利器——能看到 DNS 解析时间、TCP 握手时间、SSL 握手时间、实际请求头和响应头,网速慢或接口异常时非常有用。

5.2 wget 常用用法

# 下载文件

wget https://example.com/file.tar.gz

# 后台下载(不占终端)

wget -b https://example.com/bigfile.iso

# 断点续传

wget -c https://example.com/bigfile.iso

# 限速下载(不抢占带宽)

wget --limit-rate=500k https://example.com/bigfile.iso

# 递归下载整个网站

wget -r -l 2 https://example.com

工具

适合场景

curl

调试 API、查看响应头、POST 请求、测试接口

wget

下载文件、断点续传、后台下载

六、nslookup / dig——DNS 查询诊断

6.1 nslookup

# 查询域名 A 记录

nslookup baidu.com

# 指定 DNS 服务器查询(排查是本地 DNS 问题还是全局问题)

nslookup baidu.com 8.8.8.8

# 查询 MX 记录(邮件服务器)

nslookup -type=MX qq.com

6.2 dig(更详细,推荐)

# 安装

sudo apt install dnsutils# Ubuntu/Debian

sudo dnf install bind-utils# Fedora/CentOS

# 基本查询

dig baidu.com

# 只显示 A 记录(精简输出)

dig baidu.com A +short

# 查询 AAAA 记录(IPv6)

dig baidu.com AAAA

# 指定 DNS 服务器

dig @8.8.8.8 baidu.com

# 追踪完整解析过程(从根域名服务器开始)

dig +trace baidu.com

# 反向解析(IP → 域名)

dig -x 39.156.66.10

看懂 dig 输出:

;; ANSWER SECTION:

baidu.com.300INA39.156.66.10

;; Query time: 28 msec

;; SERVER: 114.114.114.114#53(114.114.114.114)

字段

含义

300

TTL(秒),缓存剩余时间

IN A

Internet 地址记录类型

Query time

DNS 查询耗时

SERVER

实际响应的 DNS 服务器

6.3 DNS 排查思路

# 第一步:确认本地能否解析

dig baidu.com

# 第二步:换一个公共 DNS 试试(排除本地 DNS 问题)

dig @8.8.8.8 baidu.com

dig @114.114.114.114 baidu.com

# 第三步:检查本机 DNS 配置

cat /etc/resolv.conf

# 第四步:检查 /etc/hosts 有没有被污染

grep baidu /etc/hosts

七、tcpdump——网络抓包入门

tcpdump是 Linux 命令行抓包工具,能看到实际流过网卡的每一个数据包。

⚠️注意:tcpdump需要 root 权限(sudo)或设置了相应 capabilities 才能运行。

7.1 安装

sudo apt install tcpdump# Ubuntu/Debian

sudo dnf install tcpdump# Fedora/CentOS

7.2 常用命令

# 普通用户抓包设置 

sudo setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump 

# 抓取所有接口的所有包(Ctrl+C 停止)

sudo tcpdump

# 指定网卡(先用 ip link 或 ifconfig 查网卡名)

sudo tcpdump -i eth0

sudo tcpdump -i wlan0

# 抓取指定端口的包

sudo tcpdump -i any port 80

sudo tcpdump -i any port 443

# 抓取指定 IP 的包

sudo tcpdump -i any host 192.168.1.100

# 组合过滤:指定 IP + 端口

sudo tcpdump -i any host 192.168.1.100 and port 22

# 显示内容(-A 纯文本,-X 十六进制+文本)

sudo tcpdump -i any port 80 -A

# 限制抓包数量(抓 50 个包就停)

sudo tcpdump -i any -c 50

# 保存到文件,之后用 Wireshark 分析

sudo tcpdump -i any -w /tmp/capture.pcap

# 读取保存的文件

tcpdump -r /tmp/capture.pcap

7.3 过滤语法速查

# 按协议

sudo tcpdump tcp

sudo tcpdump udp

sudo tcpdump icmp

# 按来源/目的

sudo tcpdump src 192.168.1.1# 来自某 IP

sudo tcpdump dst 8.8.8.8# 发往某 IP

sudo tcpdump src port 80# 来自 80 端口

# 组合逻辑

sudo tcpdump src 192.168.1.1 and port 443

sudo tcpdump port 80 or port 443

sudo tcpdump not port 22

# 排除 SSH 端口可以避免自己的 SSH 会话数据干扰输出(抓包时自己的 SSH 流量也会被抓到)

# 抓 DNS 请求(UDP 53)

sudo tcpdump -i any port 53 -n

# 抓 HTTP(明文,只在没 HTTPS 的场景有用)

sudo tcpdump -i any port 80 -A

💡提示:对于有图形界面的情况,可以把 .pcap文件下载到本机用Wireshark打开分析,比命令行看起来方便多了。

八、网络带宽监控

8.1 iftop——实时看每个连接的带宽

# 安装

sudo apt install iftop

# 监控所有接口

sudo iftop

# 监控指定接口

sudo iftop -i eth0

# 不做 DNS 解析(更快)

sudo iftop -n

iftop界面会显示每对 IP 之间的带宽占用,适合排查"谁在吃带宽"。

8.2 nethogs——按进程看带宽

# 安装

sudo apt install nethogs

# 启动

sudo nethogs

# 监控指定接口

sudo nethogs eth0

nethogs按进程维度显示带宽,能直接看出"哪个程序在占网速"。

工具

维度

适用场景

iftop

按连接(IP 对)

找哪个 IP 在传数据

nethogs

按进程

找哪个程序在吃带宽

vnstat

历史统计

看每天/每月总流量

如果发现带宽被占满,先用 nethogs 看是哪个程序,再用 iftop 看是连哪个 IP。

九、实战排查场景

场景一:服务连不上(端口不通)

# 第一步:ping 检查基础连通

ping -c 4 目标IP

# 第二步:检查目标端口有没有在监听

ss -tlnp | grep :端口号

# 第三步:用 curl 测试 HTTP(如果是 Web 服务)

curl -v http://目标IP:端口

# 第四步:检查防火墙,如果是云服务器,别忘了检查云厂商的安全组规则

sudo ufw status

# 第五步:如果是远端机器,检查对方防火墙/安全组

# → 让对方 ss -tlnp 看端口是否在监听

# → 云服务器检查安全组规则是否放行该端口

场景二:DNS 解析失败,网页打不开

# 第一步:直接 ping IP(排除 DNS 问题)

ping -c 4 39.156.66.10

# 第二步:dig 诊断 DNS

dig baidu.com

dig @8.8.8.8 baidu.com

# 第三步:检查 /etc/resolv.conf

cat /etc/resolv.conf

# 第四步:检查 systemd-resolved状态(Ubuntu)

systemctl status systemd-resolved

resolvectl status | head -30

# 第五步:临时换公共 DNS 测试

echo "nameserver 114.114.114.114" | sudo tee /etc/resolv.conf

场景三:网速慢,找原因

# 第一步:mtr 追踪路由,看哪一跳丢包/延迟高

mtr -r -c 20 baidu.com

# 第二步:ss 看当前连接,有没有大量 CLOSE_WAIT(连接没清理)

ss -s

# 第三步:nethogs 看哪个进程在占带宽

sudo nethogs

# 第四步:iftop 看哪个 IP 在传大量数据

sudo iftop -n

# 第五步:检查 NIC 错误(硬件问题)

ip -s link show eth0

# 看 errors/dropped 字段,不为 0 说明有丢包

场景四:某进程端口被占

# 方法一:ss

ss -tlnp | grep :8080

# 方法二:lsof

sudo lsof -i :8080

# 找到 PID 后,确认进程身份

ps aux | grep <PID>

# 如果是不需要的进程,停掉它

sudo systemctl stop服务名

# 或

sudo kill <PID>

十、常用命令速查表

ping 速查

命令

作用

ping -c 4 host

ping 4 次就停

ping -i 0.2 host

每 0.2 秒一次

ping -s 1400 host

指定包大小

ping -D host

显示时间戳

ping -f host

洪水模式

ss 速查

命令

作用

ss -tlnp

查看所有 TCP 监听端口

ss -ulnp

查看所有 UDP 监听端口

ss -tn

查看所有已建立的 TCP 连接

ss -s

连接数摘要

ss -tlnp | grep :端口

查某端口被谁占用

curl 速查

命令

作用

curl -I URL

只看响应头

curl -v URL

详细调试输出

curl -L URL

跟随重定向

curl -o /dev/null -s -w   "%{http_code}" URL

只看状态码

curl --connect-timeout 5 URL

设置超时

dig 速查

命令

作用

dig 域名 +short

只显示 IP 地址

dig @8.8.8.8 域名

指定 DNS 服务器查询

dig 域名 +trace

追踪完整解析过程

dig -x IP

反向解析

dig MX 域名

查邮件服务器记录

tcpdump 速查

命令

作用

tcpdump -i any port 80

抓 80 端口流量

tcpdump -i any host IP

抓指定 IP 流量

tcpdump -c 100 -w file.pcap

抓 100 包保存到文件

tcpdump -r file.pcap

读取保存的文件

tcpdump port 53 -n

抓 DNS 查询(不做反解)

小结

这篇覆盖了Linux 网络诊断的全套工具,记住这套四步排查法:

1.ping → 基础连通性(IP 层)

2.mtr/traceroute → 路径哪一跳有问题

3.ss/curl → 目标端口/服务是否正常

4.dig → DNS 解析是否正常

绝大多数网络问题按这四步下来就能定位,tcpdump是兜底的终极武器——当不知道问题在哪里时,抓包看真实数据是最直接的答案。

下篇预告:《Nginx 安装与基础配置》

最新文章

随机文章