描述
TCP連接跟蹤是網絡流控和防火墻中的一項重要的基礎技術,當運用于主機時,連接必與進程相關聯,要么是主動發出的,要么是被動接受的,當后代進程被動態創建時,由于文件描述符的繼承,一個連接就會被這個進程樹中的所有進程共享;當一個進程發出或接受多個連接時,就擁有了多個連接。本方法可用于網絡安全產品中,監控TCP連接及所屬進程,能準確并動態地知道一個連接被哪些進程共享,一個進程擁有哪些連接。
特點
操作系統自帶的netstat工具只是關聯到了一個根進程,無法看到擁有該連接的所有進程,查看進程擁有的全部連接也不方便。該方法的特點是實時跟蹤、查看連接與進程相關信息方便、支持連接的管控。
實現
本方法通過內核安全的十字鏈表實現了連接與進程的相關性,連接信息結構體含有一個所屬進程鏈表頭,進程信息結構體含有一個擁有連接鏈表頭,通過十字鏈表結點鏈接,x方向鏈接到進程的連接鏈表,y方向鏈接到連接的進程鏈表,如下圖所示
進程1為根進程,進程2,...,進程n為進程1的后代進程;連接1,連接2,...,連接n為進程1產生的連接。node(x,y)為十字鏈表結點,用于關聯連接與進程,x對應進程編號,y對應連接編號,每個node包含了所屬的連接和進程指針,每行和每列都是一個雙向循環鏈表(循環未畫出),每個鏈表用一個自旋鎖同步操作。
動態跟蹤的過程包括4個方面:進程創建、進程退出、連接產生、連接銷毀。在Linux下,可通過攔截內核函數do_fork掛鉤進程創建,攔截do_exit掛鉤進程退出;可通過攔截inet_stream_ops的成員函數connect和accept掛鉤連接產生,攔截成員函數release掛鉤連接銷毀。下面為4個方面對應的流程圖,由于所有外層加鎖前已禁止本地中斷和內核搶占,因此內層加鎖前就不必再禁止本地中斷和內核搶占了。
進程創建
將copy_node插入到c的進程鏈表末尾,即為y方向增加(下同);插入到p的連接鏈表末尾,為x方向增加(下同)。
進程退出
從c的進程鏈表中移除node,即為y方向移除(下同);再從p的連接鏈表中移除node,即為x方向移除(下同)。
連接產生
當進程發出連接或接受連接時,調用此流程。
連接銷毀
當某個進程銷毀連接時,調用此流程。
posted on 2016-07-13 11:24
春秋十二月 閱讀(1530)
評論(0) 編輯 收藏 引用 所屬分類:
System