尋找啟動 TCP 連線的本機進程

尋找啟動 TCP 連線的本機進程

使用 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顯示調用connectstaproot

# 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 秒的周期重複執行。

相關內容