大家好,我是冯哥的缓存。今天我们聊一下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 安装与基础配置》