2010年12月24日 星期五

L7-filter

第一次碰到要去filter一些application的時候, 都慢慢的去找每個application用到哪些port, 再用iptables把那些port擋掉. 但像ftp, telnet之類的, 雖然有預設的port, 但user卻能自己改成自己喜歡的, 這個時候L7 filter就派上用場了.

L7 filter的安裝可參考官網, 步驟為:
1. Patch kernel, 並打開kernel選項
2. 把l7 match加到iptables的extensions裡
3. 下載protocol pattern files

使用的指令:
iptables [-t table -A chain] -m layer7 --l7proto [protocol name] -j [action]
舉例來說, 若要擋yahoo即時通:
iptables -t mangle -A PREROUTING -m layer7 --l7proto yahoo -j DROP
net/netfilter/xt_layer7.c中可看出 (雖然不是很懂), 基本上他的作法就是抓TCP/UDP header後的payload跟protocol pattern file (*.pat) 內的regular expression利用regexec做比對.
在"L7-filter Pattern Writing HOWTO"中, 介紹如何透過regular expression去增加自己的filter. (題外話, 文中也講到regex API在kernel spaceuser space是有點差異的)

拿HTTP的一個封包來看


可以用下列的regex來辨識
http
http/(0\.9|1\.0|1\.1) [1-5][0-9][0-9]
但真的要自己寫出個堪用的pattern還是照L7-filter Pattern Writing HOWTO上的準則去做比較可行.


參考資料:
[1] Application Layer Packet Classifier for Linux
[2] 在 C 程式中,使用 Regex (Regular Expression) library

沒有留言:

張貼留言