linux iptables layer7 模塊 中文howto
linux的iptables有許多模塊,下面詳細介紹下layer7 模塊-中文howto:
這兩天在研究iptables layer7的文檔,竊以為這個模塊會彌補iptables在應(yīng)用層控制方面的一些短處,今天閑來無事,恰巧一位故人也提到了layer7這個東西,干脆花了大半天的時間,把howto翻譯成了中文,呵呵,水平有限,意譯而已,大家看了發(fā)現(xiàn)什么bug和我聯(lián)系阿。。。
layer7 filter howto
注意:linux 2.6.9/10和layer7會發(fā)生一個嚴(yán)重的內(nèi)存泄露問題導(dǎo)致系統(tǒng)在幾分鐘之內(nèi)down掉,看起來這好像是內(nèi)核堆棧的問題,在2.6.11登臺之前,還是用2.6.0-2.6.8.1的內(nèi)核和L7 0.9.1一起工作吧
1、介紹
L7是一個linux內(nèi)核包分類器,和其他的分類器不同,l7不僅僅看上去是對協(xié)議的端口定義,他的表達式和應(yīng)用層協(xié)議匹配,以此檢驗包使用的何種協(xié)議
因為l7對于處理器和內(nèi)存很敏感,我們建議當(dāng)您存在下列情況時才考慮使用l7
*你需要匹配一些使用未預(yù)先定義的協(xié)議端口(主要見于p2p文件共享應(yīng)用)
*你相信一些有意義的通訊使用了非標(biāo)準(zhǔn)的端口(例如http協(xié)議使用1111端口)
符合以上兩個問題的其中之一嗎,好吧,l7項目中有三個組成部分,一個內(nèi)核補丁,一個iptables補丁,一個協(xié)議定義文件,本文一下部分就來解釋你如何處理他們。
2、你需要獲取的:
*從kernel.org得到2.4或者2.6的內(nèi)核源代碼
*從netfilter.org得到iptables的源代碼
*我們的Layer7 補丁包
*我們的協(xié)議定義包
#p#
3、內(nèi)核補丁
針對專家的縮寫版:應(yīng)用我們的內(nèi)核補丁,在netfilter中打開新的匹配選項。
從Layer 7 paches包中選擇適當(dāng)?shù)膬?nèi)核補丁,并給linux內(nèi)核打補丁(請閱讀包里面的readme文件選擇合適的文件)。或者根據(jù)你的需要設(shè)置其他內(nèi)核版本。
打開EXPERIMENTAL(Device Drivers->Networking support->Networking Options->Network packet filtering),接下來打開connection tracking(Network packet filtering->IP:Netfilter Configuration->Connection tracking)。在同一屏,同樣打開Connection tracking flow accounting 和IP tables support。
打開Layer 7 match support,你需要打開其他一些Netfilter選項,比較顯而易見的如Ftp support。如果你還不太了解具體的選項含義,那么就打開所有的Layer 7 mach support
向平常一樣編譯并安裝新內(nèi)核(我們的代碼會導(dǎo)致一個警告,不管它),重啟,并加載合適的內(nèi)核。
如何給源代碼樹加載補丁。
下面給出一個一般適用于任意內(nèi)核源碼的方法。首先把下載得到的補丁源碼解壓
gunzip layer7-kernel-patch-v.X.Y.Z.patch.gz
bunzip2 layer7-kernel-patch-v.X.Y.Z.patch.bz2
接下來打補丁,在源碼的根目錄中:
patch -p1 < layer7-kernel-patch-vX.Y.Z.patch
你也會看到別人告訴你"gzip -cd ../patch.gz | patch -p1",這也是管用的。
4、Iptables補丁
給專家的縮寫版本:應(yīng)用我們的iptables補丁,這樣添加:"-m layer7 --17proto [http|ftp|etc...]"
使用layer7 patches包中的補丁文件給iptables代碼打補丁,完成后,運行chmod +x extensions/ .layer7-test
編譯iptables,"make KERNEL_DIR=/path/to/pathed/kernel"。接著用root身份運行"make install KERNEL_DIR=/path/to/pathed/kernel"(確保在運行這一步驟前已經(jīng)給內(nèi)核打過補丁)。
#p#
5、定義協(xié)議(模版文件)
那些文件告訴iptables 和內(nèi)核如何把協(xié)議名稱對應(yīng)到正則表達式,例如FTP表示為"^220[\09-\x0d -~*ftp|331[\x09-\xod -~]*password"
解壓"Protocol Definitions"并創(chuàng)建目的目錄/etc/17-protocols
現(xiàn)在你可以使用如下命令匹配應(yīng)用層數(shù)據(jù)了
iptables -t mangle -A POSTROUTING -m layer7 --17proto http -j MARK --set-mark 1
(例子中我們使用mangle表的POSTROUTING鏈因為這是一個任何包都會通過的鏈,參閱包通路圖)
注:給不愿意循規(guī)蹈矩的人
你也可以把模版安裝到自定義的路徑中,如果你這樣做,必須定義--l7dir:參數(shù)
例如:iptables [...] -m layer7 --l7dir /home/bob/patterns --l7proto http [...]
--l7dir參數(shù)必須在l7proto參數(shù)前指定!
注:給模版文件的編寫者
編寫您自己的模版文件相當(dāng)容易,并且這對我們的項目也相當(dāng)有建設(shè)性,更多的信息請參閱The Pattern Writing HOWTO
iptables會在目錄 /etc/l7-protols 或者指定目錄中查找模版文件,于是,他會找到/etc/l7-protocols/http.pat 和/etc/l7-protocols/protocols/http.pat,但不會找到/etc/l7-protocols/foo/bar/http.pat
#p#
6、實務(wù)
現(xiàn)在你可以實際的做一些包匹配的實驗了,如果你正在閱讀這篇文章,可能有兩件事情你比較感興趣,1,阻斷某些協(xié)議 2,控制帶寬使用。
首先,一個提醒,因為你在使用l7-filter,你不需要處理所有包的分類,也許大多數(shù)匹配需求可以通過其他更低要求的方法實現(xiàn)。若我們提供了正常工作的例如http,imap協(xié)議匹配方法,你也許只需要使用l7-filter處理p2p程序或類似應(yīng)用。
阻斷
不!為什么?
*l7-filter 匹配并非萬無一失,他也許同時不能確定(有的到時候一個協(xié)議看起來和另一個差不了太多)也不能否定(應(yīng)用程序可以做出些我們不清楚的令人費解的東西)
*用l7-filter阻斷不安全,因為某些原因,被檢測到的人可以輕易逃避過去。
*很多潛伏著的程序能夠使用端口跳轉(zhuǎn)的手段回應(yīng)我們的阻斷,在很多方面,這會使判斷新的數(shù)據(jù)流非常困難。
作為替代簡單的扔掉封包的操作,我們建議使用QoS限制他們的帶寬使用,參閱下一節(jié)
如果你堅持使用l7-filter來丟棄封包,確保你已經(jīng)研究過其他的方法,例如你的http代理服務(wù)器(對于蠕蟲和紅色代碼等很有效)
還在看這一節(jié)?好吧,其實阻斷非常簡單,在行尾使用"-j DROP "或者"-j REJECT"
帶寬限制
要控制協(xié)議的帶寬占用,你可以使用Netfilter來"標(biāo)記"封包然后使用QoS過濾帶有標(biāo)記的封包
標(biāo)記封包:iptables -t mangle -A POSTROUTING -m layer7 --l7proto imap -j MARK --set-mark 3
數(shù)字3是任意輸入的一個32位的整數(shù),接下來你就可以使用"tc"命令("traffic control",一個用戶態(tài)的linux QoS工具,是iproute2包的一部分)來過濾被標(biāo)記的封包。
tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 3 fw flowid 1:3
你理解***一條命令了么,可以試著讀一下"the linux advanced routing and traffic control howto(Linux高級路由和通訊控制HOWTO)"文檔受點啟發(fā),這樣也許可以更好的理解現(xiàn)在你所做的一切,但是不幸的是,tc 命令非常模糊,也許你需要一個封裝的很好的腳本,好吧,到
http://l7-filter.sourceforge.net/l7-netfilter-example
http://l7-filter.sourceforge.net/l7-netfil...ample-nonbridge
可以找到一些編寫好的腳本。如果你的需求和我的不太相同,也許你需要簡單編輯一下,但這些腳本無疑是一個更好的起點。
處理ftp,irc等等
一些協(xié)議會開啟子連接來傳輸數(shù)據(jù),F(xiàn)TP就是個例子,如果你加載了ip_conntrack_ftp內(nèi)核模塊,l7-filter把ftp和所有的子連接全部認(rèn)為ftp,irc和irc-dcc也是同樣。
如果你想要單獨檢查子連接,使用標(biāo)準(zhǔn)的iptables "helper"匹配,你可以使用"-m --helper ftp"來匹配ftp子連接,注意,這在2.6.8版本前有效,helper匹配會忽略"!"參數(shù),并且不提供"any"匹配。
"未知"匹配
l7-filter把已經(jīng)放棄匹配的連接標(biāo)記成"未知",相比之下,未被定義且仍被檢查的鏈結(jié)是沒有分類的。你可以把"未知"當(dāng)作一個普通的協(xié)議來處理。
這是很有用的,你也許想要對未分類的連接進行操作,但因為l7-filter通常必須在匹配某一連接之前檢查很多封包,你必須小心,你不能說"如果不是http,而且不是dns,那么執(zhí)行x操作",因為這樣,x操作也會執(zhí)行到http的握手操作上,這也許不是你想要看到的。你應(yīng)該說:"檢查http.和dns協(xié)議,如果是"為定義"分類,執(zhí)行x操作",實際操作:
iptables -t mangle -A POSTROUTING -m layer7 --l7proto http
iptables -t mangle -A POSTROUTING -m layer7 --l7proto dns
iptables -t mangle -A POSTROUTING -m layer7 --l7proto unknown -j[...]
這個特征只在2.6版本有效,2.4版本,沒有定義的連接永遠不會擁有一個分類。
其他應(yīng)該知道的:
*一些模版需要能夠觀察連接的兩端以便進行匹配,這對于netfilter很容易,默認(rèn)的,在mangle表的POSTROUTING鏈的策略會應(yīng)用到兩端,但是output鏈只能看到本地生成的封包,所以,output鏈并不是一個好的選擇。
*如果想要更新協(xié)議,你需要清空iptables規(guī)則并且重新輸入他們,因為模版文件只被iptables讀取,不能被內(nèi)核讀取。
*默認(rèn)的,l7-filter只價差前8個包或者2kb,這樣小了一點,你可以通過修改/proc/net/layer7_numpackets文件修改這個數(shù)字,例如:echo "12" > /proc/net/layer7_numpackets ,你也可以通過使用更大的"buffer size for application layer data"參數(shù)重新編譯內(nèi)核來修改***數(shù)據(jù)大小。
*也許這樣很罕見,但是連接匹配不止一個模版也是可能的,模版按照你在iptables 中指定的順序進行校驗,如果匹配,則不再繼續(xù)對連接進行校驗,所以,更改規(guī)則的順序可以改變校驗的結(jié)果。
*有些時候,信息寫入系統(tǒng)日志比顯示在你工作的終端上更為重要,例如一些包含正則表達式未匹配或者tc報錯的消息。一個有用的命令是"tail -f /var/log/messages"
通過文章,我們可以清楚的知道linux iptables layer7 模塊 中文howto的全部知識,希望對大家有幫助!
【編輯推薦】
- iptables 學(xué)習(xí)筆記
- iptables配置備份
- Linux系統(tǒng)Iptables端方執(zhí)行詳細講解
- Linux系統(tǒng)Iptables防火墻
- Ubuntu 10.10 設(shè)置iptables做NAT
- iptables與natcheck
- iptables限制訪問某個IP地址