寻找短暂的TCP连接所有者进程

运行本地连接到apache服务器的tcpdump ,我发现TCP连接正在build立,并且每2秒立即closures一次。 我如何find哪个进程负责这些? netstat -ctp没有帮助,连接速度太快,进程标识符不显示TIME_WAIT的。

他们原来是haproxy探针,我可以用strace来validation,但是我仍然不知道如何确定haproxy。

您可以使用auditd框架来处理这些事情。 他们不是很“用户友好”或直观,所以需要一点点挖掘你的一部分。

首先确保你已经安装了auditd,运行并且你的内核支持它。
对于Ubuntu,您可以使用apt-get install auditd来安装它。

然后你添加一个审计策略来监视所有的connect系统调用,像这样:

 auditctl -a exit,always -F arch=b64 -S connect -k MYCONNECT 

如果您使用的是32位的Linux安装,则必须将b64更改为b32。

这个命令会把一个策略插入到审计框架中,现在任何connect()系统调用都会被logging到你的审计日志文件(通常是/var/log/audit/audit.log )中供你查看。

例如,与netcat到news.ycombinator.com端口80的连接将导致如下所示:

 type=SYSCALL msg=audit(1326872512.453:12752): arch=c000003e syscall=42 success=no exit=-115 a0=3 a1=24e8fa0 a2=10 a3=7fff07a44cd0 items=0 ppid=5675 pid=7270 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts4 ses=4294967295 comm="nc" exe="/bin/nc.openbsd" key="MYCONNECT" type=SOCKADDR msg=audit(1326872512.453:12752): saddr=02000050AE84E16A0000000000000000 

在这里你可以看到/bin/nc.openbsd应用程序启动了一个connect()调用,如果你有很多的连接调用,只想grep出一个特定的IP或端口,你必须做一些转换。 SOCKADDR行包含一个saddr参数,它以0200开头,后面是hex的端口号(0050),意思是80,然后是hex的IP(AE84E16A),即news.ycombinator.com的IP为174.132.225.106。

审计框架可以生成大量日志,因此请记住在完成任务后禁用它。 要禁用上述策略,只需将-areplace为-d就可以了:

 auditctl -d exit,always -F arch=b64 -S connect -k MYCONNECT 

良好的审计框架文件:
http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/part.audit.html

将IP地址转换为hex,十进制,二进制等:
http://www.kloth.net/services/iplocate.php

一般六angular/十进制转换器:
http://www.statman.info/conversions/hexadecimal.html

来自IT安全协议栈的auditd简介。 http://security.blogoverflow.com/2013/01/a-brief-introduction-to-auditd/

编辑1
另一种快速(swedish:fulhack)的方法是创build一个快速循环,将连接数据转储给你,如下所示:

 while true;do ss -ntap -o state established '( dport = :80 )' sleep 1 done 

此命令使用ss命令(套接字统计)将当前build立的连接转储到端口80,包括启动它的进程。 如果有很多数据可以添加| tee /tmp/output | tee /tmp/output完成后,显示屏幕上的输出,并将其写入到/ tmp /输出以供以后处理/挖掘。 如果它没有捕获到快速代理连接,请尝试删除sleep 1但如果它是一个使用频率很高的机器,则要谨慎广泛地进行日志logging。 根据需要修改!

你也可以grep你从“ausearch -i”得到的巨大日志,只能看到成功连接到互联网上的另一个主机的套接字。 我编写了一个简单的脚本来获取创build套接字的每个进程和命令以及目标主机的连接地址以及套接字“创build”的当前时间。 这里是:

 #!/bin/bash if [[ $EUID -ne 0 ]]; then echo "You must run this script as root boy!" exit 1 fi > proccessConnections.dat connections=`ausearch -i | grep host: | awk -F "msg=audit" '{print $2}' | awk -F ": saddr" '{print $1}'` connectionsNumber=`echo "$connections" | wc -l` echo "Number of connections: $connectionsNumber" echo "$connections" > conTemp.dat let counter=1 while read connectInfo; do success=`ausearch -i | grep "$connectInfo" | grep "type=SYSCALL" | grep success=yes` addressInfo=`ausearch -i | grep "$connectInfo" | grep type=SOCKADDR | awk -F ': ' '{print $2}'` processInfo=`ausearch -i | grep "$connectInfo" | grep "type=SYSCALL" | awk -F 'comm=' '{print $2}' | awk -F 'key' '{print $1}'` if [[ $success != "" ]] then echo "[$counter - $connectionsNumber] (success) comm=$processInfo - $addressInfo - $connectInfo" echo "[$counter - $connectionsNumber] (success) comm=$processInfo - $addressInfo - $connectInfo" >> proccessConnections.dat else echo "[$counter - $connectionsNumber] (no success) comm=$processInfo - $addressInfo - $connectInfo" echo "[$counter - $connectionsNumber] (no success) comm=$processInfo - $addressInfo - $connectInfo" >> proccessConnections.dat fi let counter++ done < conTemp.dat