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