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

时间:2011-10-20 21:33:02

标签: linux networking

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

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

我找到了一些相关的答案,探讨了确认端口和PID(或程序名称)等的不同方法,但没有关于数据包

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

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

4 个答案:

答案 0 :(得分:1)

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

process=firefox
for _port in `lsof -i | grep $process | cut -d' ' -f18 | cut -d: -f2 | cut -d'-' -f1`
do
    port=$_port
    [[ "$_port" == +([a-zA-Z]) ]] && port=`cat /etc/services  | grep '^$_port' | cut -d' ' -f12 | cut -d'/' -f1 | uniq | head -n 1`

    echo "tcpdump -w ${port}.pcap port $port &"
    tcpdump -w ${port}.pcap port $port &
done

请注意,不同版本/发行版的命令输出可能不同。因此,在使用脚本之前,最好先检查正确的文件。

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

记得事后杀死所有的tcpdump进程。

答案 1 :(得分:1)

就我而言,我想捕获系统日志流量,但仅从rsyslog中捕获。它在lsof -p $(pidof rsyslog)下只有一个侦听端口,并且始终将其用作源端口,因此我可以使用以下命令获取数据包:

tcpdump -i eth0 -A "host 10.0.0.100 and dst port 514 and src port $(lsof -i 4 -a -p `pidof rsyslogd` | grep -Po '(?<=\*:)[0-9]*') and udp"

grep uses a positive lookbehind assertion将*:portnumber转换为端口号。

答案 2 :(得分:0)

不是直接通过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>;

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

strace -f -e trace=network -s 10000 -p <PID>;

使用网络名称空间,检查上面的链接或使用工具nsntrace则更复杂,但是只能用于新流程,不能更改现有的流程网络名称空间(AFAIK)

答案 3 :(得分:-1)

Tcpdump可以告诉您数据包来自/的PID /进程。
扔'-k NP&#39;在您的选择中。

支持的版本:tcpdump版本4.3.0 - Apple版本56