前言
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抓包對主機性能有損耗影響。
以上所述是小編給大家介紹的Linux進程網絡流量統計的實現過程,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VEVB武林網網站的支持!
新聞熱點
疑難解答