使用 tcpdump 和 Wireshark 进行远程实时抓包分析

抓包分析
抓包分析工具主要有两种:
- http/https 网络代理工具:mitmproxy/fiddler 都属于这一类,用于分析 http 非常方便。但是只支持 http/https,有局限性。
- tcp/udp/icmp 等网络嗅探工具:tcpdump/tshark 都属于这一类,网络故障分析等场景常用。
这里主要介绍如何使用 tcpdump + wireshark 进行远程实时抓包分析。 而 mitmproxy 抓包和 wireshark 本地抓包都相当简单,就不介绍了。
P.S. tshark 是 wireshark 的命令行版本,用法 tcpdump 非常相似。
一、wireshark 的基本用法
WireShark 的 UI 界面如何使用,网上能搜得到各种类型的 wireshark 演示,多看几篇博客就会了。 搜索 [xxx 协议 wireshark 抓包分析] 就能找到各种各样的演示,比如
- 「gRPC 协议 wireshark 抓包分析」
- 「WebSocket 协议 wireshark 抓包分析」
- 「TCP 协议 wireshark 抓包分析」
- 等等
主要需要介绍的,应该是 wireshark 的数据包过滤器。 wireshark 中有两种包过滤器:
- 捕获过滤器:在抓包的时候使用它对数据包进行过滤。
- 显示过滤器:对抓到的所有数据包进行过滤。
显示过滤器是最有用的,下面简要介绍下显示过滤器的语法。
可以直接通过「协议名称」进行过滤:
|
|
也可以通过「协议名称.协议属性」和「比较操作符(比如 ==
)」进行更精确的过滤:
|
|
二、tcpdump + ssh + wireshark 远程实时抓包
在进行远程网络抓包分析时,我们通常的做法是:
- 使用
tcpdump
在远程主机上抓包,保存为 pcap 文件。 - 将 pcap 文件拷贝到本地,使用 wireshark 对其进行分析。
但是这样做没有时效性,而且数据拷贝来去也比较麻烦。
考虑使用流的方式,在远程主机上使用 tcpdump
抓包,本地使用 wireshark
进行实时分析。
使用 ssh 协议进行流式传输的示例如下:
|
|
在不方便使用 ssh 协议的情况下(比如容器抓包、Android 抓包),可以考虑使用 nc
(netcat) 进行数据流的转发:
|
|
如果是抓取 Android 手机的数据,方便起见,可以通过 adb 多进行一次数据转发:
|
|
如果需要对 Kubernetes 集群中的容器进行抓包,推荐直接使用 ksniff!
Windows 系统
另外如果你本机是 Windows 系统,要分 shell 讨论:
cmd
: 可以直接使用上述命令。powershell
: **PowerShell 管道对native commands
的支持不是很好,管道两边的命令貌似是串行执行的,这会导致 wireshark 无法启动!**目前没有找到好的解决方法。。
另外如果你使用 wsl
,那么可以通过如下命令使 wsl
调用 windows 中的 wireshark 进行抓包分析:
|
|
添加了上述软链接后,就可以正常地在 wsl
中使用前面介绍的所有抓包指令了(包括 ksniff)。
它能正常调用 windows 中的 wireshark,数据流也能正常地通过 shell 管道传输。
2. termshark: 直接通过命令行 UI 进行实时抓包分析
有的时候,远程实时抓包因为某些原因无法实现,而把 pcap 数据拷贝到本地分析又比较麻烦。
这时你可以考虑直接使用命令行版本的 wireshark
UI: termshark,直接在命令行进行实时的抓包分析。
kubectl-debug 默认的调试镜像中,就自带 termshark
.