我想有一个类似tcpdump的程序,显示哪个程序发送了一个特定的数据包,而不是只是获取端口号。 这是一个通用的问题,我曾经有过和有时,当你有一个旧的tcpdump文件躺在你身边没有办法find什么程序发送的数据..
我怎样才能确定哪个进程是在Linux上的UDPstream量的解决scheme? 是一个迹象表明,我可以用auditd,dTrace,OProfile或SystemTap解决这个问题,但是并没有说明如何去做。 即它不显示程序的源端口调用bind()..
我遇到的问题是很奇怪的UDP数据包,由于这些端口是如此短暂,我花了一段时间才解决这个问题。 我通过运行一个类似于下面的丑陋的黑客来解决这个问题
while true; date +%s.%N;netstat -panut;done
所以要么是比这个更好的方法,replacetcpdump,要么从内核获取这个信息,所以我可以修补tcpdump。
用auditd解决这个问题
sudo auditctl -a exit,always -F arch=b64 -S bind -k BIND
这个填充/var/log/audit/audit.log的行如下:
type=SYSCALL msg=audit(1292929028.845:3377): arch=c000003e syscall=49 success=yes exit=0 a0=3 a1=808710 a2=10 a3=7fffab28ea10 items=0 ppid=1564 pid=24442 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=4294967295 comm="nc" exe="/bin/nc.openbsd" key="BIND" type=SOCKADDR msg=audit(1292929028.845:3377): saddr=0200FFFF000000000000000000000000
然后parsingsaddr = 0200xxxx00,其中xxxx是端口号,0001是最低的,FFFF是最高的。
编辑:这是超级用户“跟踪什么程序发送到networking”问 ,虽然没有好的解决scheme。
有关发送数据包的过程的信息(即使是从本地机器发出的数据)不可用于tcpdump,因为它不是由内核的数据包捕获接口提供的…在http://www.tcpdump.org上search“DLT_LINUX_SLL” /pcap3_man.html
改变这肯定是一个相当复杂的内核黑客任务…
最接近解决scheme似乎是iptable的“所有者”匹配模块,它支持通过user-id匹配数据包(在某些 linux版本中也是process-id,后来删除该特性的iirc),以及–log-uid no –log-pid)选项的LOG目标。
所以,当你添加一个iptables规则,如:iptables -I OUTPUT -p tcp –syn -j LOG – 日志前缀“新的tcp连接:”–log-uid
你得到一个日志(在你的内核日志,又名dmesg )所有新build立的连接与他们的源端口和用户ID,所以你可以得到一个连接到用户的地图,而不必轮询netstat …
看看这个答案是一个相同的问题。 它build议使用auditd框架。