如何捕获每个PID的网络数据包?

Ada*_*sen 20 linux networking

任何人都知道一种简单的方法可以让Linux"向谷歌浏览器显示每个互联网数据包"或"使用PID 10275向/从telnet进程显示每个互联网数据包"?

telnet示例不太有用,因为我可以使用wireshark或tcpdump来查看涉及端口23的所有TCP对话.那个和没有人再使用telnet.但是,使用许多端口的复杂应用程序嗅探所有数据包似乎是一件有用的事情.

我发现了一些相关的答案,探索了不同的方法来证实端口和PID(或程序名称)等,但没有关于数据包

看起来有人可能一直愿意为这个答案买单:

NetHogs可用于快速查看哪些程序通过接口创建流量,但它无法捕获数据包.

hig*_*ita 7

不是直接的 tcpdump,但可以为您提供有关网络流量的信息,请查看https://bytefreaks.net/gnulinux/how-to-capture-all-network-traffic-of-a-single-process

strace -f -e trace=network -s 10000 <PROCESS WITH ARGUMENTS>;
Run Code Online (Sandbox Code Playgroud)

如果该进程已经启动并且您知道其 PID,则可以使用以下 1

strace -f -e trace=network -s 10000 -p <PID>;
Run Code Online (Sandbox Code Playgroud)

另一种选择更复杂,使用网络命名空间,检查上面的链接或使用工具nsntrace,但要么只能在新进程上工作,你不能改变现有的进程网络命名空间(AFAIK)

更新:您还可以安装工具 bpfcc-tools(搜索您的发行版,很多已经包含它)并使用命令sudo tcptracer-bpfcc -v -p (PID) 虽然这不会显示数据包,但它会列出该 pid 的网络连接。您可以删除-p (PID)以列出每个进程的所有连接。这对于那些跟踪短期连接而不是网络有效负载的人来说可能很有用。


Sha*_*oya 2

我将用来lsof -i获取与我想要的应用程序关联的端口号。代码如下:

进程=火狐
对于 `lsof -i | 中的 _port grep $进程| 切 -d' ' -f18 | 剪切-d:-f2 | 切-d'-'-f1`
做
    端口=$_端口
    [[ "$_port" == +([a-zA-Z]) ]] && port=`cat /etc/services | grep '^$_port' | grep '^$_port' | 切 -d' ' -f12 | 切 -d'/' -f1 | 优衣库 | 头-n 1`

    echo "tcpdump -w ${port}.pcap 端口 $port &"
    tcpdump -w ${port}.pcap 端口 $port &
完毕

请注意,不同版本/发行版上的命令输出可能有所不同。因此,在使用该脚本之前,最好检查一下是否剪切了正确的字段。

另外,该脚本不会监视稍后打开的端口。为此,我会考虑一个更复杂的脚本来定期检查端口(使用类似的东西watch

并记住之后杀死所有 tcpdump 进程。