网络问题的排查分两档: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 1002. 抓包给 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 104. 配合 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 -nnQ:抓包文件太大?-s 0 只在不分析内容时省一点;根本上用过滤表达式减少抓取量,或者 -C/-W 循环覆盖。
小结
tcpdump 的正确用法:精准过滤(-nn -l + 表达式)→ 看连接建立 → 看数据往返 → 定位断点。记住三个高频场景的连接判读表(握手异常、UDP 无回包、TLS 层异常),90% 的网络问题能在抓包里找到答案。复杂的包存下来用 Wireshark 图形化分析,事半功倍。
更多网络排查内容见财富云计算知识库:网络排查工具大全、地域延迟、带宽选择、内核调优全系列。需要云服务器可以看看财富云计算:一键开服面板,NAT 型无独立公网 IP,价格比独立 IP 机型省一半以上。
延伸阅读
- 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
- 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
- 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
- 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
- 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
- RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
- 短链接服务搭建:Shlink 自托管,链接数据自己掌握
- 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道

[...]netsh advfirewall firewall add rule name="GameRange" dir=in action=allow protocol=UDP localport=26901-26903完整的 Windows 环境准备(远程桌面连接、运行库安装、SteamCMD 用法、开机自启、8 个常见坑)见:《Windows 云服务器开服通用前置教程》→ htt[...]
2026-10-18 回复