尋找短暫的 TCP 連接所有者程序
在與 apache 伺服器的本地連接上執行
tcpdump
,我發現 TCP 連接每 2 秒立即建立並關閉。我如何找到對這些負責的程序?netstat -ctp
沒有幫助,連接太快了,TIME_WAIT 沒有顯示程序標識符。結果證明它們是 haproxy 探測器,我可以用 來驗證
strace
,但我仍然不知道有什麼方法可以首先確定 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() 系統呼叫現在都將記錄到您的審計日誌文件中(通常
/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 開頭,後跟十六進制的埠號(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
關於 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:
另一種快速’n’dirty(瑞典語:fulhack)的方法是創建一個快速循環,將連接數據轉儲給您,如下所示:
while true;do ss -ntap -o state established '( dport = :80 )' sleep 1 done
此命令使用
ss
命令(套接字統計資訊)將目前建立的連接轉儲到埠 80,包括啟動它的程序。如果它有很多數據,您可以| tee /tmp/output
在完成後添加以在螢幕上顯示輸出以及將其寫入 /tmp/output 以供以後處理/探勘。如果它沒有捕捉到快速 haproxy 連接,請嘗試刪除sleep 1
,但如果它是一台使用率很高的機器,請注意大量日誌記錄。根據需要修改!