Linux程序網路流量統計
前言
linux都有相應開源工具實時採集網路連線、程序等資訊其中網路連線一般包括最基本的五元組資訊(源地址、目標地址、源埠、目標埠、協議號)再加上所屬程序資訊pid, exe, cmdline)等。其中這兩項資料大多可直接讀取linux /proc目錄下的網路狀態連線檔案/proc/net/tcp、/proc/net/udp), 程序狀態目錄(/proc/pid/xx) 。
在某些應用安全場景需要結合程序網路連線、流入流出流量等資料可分析出是否在內網存在惡意外傳敏感資料現象在網路監控 時發現 伺服器大量頻寬被佔用但不清楚由系統具體哪個程序佔用 。為此都需要獲取到更細粒度的程序級網路流量資料綜合分析。
在linux proc目錄下可查到主機級網路資料,例如/proc/net/snmp提供了主機各層IP、ICMP、ICMPMsg、TCP、UDP詳細資料,/proc/net/netstat 檔案 InBcastPkts、 OutBcastPkts、InOctets、OutOctets欄位表示主機的收發包數、收包位元組資料。很可惜沒有 程序級流入流出網路流量資料。
為此參考nethogs原理實現統計程序級網路流量方式。
基本資料
涉及proc以下幾個目錄或檔案網路狀態檔案/proc/net/tcp、/proc/net/udp, 程序檔案描述符目錄/proc/pid/fd。
網路狀態檔案/proc/net/tcp
我們重點關注五元組+狀態+inode號分別在第2、3、4、11列
其中第23列分別是主機位元組序ip:port ,例如”0500000A:0016″ -> “10.0.0.5″, 22
第4列是狀態資訊狀態欄位含義如下:
“01″: “ESTABLISHED”, “02″: “SYN_SENT”, “03″: “SYN_RECV”, “04″: “FIN_WAIT1″, “05″: “FIN_WAIT2″, “06″: “TIME_WAIT”, “07″: “CLOSE”, “08″: “CLOSE_WAIT”, “09″: “LAST_ACK”, “0A”: “LISTEN”, “0B”: “CLOSING”
第11列是inode號 linux系統檔案系統中的一個檔案系統物件包括檔案、目錄、裝置檔案、socket、管道等的元資訊。
程序檔案描述符
/proc/pid/fd目錄下列出當前程序開啟的檔案資訊其中0、1、2表示標準輸入、輸出、錯誤。
網路連線是以socket:開頭的檔案描述符,其中[]號內的是inode號這樣與網路狀態檔案/proc/net/tcp下的inode號可對應起來
以pid:25133程序為例, 檔案描述符是10、12 對應inode號分別是512505532、512473483的網路連線,同時在下圖中的/proc/net/tcp都可以查詢到對應連線的詳細資訊。
根據上述檔案資訊可以從/proc/net/tcp建立起網路連線五元組->inode的對映, 而 /proc/pid/fd建立起連線inode ->程序的對映。
這樣 通過inode號作為橋樑關聯起系統內的程序與網路連線的資訊。
實現流程
為了實時獲取網路連線流量在linux主機上使用開源libpcap庫來抓取網路報文。整個實現流程圖如下包含以下5個關鍵步驟。
抓包
使用抓包Libpcap庫獲取到網路packet結構。
解析報文
解析出packet的五元組(源地址、目標地址、源埠、目標埠、協議號)資訊和當前包的流量大小。
快取更新
在ConnInodeHash查詢五元組組成的key對應的inode號如果不存在重新讀取/proc/net/tcp與udp重新整理ConnInodeHash快取建立起連線與inode的對映並重新讀取/proc/pid/fd目錄對所有檔案描述符遍歷過濾出以socket:開頭的連線重新整理InodeProcessHash快取重新建立inode與程序的對映。
hash查詢
根據查詢到inode號在InodeProcessHash查詢相應程序pid。
統計流量
根據報文地址,判斷網路連線方向,累加程序流入、流出資料。
總結
對linux主機抓包,結合網路狀態檔案、程序檔案描述符實現一種細粒度的程序級網路流量採集方式。
通過linux 檔案inode號作為橋樑,關聯出程序、網路連線的關係,可以統計程序接收/傳送的總量/平均值等各維度資料,也可以分析出程序各個網路連線的流量資料,這些在主機流量安全分析、網路監控排查等場景方面可作為重要依據。但同時也需要注意的是持續通過libpcap抓包對主機效能有損耗影響。
*本文作者:zhouqiao,轉載請註明來自FreeBuf.COM