查找短期 TCP 连接所有者进程

pme*_*ard 15 monitoring connection tcp

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

结果证明它们是 haproxy 探针,我可以用 验证strace,但我仍然不知道有什么方法可以首先确定 haproxy。

Mat*_*erg 21

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

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

然后添加一个审计策略来监控所有connect系统调用,如下所示:

auditctl -a exit,always -F arch=b64 -S connect -k MYCONNECT
Run Code Online (Sandbox Code Playgroud)

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

此命令将向审计框架插入一个策略,并且任何 connect() 系统调用现在都将被记录到您的审计日志文件(通常是/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
Run Code Online (Sandbox Code Playgroud)

在这里你可以看到 /bin/nc.openbsd 应用程序发起了一个 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
Run Code Online (Sandbox Code Playgroud)

关于 auditd 框架的良好文档:http :
//doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/part.audit.html

在以下位置将 IP 地址转换为十六进制、十进制、二进制等:http :
//www.kloth.net/services/iplocate.php

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

来自 IT Security Stack Exchange 的 auditd 简介。 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
Run Code Online (Sandbox Code Playgroud)

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

  • 您还可以使用 `ausearch -i` 为您自动解码那些 `saddr` 十六进制字符串。 (2认同)