前言
tcpdump 是我们常用的一个网络抓包工具,它的功能非常的强大。但是它还缺少一个大家反馈很久却一直没实现的一个特性, 那就是:在结果中包含/显示发送网络请求/流量的进程信息,以及支持抓取指定进程的网络流量。
当前针对 tcpdump 抓取的流量信息,如果要获取对应的进程信息的话,常见的方法是: 基于请求的连接信息,通过 ss
或 netstat
之内的工具反查进程信息。 这个方法的缺点是:操作起来比较繁琐以及无法查找匹配短生命周期的进程所发送的网络流量。
至于基于 tcpdump 实现抓取指定进程的网络流量,常见的方法是:在知晓进程要访问的目标服务地址信息的前提下, 在使用 tcpdump 时按目的地址信息过滤流量; 或者是在特定的网络命名空间中运行目标进程,然后再在该网络命名空间下使用 tcpdump 抓包。 这两个方法的缺点是:需要提前知晓目标进程访问的目的地址或者需要改变目标进程的执行方式,适用场景有限。
本文将介绍一个新的工具 ptcpdump,基于这个工具,我们既可以在抓包时直接感知发送流量的进程信息, 也可以直接对运行中或待运行的任意进程进行网络抓包。如果流量是从容器内的进程发出的话, 它还支持显示流量的容器或 Pod 信息以及对特定容器或 Pod 进行抓包。
ptcpdump 介绍
ptcpdump 是一个使用 eBPF 技术开发的、类 tcpdump 的网络抓包工具。 它除了兼容 tcpdump 的常用命令行参数以及包过滤语法外, 还额外提供了如下核心特性:
- 在输出中记录和显示发送网络流量的进程、容器、Pod 信息。
- 支持对指定进程、容器以及 Pod 进行抓包。
- 支持将抓取的数据包保存为 pcapng 格式,可以使用 tcpdump 或者 Wireshark 做进一步分析。
- 当在 Wireshark 中打开保存的 pcapng 文件时,将能够看到每个数据包对应的进程、容器、Pod 信息。
- 使用静态链接的方式编译该工具,系统中不需要安装额外的系统链接库。
更多信息请参考项目的源代码仓库: https://github.com/mozillazg/ptcpdump
下面将以示例的形式介绍 ptcpdump 的核心功能。
兼容 tcpdump 的常用命令行参数和包过滤语法
1 | sudo tcpdump -i eth0 tcp |
上面这些常见的 tcpdump 命令可以直接无缝替换为对应的 ptcpdump 命令,只需要将 tcpdump 改为 ptcpdump 即可:
1 | sudo ptcpdump -i eth0 tcp |
在输出中记录和显示发送网络流量的进程、容器和 Pod 信息
默认情况下,ptcpdump 将在输出中显示简单的进程、容器以及 Pod 信息:
1 | $ sudo ptcpdump -i any -c 4 port 80 or port 443 |
可以通过指定 -v
参数,查看更详细的进程、容器以及 Pod 信息:
1 | $ ptcpdump -i any -c 4 -v port 80 or port 443 |
支持对指定进程、容器或 Pod 进行抓包
指定进程 pid 抓包
可以通过 --pid
参数指定要抓包的进程 pid,实现对指定进程进行抓包:
1 | $ sudo ptcpdump -i any -c 4 --pid 82106 |
同时还可以通过指定 -f
参数对该进程创建的子进程也进行抓包:
1 | $ sudo ptcpdump -i any -c 4 --pid 82106 -f 'tcp[tcpflags] & tcp-fin != 0' |
指定进程名称抓包
可以通过 --pname
参数指定进程名称(comm),实现指定进程名称抓包:
1 | $ sudo ptcpdump -i any -c 2 --pname curl |
通过运行目标程序来抓包
有需要的话,也可以通过使用 --
参数运行目标程序的方式来实现对特定程序进行抓包:
1 | $ sudo ptcpdump -i any -- curl -I https://mozillazg.com |
指定容器抓包
可以通过 --container-id
参数指定容器 id 进行抓包:
1 | $ sudo ptcpdump -i any -c 2 --container-id 36f0310403b1 |
也可以通过 --container-name
参数指定容器名称进行抓包:
1 | $ sudo ptcpdump -i any -c 2 --container-name kind-control-plane |
指定 Pod 抓包
可以通过 --pod-name
参数指定 Pod 名称进行抓包, 参数值的格式为 <pod 名称>.<pod 命名空间>
:
1 | $ sudo ptcpdump -i any -c 2 --pod-name test.default |
将数据保存为 pcapng 格式使用 tcpdump 或 Wireshark 进行分析
保存为 pcapng 格式
可以通过 -w
参数将抓包数据保存为 pcapng 格式:
1 | $ sudo ptcpdump -i any -c 5 -w demo.pcapng |
使用 tcpdump 进行分析
可以直接通过管道的方式通过 tcpdump 对抓取的数据进行分析:
1 | $ sudo ptcpdump -i any -c 5 -w - port 80 | tcpdump -n -r - |
也可以通过读取文件的方式通过 tcpdump 对抓取的数据进行分析:
1 | $ tcpdump -n -r demo.pcapng |
使用 Wireshark 进行分析
当使用 Wireshark 打开保存的 pcapng 格式的文件时,将在 Wireshark 的界面中显示相关的进程、容器以及 Pod 信息:
参考资料
本文转载自:「 mozillazg’s Blog 」,原文:https://url.hi-linux.com/6H5QD ,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com。