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