淺析基于Linux的跨NAT上網(wǎng)監(jiān)控原理
上網(wǎng)行為管理軟件已經(jīng)很多了,然而很多種都無法實現(xiàn)跨NAT設備的監(jiān)控,這是因為無法定位到真實的源IP地址,在NAT設備前面的設備看來,所有的流量都是NAT設備發(fā)起的,NAT設備的存在為其后面的主機提供了一層屏障。那么有沒有什么辦法可以精確定位真實源IP地址呢?辦法是有的,只是需要NAT設備的配合。1.使用conntrack-tools監(jiān)控事件 在Linux上,NAT一般是由ip_conntrack機制實現(xiàn)的,Linux本身肯定可以精確定位到真實的轉(zhuǎn)換前的地址,需要做的僅僅是將這些信息傳遞給上網(wǎng)行為管理系統(tǒng)即可,這些信息可以在/proc/net/ip_conntrack中看到,然而我們關注的不是這些信息本身,而是針對這些信息的一系列的事件,比如某IP在某時間發(fā)起了一個到某目標地址的連接,某時間段后拆除了該連接等等。
conntrack-tools工具是Netfilter社區(qū)提供的一款功能強大的ip_conntrack信息操作工具,可以方便實時的管理ip_conntrack信息,比如刪除某條記錄,提取事件等等。Linux的機制在內(nèi)核實現(xiàn),所謂的conntrack-tools只是一個用戶態(tài)的信息操作工具,如果想監(jiān)控ip_conntrack事件,則只需要執(zhí)行conntrack -E即可 關于更多的conntrack-tools信息,請參考:http://conntrack-tools.netfilter.org/manual.html 2.總體原理 以下是一條conntrack -E的輸出: [NEW] tcp 6 120 SYN_SENT src=128.129.0.3 dst=9.24.15.123 sport=4592 dport=8080 [UNREPLIED] src=9.24.15.123 dst=9.24.15.222 sport=8080 dport=4592 該條信息的意義不言自明,從字面意義上肯定是做了NAT,將源地址128.129.0.3轉(zhuǎn)換為了9.24.14.222,如果說能將這類信息傳遞給監(jiān)控網(wǎng)關,那么就可以做到針對真實源地址的監(jiān)控,在監(jiān)控網(wǎng)關上需要做的就是數(shù)據(jù)的整理。我們知道在監(jiān)控網(wǎng)關上肯定有下列信息: 9.24.15.222:4592這個地址訪問了9.24.15.123:8080 該數(shù)據(jù)和上述的conntrack -E輸出的數(shù)據(jù)做一個匯總就能得到: 128.129.0.3:4592這個地址訪問了9.24.15.123:8080 3.ip_conntrack信息導出 如果NAT設備不配合或者根本就不是Linux系統(tǒng),那么就需要其它的方案來拿到NAT設備上的連接信息。因此為了使這一切可用,有兩種辦法,一種是提供一個針對熟知NAT設備系統(tǒng)的連接信息導出接口以及規(guī)定一種文件格式或者協(xié)議格式,自行開發(fā)信息導出機制,當然對于Linux的NAT設備,就是上面說的那樣;另一種方法就是直接強制使用基于Linux的NAT,不過這種方法有點流氓,你必須要做到的就是你的Linux NAT設備既便宜又好用... 注解: conntrack-tools工具功能強大,一般用于無縫雙機熱備環(huán)境,Linux主機可以實時的將一臺機器的conntrack信息同步到相應的備機上,一旦主機宕機IP地址漂到備機,流量就會無縫的經(jīng)過備機,而不需要在流量經(jīng)過備機時重新生成conntrack信息(因為在重新生成的情況下,對于已經(jīng)建立連接的TCP流量會有問題的)