6、实务

现在你可以实际的做一些包匹配的实验了,如果你正在阅读这篇文章,可能有两件事情你比较感兴趣,1,阻断某些协议 2,控制带宽使用。

首先,一个提醒,因为你在使用l7-filter,你不需要处理所有包的分类,也许大多数匹配需求可以通过其他更低要求的方法实现。若我们提供了正常工作的例如http,imap协议匹配方法,你也许只需要使用l7-filter处理p2p程序或类似应用。

阻断

不!为什么?

*l7-filter 匹配并非万无一失,他也许同时不能确定(有的到时候一个协议看起来和另一个差不了太多)也不能否定(应用程序可以做出些我们不清楚的令人费解的东西)

*用l7-filter阻断不安全,因为某些原因,被检测到的人可以轻易逃避过去。

*很多潜伏着的程序能够使用端口跳转的手段回应我们的阻断,在很多方面,这会使判断新的数据流非常困难。

作为替代简单的扔掉封包的操作,我们建议使用QoS限制他们的带宽使用,参阅下一节

如果你坚持使用l7-filter来丢弃封包,确保你已经研究过其他的方法,例如你的http代理服务器(对于蠕虫和红色代码等很有效)

还在看这一节?好吧,其实阻断非常简单,在行尾使用"-j DROP "或者"-j REJECT"

带宽限制

要控制协议的带宽占用,你可以使用Netfilter来"标记"封包然后使用QoS过滤带有标记的封包

标记封包:iptables -t mangle -A POSTROUTING -m layer7 --l7proto imap -j MARK --set-mark 3

数字3是任意输入的一个32位的整数,接下来你就可以使用"tc"命令("traffic control",一个用户态的linux QoS工具,是iproute2包的一部分)来过滤被标记的封包。

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)"文档受点启发,这样也许可以更好的理解现在你所做的一切,但是不幸的是,tc 命令非常模糊,也许你需要一个封装的很好的脚本,好吧,到

http://l7-filter.sourceforge.net/l7-netfilter-example

http://l7-filter.sourceforge.net/l7-netfil...ample-nonbridge

可以找到一些编写好的脚本。如果你的需求和我的不太相同,也许你需要简单编辑一下,但这些脚本无疑是一个更好的起点。

处理ftp,irc等等

一些协议会开启子连接来传输数据,FTP就是个例子,如果你加载了ip_conntrack_ftp内核模块,l7-filter把ftp和所有的子连接全部认为ftp,irc和irc-dcc也是同样。

如果你想要单独检查子连接,使用标准的iptables "helper"匹配,你可以使用"-m --helper ftp"来匹配ftp子连接,注意,这在2.6.8版本前有效,helper匹配会忽略"!"参数,并且不提供"any"匹配。

"未知"匹配

l7-filter把已经放弃匹配的连接标记成"未知",相比之下,未被定义且仍被检查的链结是没有分类的。你可以把"未知"当作一个普通的协议来处理。

这是很有用的,你也许想要对未分类的连接进行操作,但因为l7-filter通常必须在匹配某一连接之前检查很多封包,你必须小心,你不能说"如果不是http,而且不是dns,那么执行x操作",因为这样,x操作也会执行到http的握手操作上,这也许不是你想要看到的。你应该说:"检查http.和dns协议,如果是"为定义"分类,执行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版本,没有定义的连接永远不会拥有一个分类。

其他应该知道的:

*一些模版需要能够观察连接的两端以便进行匹配,这对于netfilter很容易,默认的,在mangle表的POSTROUTING链的策略会应用到两端,但是output链只能看到本地生成的封包,所以,output链并不是一个好的选择。

*如果想要更新协议,你需要清空iptables规则并且重新输入他们,因为模版文件只被iptables读取,不能被内核读取。

*默认的,l7-filter只价差前8个包或者2kb,这样小了一点,你可以通过修改/proc/net/layer7_numpackets文件修改这个数字,例如:echo "12" > /proc/net/layer7_numpackets ,你也可以通过使用更大的"buffer size for application layer data"参数重新编译内核来修改最大数据大小。

*也许这样很罕见,但是连接匹配不止一个模版也是可能的,模版按照你在iptables 中指定的顺序进行校验,如果匹配,则不再继续对连接进行校验,所以,更改规则的顺序可以改变校验的结果。

*有些时候,信息写入系统日志比显示在你工作的终端上更为重要,例如一些包含正则表达式未匹配或者tc报错的消息。一个有用的命令是"tail -f /var/log/messages"

通过文章,我们可以清楚的知道linux iptables layer7 模块 中文howto的全部知识,希望对大家有帮助!


相关内容