
使用 tcpdump 我看到許多 SYN 封包...並且來源 IP 是本機主機。
我希望找到哪些進程正在嘗試連線。
請注意,連線未達到 ESTABLISHED 狀態,它們似乎是隨機連接埠掃描。
答案1
我最近在 Linux 上也遇到過同樣的情況(罪魁禍首是adb
)。我的方法是使用審計系統來記錄connect()
系統呼叫。
sudo auditctl -a exit,always -F arch=b64 -S connect -k who-connects
告訴審計系統記錄所有connect()
系統呼叫(這裡是 64 位元變體,如果您使用的是同時具有 32 位元和 64 位元應用程式的多體系結構系統,則可以為 32 位元變體添加另一個系統呼叫)
稍後運行:
sudo ausearch -i -k who-connects
看看是什麼建立了聯繫。
不使用套接字 API 仍然可以建立 TCP 連線。例如,透過在使用者空間中實作 TCP 堆疊並使用較低層級的 API 來傳送資料包,但這並不常見(尤其是在環回介面上)。
答案2
假設您安裝了 SystemTap
probe begin {
printf("ok\n");
}
probe syscall.connect {
# connect however may fail or flail around in a EINPROGRESS state;
# this log only indicates that a connect was attempted
if (uaddr_af == "AF_INET" || uaddr_af == "AF_INET6")
printf("%s[%d]: %s\n", execname(), pid(), argstr);
}
probe syscall.connect.return {
printf(" -> %s[%d]: %s\n", execname(), pid(), retstr);
}
另存為將在使用as運行時whomakeconnect.stp
顯示調用connect
stap
root
# stap-prep
... fix anything reported, it requires debug kernels ...
# stap whomakeconnect.stp
答案3
您可以使用 netstat 指令。它顯示資料包的狀態。但你必須捕獲輸出,因為它只在發送時出現。它不像 tcp 監聽套接字。這就是為什麼你可以使用 watch 指令來捕捉它。我認為連接是透過 ipv4 進行的。
watch -n 0.1 'netstat -4pn | grep -F "SYN_SENT"'
內斯塔旗幟
p 標誌:進程 ID/名稱
n 標誌:數位輸出(無 DNS 解析)
4 標誌:顯示 ipv4 套接字
watch 指令使 netstat 指令以 0.1 秒的周期重複執行。