Linux

我如何確定哪個程序在 Linux 上產生 UDP 流量?

  • March 16, 2019

我的機器不斷發出 udp dns 流量請求。我需要知道的是生成此流量的程序的 PID。

TCP 連接的正常方式是使用 netstat/lsof 並在 pid 處獲取關聯的程序。

是 UDP 連接是有狀態的,所以,當我呼叫 netastat/lsof 時,只有當 UDP 套接字打開並且它正在發送流量時,我才能看到它。

我嘗試過 withlsof -i UDP和 with nestat -anpue,但我找不到哪個程序正在執行該請求,因為我需要在發送 udp 流量時準確呼叫 lsof/netstat,如果我在發送 udp 數據報之前/之後呼叫 lsof/netstat 是無法查看打開的 UDP 套接字。

準確地在發送 3/4 udp 數據包時呼叫 netstat/lsof 是不可能的。

我如何辨識臭名昭著的過程?我已經檢查了流量以嘗試從數據包的內容中辨識發送的 PID,但無法從流量的內容中辨識它。

任何人都可以幫助我嗎?

我是這台機器的根 FEDORA 12 Linux noise.company.lan 2.6.32.16-141.fc12.x86_64 #1 SMP Wed Jul 7 04:49:59 UTC 2010 x86_64 x86_64 x86_64 GNU/Linux

Linux 審計可以提供幫助。它至少會定位建立數據報網路連接的使用者和程序。UDP 數據包是數據報。

首先,auditd在您的平台上安裝框架並確保auditctl -l返回某些內容,即使它說沒有定義任何規則。

然後,添加一條規則來觀察系統呼叫socket()並標記它以便以後查找(-k)。我需要假設您使用的是 64 位架構,但如果不是,您可以替換b32為64 位架構。b64

auditctl -a exit,always -F arch=b64 -F a0=2 -F a1\&=2 -S socket -k SOCKET

您必須通過手冊頁和標頭檔來建構它,但它擷取的本質上是這個系統呼叫:socket(PF_INET, SOCK_DGRAM|X, Y),其中第三個參數未指定但通常為零。 PF_INET是 2 並且SOCK_DGRAM是 2。 TCP 連接將使用SOCK_STREAMwhich 將設置a1=1. (SOCK_DGRAM在第二個參數中可能會與 or 進行SOCK_NONBLOCKSOCK_CLOEXEC,因此進行&=比較。)這-k SOCKET是我們稍後搜尋審計跟踪時要使用的關鍵字。它可以是任何東西,但我喜歡保持簡單。

稍等片刻,查看審計跟踪。或者,您可以通過 ping 網路上的主機來強制發送幾個數據包,這將導致發生 DNS 查找,該查找使用 UDP,這應該會觸發我們的審計警報。

ausearch -i -ts today -k SOCKET

並且將出現類似於以下部分的輸出。我將其縮寫以突出顯示重要部分

type=SYSCALL ... arch=x86_64 syscall=socket success=yes exit=1 a0=2 a1=2 ... pid=14510 ... auid=zlagtime uid=zlagtime ... euid=zlagtime ... comm=ping exe=/usr/bin/ping key=SOCKET

在上面的輸出中,我們可以看到該ping命令導致套接字打開。strace -p 14510然後,如果它仍在執行,我可以在該程序上執行。ppid(父程序 ID)也會列出,以防它是一個大量產生問題子程序的腳本。

現在,如果您有大量 UDP 流量,這還不夠好,您將不得不求助於OProfileSystemTap,這兩種方法目前都超出了我的專業範圍。

在一般情況下,這應該有助於縮小範圍。

完成後,使用創建它時使用的同一行刪除審計規則,僅替換-a-d.

auditctl -d exit,always -F arch=b64 -F a0=2 -F a1\&=2 -S socket -k SOCKET

引用自:https://serverfault.com/questions/192893