服务器端抓包命令详解:快速定位网络问题

常用的服务器端抓命令

在排查线上服务接口响应慢、请求丢失或数据异常时,直接查看网络数据包是最直接的方式。Linux 服务器上最常用的抓包工具是 tcpdump,它轻量、高效,适合在生产环境临时使用。

比如某个微服务调用第三方支付接口总是超时,但日志看不出细节。这时候登录服务器,用 tcpdump 抓一下对外的请求流量,往往能一眼看出是 DNS 解析卡住了,还是对方服务根本没响应。

tcpdump -i any host api.payment-gateway.com and port 443 -s 0 -w /tmp/payment.pcap

这条命令的意思是:监听任意网口,抓取访问 api.payment-gateway.com 的 443 端口的数据,保存到文件中。-s 0 表示捕获完整数据包,避免截断。抓完后可以下载到本地用 Wireshark 打开分析。

按条件过滤更精准

实际环境中流量很大,不加过滤会很快占满磁盘。可以根据协议、IP、端口甚至关键字做过滤。

比如只想看某个客户端 IP 发来的 HTTP 请求:

tcpdump -i eth0 'tcp port 80 and src 192.168.10.55' -nn -w http_req.pcap

这里 -nn 表示不解析主机名和端口名,让输出更干净。如果想抓包含特定关键词的数据包,比如 URL 中带 "/order/create",可以用 tcpdump 配合 grep(注意性能开销):

tcpdump -i eth0 -A -s 0 port 80 | grep -i \"/order/create\"

-A 参数以 ASCII 形式打印数据包内容,方便搜索文本。

抓包也能查内网通信问题

微服务之间通过内网通信出问题时,光看日志可能只看到“连接拒绝”或“超时”。这时候在目标服务所在服务器上抓包,确认请求是否真正到达本机。

例如服务 A 调用服务 B 的 8080 端口失败,在服务 B 上执行:

tcpdump -i eth0 'dst port 8080 and src 10.0.3.20' -w b_service_in.pcap

如果抓不到任何包,说明请求根本没到这台机器,可能是负载均衡配置错,或者防火墙拦截。如果包到了但没有回包,就要查本地服务是否监听正确,或者是否有 iptables 规则阻断。

短时间抓包避免影响性能

长时间抓包会消耗 CPU 和磁盘 I/O,尤其在高并发场景下。建议限定时间或包数量。

使用 -c 参数限制抓包数量:

tcpdump -i any port 80 -c 100 -w short_capture.pcap

抓够 100 个包就自动停止。也可以配合 timeout 命令:

timeout 30 tcpdump -i any port 443 -w 30s_ssl.pcap

只抓 30 秒,足够捕捉一次典型请求流程。

抓完后记得及时删除临时文件,避免占用空间。对于敏感系统,抓包文件可能包含用户数据,处理完应立即清理。