我如何確定哪個程序在 Linux 上產生 UDP 流量?
我的機器不斷發出 udp dns 流量請求。我需要知道的是生成此流量的程序的 PID。
TCP 連接的正常方式是使用 netstat/lsof 並在 pid 處獲取關聯的程序。
是 UDP 連接是有狀態的,所以,當我呼叫 netastat/lsof 時,只有當 UDP 套接字打開並且它正在發送流量時,我才能看到它。
我嘗試過 with
lsof -i UDP
和 withnestat -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_STREAM
which 將設置a1=1
. (SOCK_DGRAM
在第二個參數中可能會與 or 進行SOCK_NONBLOCK
或SOCK_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 流量,這還不夠好,您將不得不求助於OProfile或SystemTap,這兩種方法目前都超出了我的專業範圍。
在一般情況下,這應該有助於縮小範圍。
完成後,使用創建它時使用的同一行刪除審計規則,僅替換
-a
為-d
.auditctl -d exit,always -F arch=b64 -F a0=2 -F a1\&=2 -S socket -k SOCKET