14 10 月 2026

网络问题的排查分两档:ping 通不通是一档,包里装什么是另一档。ping 通但应用连不上、游戏进不去、API 超时——这些都要抓包看。

tcpdump 是命令行抓包的标准工具,SSH 到任何服务器都能用。这篇从基础语法讲到四个实战场景,全是排障真功夫。

需要云服务器可以看看财富云计算:一键开服面板,NAT 型无独立公网 IP,价格比独立 IP 机型省一半以上,主流游戏快速部署。

一、安装与基础语法

apt install -y tcpdump    # Debian/Ubuntu
yum install -y tcpdump    # CentOS

# 列出可抓包的网卡
tcpdump -D

语法骨架:

tcpdump [选项] [过滤表达式]

最常用组合:

# 抓所有包(信息量太大,基本不用)
tcpdump -i any

# 抓指定网卡
tcpdump -i eth0

# 抓指定端口,不反查域名,带行缓冲(SSH 下实时看必须)
tcpdump -i eth0 -nn -l port 8211

# 抓到文件(排障完再分析,别刷屏)
tcpdump -i eth0 -w /tmp/capture.pcap

# 读文件分析
tcpdump -r /tmp/capture.pcap

# 只看前 100 个包
tcpdump -i eth0 -c 100

关键选项:

选项作用
-i eth0指定网卡
-nn不解析域名和端口名(SSH 下必加,不然卡在 DNS 反查)
-l行缓冲输出,实时显示
-c N抓 N 个包就停
-w 文件写入 pcap 文件(Wireshark 能打开)
-r 文件读 pcap 文件
-s 0抓完整包(默认只抓 68 字节,看内容要加)
-v/-vv详细信息
-A以 ASCII 显示包内容
-X十六进制 + ASCII 显示

二、过滤表达式:抓你想要的

抓包最大的敌人是噪音。表达式越精准,分析越快。

按主机和端口

# 指定 IP
tcpdump -i eth0 host 1.2.3.4

# 指定方向(只抓进来的)
tcpdump -i eth0 dst 1.2.3.4

# 指定端口
tcpdump -i eth0 port 443

# 端口范围
tcpdump -i eth0 portrange 8000-9000

# 组合: 某 IP 的某端口
tcpdump -i eth0 host 1.2.3.4 and port 8211

# 排除: 不抓 SSH(排障时别把自己绕进去)
tcpdump -i eth0 not port 22

按协议

tcpdump -i eth0 udp          # 只 UDP(游戏流量)
tcpdump -i eth0 tcp          # 只 TCP
tcpdump -i eth0 icmp         # ping
tcpdump -i eth0 arp          # ARP

按 TCP 标志位(进阶,很有用)

# 只抓 SYN(连接请求)
tcpdump -i eth0 'tcp[tcpflags] & tcp-syn != 0'

# 只抓 RST(连接被重置,排障神器)
tcpdump -i eth0 'tcp[tcpflags] & tcp-rst != 0'

# SYN 扫描检测
tcpdump -i eth0 'tcp[tcpflags] == tcp-syn'

三、实战场景一:TCP 连接建立过程

tcpdump -i eth0 -nn -l host 1.2.3.4 and port 443

正常三次握手:

10:00:01.000 IP 192.168.1.10.54321 > 1.2.3.4.443: Flags [S]     ← 客户端发 SYN
10:00:01.050 IP 1.2.3.4.443 > 192.168.1.10.54321: Flags [S.]    ← 服务端 SYN-ACK
10:00:01.100 IP 192.168.1.10.54321 > 1.2.3.4.443: Flags [.]     ← 客户端 ACK,连接建立

异常模式速查:

现象含义
只有 [S],没有 [S.]包没到服务端,或服务端没回(防火墙丢包)
收到 [R](Reset)端口没监听 / 防火墙主动拒绝
[S] 重传多次([S] 重复出现)中间网络丢包严重
握手成功后立刻 [R]服务端应用层拒绝(比如 WAF 拦截)
握手正常但之后没数据应用层问题,不是网络

四、实战场景二:游戏连不上服务器

# 在游戏服机器上抓(看请求到没到)
tcpdump -i eth0 -nn -l udp port 8211
# 在自己电脑上抓(对比,看请求出去没、回来没)
# macOS/Linux:
sudo tcpdump -i any -nn udp port 8211

判读:

观察结论
服务器侧完全收不到包请求没到:客户端网络问题、映射端口错、IP 错
服务器收到、有回复,但客户端收不到回程被丢:NAT 映射问题、防火墙
客户端收到回复但游戏显示连不上应用层问题(版本不匹配、协议错)
收到 ICMP port unreachable端口没监听(服务没起)

UDP 游戏服特别注意:UDP 无连接,抓包看不到握手,只能看到数据包往返。重点看是否有回包、回包的目的地址对不对。

# 看 UDP 包的源和目的
tcpdump -i eth0 -nn -l -vv udp port 8211

五、实战场景三:HTTPS 网站排查

HTTPS 内容加密,看不到 URL 和内容,但能看到很多信息:

# 看 TLS 握手和握手后的行为
tcpdump -i eth0 -nn -l port 443 -A | head -50

# 明文部分(TLS 握手前的 SNI,暴露访问的域名)
tcpdump -i eth0 -nn -l port 443 -A | grep -i "server_name\|client hello"

能看到的:

  • 连接是否建立、耗时
  • TLS 版本、加密套件协商
  • 证书大小(加载慢可能是证书链问题)
  • 连接的源 IP 分布(CC 攻击、爬虫)
  • 传输的数据量(哪个 IP 在下载大文件)

看不到的:具体 URL、请求内容、Cookie——这是 HTTPS 的设计目的。

六、实战场景四:找出谁在偷流量

# 看实时流量 top(源 IP)
tcpdump -i eth0 -nn -l -c 10000 | awk '{print $3}' | cut -d. -f1-4 | sort | uniq -c | sort -rn | head

# 看哪个连接传输量大
tcpdump -i eth0 -nn -l -c 1000 | awk '{print $3, $5}' | sort | uniq -c | sort -rn | head

# 看有没有异常端口(可疑外联)
tcpdump -i eth0 -nn -l dst port not 80 and dst port not 443 and dst port not 22

可疑信号:陌生 IP 的大量外联(可能是被当肉鸡/挖矿)、非标准端口的持续连接、深夜的流量高峰。

七、进阶技巧

1. 按包大小过滤

# 只看大包(>1000 字节,可能是数据传输/攻击)
tcpdump -i eth0 greater 1000

# 只看小包(可能是扫描/keepalive)
tcpdump -i eth0 less 100

2. 抓包给 Wireshark 分析

# 服务器抓包,完整保存
tcpdump -i eth0 -s 0 -w /tmp/capture.pcap -c 10000

# 下载到本地
scp root@服务器:/tmp/capture.pcap .

# 用 Wireshark 打开,图形化分析(按 IP、端口、协议过滤,看流重组)

注意:抓含敏感数据的包要合规,别把用户密码包乱传。

3. 循环抓包防撑爆磁盘

# 每个文件 100MB,最多 10 个,循环覆盖
tcpdump -i eth0 -w /tmp/cap-%H.pcap -C 100 -W 10

4. 配合 grep 实时过滤

# 抓 TLS SNI 看谁在访问什么域名
tcpdump -i eth0 -nn -l port 443 -A | grep --line-buffered "server_name\|Host:"

# 实时看 HTTP 请求(明文网站)
tcpdump -i eth0 -nn -l -A port 80 | grep --line-buffered "GET\|POST\|Host:"

八、输出格式速读

10:30:45.123456 IP 192.168.1.10.54321 > 1.2.3.4.443: Flags [P.], seq 1:100, ack 1, win 502, length 99
└─ 时间戳      └─ 源IP.端口      └─ 目的IP.端口 └─ TCP标志  └─ 序列号  └─ 确认号 └─ 窗口 └─ 长度

TCP Flags:

标志含义
[S]SYN,请求连接
[S.]SYN-ACK,同意连接
[.]ACK,确认
[P.]PSH-ACK,推送数据
[F.]FIN-ACK,关闭连接
[R]RST,重置(异常/拒绝)
[R.]RST-ACK

九、常见问题

Q:tcpdump 刷屏停不下来?
加 -c 限制包数,或 Ctrl+C,或加精确过滤。SSH 下不加 -l 会延迟输出,加 -nn 避免 DNS 反查卡住。

Q:需要 root 吗?
需要(或 sudo)。抓包要网卡的 raw socket 权限。

Q:抓不到任何包?
网卡选错(用 -D 看列表,或 -i any 抓所有)、流量走了别的网卡、或者容器网络 namespace 不对(docker exec 进容器抓,或抓宿主机的 docker0)。

Q:NAT 型服务器抓包和普通服务器有区别吗?
没有——你在机器上抓到的就是到达这块网卡的流量。NAT 转发在服务商网关,你的机器看到的是网关转发过来的包。看不到的部分去控制台看网关日志。

Q:Docker 容器里怎么抓?

# 容器内没 tcpdump 时,抓宿主机的 veth
# 1. 找到容器网卡
docker exec 容器名 ip addr | grep eth0
# 2. 宿主机抓对应的 vethxxx
tcpdump -i vethxxx -nn

Q:抓包文件太大?
-s 0 只在不分析内容时省一点;根本上用过滤表达式减少抓取量,或者 -C/-W 循环覆盖。

小结

tcpdump 的正确用法:精准过滤(-nn -l + 表达式)→ 看连接建立 → 看数据往返 → 定位断点。记住三个高频场景的连接判读表(握手异常、UDP 无回包、TLS 层异常),90% 的网络问题能在抓包里找到答案。复杂的包存下来用 Wireshark 图形化分析,事半功倍。

更多网络排查内容见财富云计算知识库:网络排查工具大全、地域延迟、带宽选择、内核调优全系列。需要云服务器可以看看财富云计算:一键开服面板,NAT 型无独立公网 IP,价格比独立 IP 机型省一半以上。

延伸阅读
  1. 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
  2. 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
  3. 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
  4. 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
  5. 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
  6. RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
  7. 短链接服务搭建:Shlink 自托管,链接数据自己掌握
  8. 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道
更多阅读
  1. 上一篇:进程调试实战:strace、lsof、perf 排障三件套
  2. 下一篇:自动化运维脚本集锦:Shell 与 Python 直接抄
发表评论 1

取消回复