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


15

tcpdump在与apache服务器的本地连接上运行时,我发现TCP连接正在建立,并每2秒立即关闭一次。我如何找到造成这些问题的过程?netstat -ctp没有帮助,连接速度太快,并且TIME_WAIT的进程标识符未显示。

他们原来是haproxy探针,我可以通过进行验证strace,但是我仍然不知道有什么方法可以首先确定haproxy。

Answers:


20

您可以将审计后的框架用于这类事情。它们不是非常“用户友好”或直观的,因此需要您进行一些挖掘。

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

然后添加用于审核的策略,以监视所有connect系统调用,如下所示:

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

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

此命令将在审计框架中插入一个策略,并且现在所有connect()syscall都将记录到您的审计日志文件中(通常是/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()调用,如果您获得大量的connect调用,并且只想grep某个IP或端口,则必须进行一些转换。SOCKADDR行包含一个saddr参数,它以0200开头,后跟十六进制的端口号(0050),即80,然后是十六进制的IP(AE84E16A),即news.ycombinator.com的IP 174.132.225.106。

审核框架会生成大量日志,因此请记住在完成任务后将其禁用。要禁用上述策略,只需将-a替换为-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地址转换为十六进制,十进制,二进制等,或从十六进制,十进制,二进制等转换IP地址

通用十六进制/十进制转换器:http
//www.statman.info/conversions/hexadecimal.html

来自IT安全堆栈交换的已审核内容简介。 http://security.blogoverflow.com/2013/01/a-brief-introduction-to-auditd/

编辑1
另一种快速处理方法(瑞典语:fulhack)是创建一个快速循环,将连接数据转储给您,如下所示:

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

此命令使用ss命令(套接字统计信息)将当前已建立的连接转储到端口80,包括启动它的进程。如果有很多数据,您可以| tee /tmp/output在完成后添加以在屏幕上显示输出以及将其写入/ tmp / output以便以后进行处理/挖掘。如果它不能赶上快速的haproxy连接,请尝试删除它,sleep 1但是如果它使用率很高的机器,则要避免大量日志记录。根据需要修改!


感谢您的详细回复。我会同意审计的解决方案,因为主机内核不支持审计的解决方案,并且我现在没有时间找到适合进行实验的解决方案,但是我会牢记这一点。至于轮询解决方案,我开始使用lsof做类似的事情,但是很快就停止了,因为它不令人满意。
pmezard,2012年

2
您也可以使用ausearch -i这些saddr十六进制字符串为您自动解码。
2014年

ss比lsof更令人满意,因为它速度更快并且具有良好的过滤规则-无需grep。我可以理解支持方面的问题:Systemtap是另一种出色的工具,但是让它在生产服务器上运行可能……不令人满意。
Max Murphy

1

您还可以复制从“ ausearch -i”获得的大量日志,以仅查看那些已成功连接到Internet上另一主机的套接字。我编写了一个简单的脚本,以获取创建套接字以连接到Internet上的主机的每个进程和命令,以及该目标主机的连接地址和套接字“创建”的当前时间。这里是:

#!/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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.