任何人都知道一种简单的方法可以让Linux“向/从谷歌浏览器显示每个互联网数据包”或“使用PID 10275向/从telnet进程显示每个互联网数据包”吗?
telnet示例不是太有用,因为我可以使用wireshark或tcpdump来查看涉及端口23的所有TCP对话。那个和没有人再使用telnet。但是,使用许多端口向/从复杂应用程序中嗅探所有数据包似乎是一件有用的事情。
我找到了一些相关的答案,探讨了确认端口和PID(或程序名称)等的不同方法,但没有关于数据包
看起来有些人可能一直愿意为这个答案买单:
NetHogs对于快速查看哪些程序通过接口创建流量非常有用,但它无法捕获数据包。
答案 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