L7-filter原理
L7-filter为我们实现了可以从操纵层实现过滤的功能,它的实现原理如故是基于特点的关键字匹配。但是它不是大略 的匹配某个单字和词,它应用了更高等 “正则”来举办匹配。
正则表达式(regular expression)刻画了一种字符串匹配的模式,可以用来反省一个串是否含有某种子串、将匹配的子串做变更 可能从某个串中取出切合某个条件的子串等。
正则表达式是由平凡字符(譬喻字符 a 到 z)以及出格字符(称为元字符)构成的笔墨 模式。正则表达式作为一个模板,将某个字符模式与所搜刮的字符串举办匹配。
L7-filter在默认情况下,将同一个毗连 中的10个数据包可能2KB的数据包内容放在缓存中。并将缓存中的内容作为一段平凡的文本,用模板文件中的正则去搜刮,假如创造有正则匹配的内容,就会在netfilter中将这几个数据包DROP掉可能给数据包打上符号 。
例子:
[\x09-\x0d -~] == 可打印字符, 包孕空缺字符 whitespace
[\x09-\x0d ] == 任何空缺字符
[!-~] == non-whitespace printable characters
怎样写一个好的模板?
1)一个模板既不要写得太具体,也不要写得太宽泛。太精美了,会导致遵从 低落 ,太宽泛了会导致误杀其余网络协议 。
模板 “bear” 没有写得比拟 精确. 如许的话,每每毗连 中包孕有”bear” 的都市被匹配到。如,一个HTTP 哀求 也会被匹配到。
具体 写模板的行动
一、起首便是抓包了。用Ethereal抓包,观察 数据包的内容的特点和规律 。
以下以QQ的数据包为例:
我们看它数据包的数据内容部分 (不管IP层,只看操纵层),比较 每一个数据包的内容,就可以创造一个规律 ,每一个包的第一个字节是02(16进制值),末了一个字节是03(16进制值)。
有了这个规律 ,我们就可以用正则表达式来表达它了。
二、正则表达式的干系 知识。
只讲最根本 ,假如不明白 的,可以查一些干系 的原料 。
^代表首字符,$代表末字符,.代表恣意一个字符,.?代表零个可能一个字符,.+代表一个可能恣意多个字符,\是代表转义字符(\x02这个表示匹配16进制的02值)。
三、结合以上知识,由于 QQ包的第一个字节是16进制02,以是正则是^\x02,末了一个字节是16进制03,正则是\x03$,在L7-filter的缓存中的QQ数据包中也许有恣意个字节,再将两个正则结合起来就应当 是^\x02.+ \x03$
四、末了写一个pat文件,文件名就叫qq.pat,文件的内容如下:
qq
^\x02.+ \x03$
再将qq.pat放入/etc/l7-protocols这个目次中。推行 iptables下令:
iptables -t mangle -A POSTROUTING -m layer7 –l7proto qq -j DROP
即可乐成 榨取QQ的通讯 。
迅雷的模板例子:
启动迅雷,双击种子文件起头下载后,通过种子文件推算出文件的直接的下载所在。然后直接到下载所在举办下载。再次毗连 资源做事器,相等于bt做事器:hub4t.sandai.net,IP是 219.134.132.81向做事器发送tcp查询哀求。
28 00 00 00 53 00 00 00 64 00 00 00 05 00 00 00 51 55 45 52 59 00 31 00 00 00(16进制值)
第一字节稳固 (以上四字节稳固 )
此中第1、17、18、19、20、21字节稳固 。实际 上ascii值为:query
做事器返回文件在其余地方 的下载所在:
28 00 00 00 53 00 00 00 04 20 00 00 09 00 00 00 51 55 45 52 59 52 45 53 50 01 98
此中第1、17、18、19、20、21字节的值稳固 。实际 上ascii值为:query
末了迅雷按照做事器返回的文件的下载所在举办下载。
其它,假如返回的所在是另一迅雷用户本机上的文件,会应用以下下令举办下载
29 00 00 00 a9 00 00 00 5d 00 00 00 03 00 00 00 47 45 54 22 00 00 00 47 3a
此中:
第1位也许值为28可能29,我感觉也许是迅雷的版本号,17、18、19稳固 。后四位的值ascii值为:get
重要 一点。迅雷每个下令间用3个null值添补。而l7对null不敏感。以是表达式为:
^[\x28\x29]…(query|get)
出格留意:L7-filter不是匹配每一个包的内容,而是匹配N个包中的整个内容。以是例子中,缓存中也许有N个QQ的数据包,但是缓存中的第一个字节确定是QQ包的第一字节,缓存中的末了个字节确定是QQ包的末了一个字节。
最后附上一些编写OK的,国内一些应用的L7脚本,供参考学习:
/ip firewall layer7-protocol
add name=Tencent_qq regexp="^.\?.\?[\\x02|\\x05]\\x22\\x27.+|^.\?.\?[\\x02|\\x\
05]\\x22\\x27.+[\\x03|\\x09]\$|^.\?.\?\\x02.+\\x03\$|^/xFE/x42../x42/x02/x\
0B/x7D/x98/x38/xE4.+"
add name=Tencent_qqgame regexp="^.\?.\?\\x2D.+[\\x25\\x62\\x0E\\xC1\\x5F\\x6C|\
\\xFF\\xFF\\x20\\xCF\\x42\\x53|\\xFF\\xFF\\x10\\x17\\x87\\xA3|\\x3E\\x7F\\\
x20\\xCF\\x42\\x53|\\x1F\\x43\\x10\\x17\\x87\\xA3]|^\\x05\\x22.+\\x03\$"
add name=PPStream regexp="^.\?.\?\\c.+\\c"
add name=QQMusic regexp=\
"(^\\xFE.\?.\?.\?.\?\\xCF|^get.+\\qqmusic.\?\\qq.+\\qqmusic)"
add name=QQLive regexp="(^get.+\\video.\?\\qq.+\\flv|^\\xFE.\?.\?.\?.\?\\xD3|^\
get.+\\video.\?\\qq.+\\mp4)"
add name=Kugou regexp=\
"(^post.+\\x0D\\x0A\\x0D\\x0A|^http.+\\x0D\\x0A\\x0D\\x0A|^e)"
add name=Http regexp="http/(0\\.9|1\\.0|1\\.1) [1-5][0-9][0-9] [\t-\r -~]*(con\
nection:|content-type:|content-length:|date:)|post [\t-\r -~]* http/[01]\\\
.[019]"
add name=Http-img regexp="\\.jpg|\\.png|\\.gif|\\.bmp|\\.jpeg"
add name=Http-web regexp=\
"\\.jsp|\\.shtml|\\.html|\\.htm|\\.php|\\.asp|\\.aspx|\\.cgi"
add name=NetTV regexp=\
"^.*get.+(\\.flv|\\.f4v|\\.hlv|\\.rm|\\.swf|\\.wma|\\.mp4|\\.mp3).*\$"
add name=File regexp="^.*get.+(\\.iso|\\.exe|\\.zip|\\.rar|\\.7z|\\.gho|\\.pdf\
|\\.avi|\\.mkv|\\.wmv|\\.wav|\\.flac|\\.ape|\\.msi).*\$"
add name=QQsp regexp="(^\\x03.\?\\xE1\\x8D|^\\x02\\x02|^\\x04\\x1E)"
add name=DNS regexp="^.\?.\?.\?.\?[\\x01\\x02].\?.\?.\?.\?.\?.\?[\\x01-\?][a-z\
0-9][\\x01-\?a-z]*[\\x02-\\x06][a-z][a-z][fglmoprstuvz]\?[aeop]\?(um)\?[\\\
x01-\\x10\\x1c][\\x01\\x03\\x04\\xFF]"
add name=Http-jpg regexp="^.*(post|POST|get|GET).+\\.jpg.+\\http"
*本文内容收集于网络。