信人: roy (大饼:己所不欲,勿施于人), 信区: LinuxDev
标  题: iptables hashlimit模块介绍
发信站: 水木社区 (Tue May 22 14:32:05 2007), 站内

这几天正在捣鼓防火墙,用到了hashlimit模块。Google了一圈发现相关的文档无论英文还是中文都很少,
所以我就把自己的折腾的心得记录下来吧。

hashlimit是iptables的一个匹配模块,用它结合iptables的其它命令可以实现限速的功能。(注意,单独hashlimit模块
是无法限速的)。
不过首先必须明确,hashlimit本身只是一个“匹配”模块。我们知道,iptables的基本原理是“匹配--处理”,hashlimit在
这个工作过程中只能起到匹配的作用,它本身是无法对网络数据包进行任何处理的。我看到网上有些hashlimit的例子里面说只
用一条包含hashlimit匹配规则的iptables语句就可以实现限速,那是错误的。
实际上,利用hashlimit来限速需要包括两个步骤。
        1.对符合hashlimit匹配规则包放行
        2.丢弃/拒绝未放行的包
下面是一个简单的例子:
iptables -A INPUT -p tcp --dport 22 -m hashlimit --hashlimit-name ssh --hashlimit 5/sec --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-htable-expire 90000 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP 

然后,我们来着重讲讲hashlimit模块具体是如何工作的。hashlimit的匹配是基于令牌桶(Token bucket)模型的。令牌桶是一种网络通讯中常见的缓冲区工作原理,它有两个重要的参数,令牌桶容量n和令牌产生速率s。我们可以把令牌当成是门票,而令牌桶则是负责制作和发放门票的管理员,它手里最多有n张令牌。一开始,管理员开始手里有n张令牌。每当一个数据包到达后,管理员就看看手里是否还有可用的令牌。如果有,就把令牌发给这个数据包,hashlimit就告诉iptables,这个数据包被匹配了。而当管理员把手上所有的令牌都发完了,再来的数据包就拿不到令牌了。这时,hashlimit模块就告诉iptables,这个数据包不能被匹配。
除了发放令牌之外,只要令牌桶中的令牌数量少于n,它就会以速率s来产生新的令牌,直到令牌数量到达n为止。
通过令牌桶机制,即可以有效的控制单位时间内通过(匹配)的数据包数量,又可以容许短时间内突发的大量数据包的通过(只要数据包数量不超过令牌桶n)。
hashlimit模块提供了两个参数--hashlimit和--hashlimit-burst,分别对应于令牌产生速率和令牌桶容量。

除了令牌桶模型外,hashlimit匹配的另外一个重要概念是匹配项。在hashlimit中,每个匹配项拥有一个单独的令牌桶,执行独立的匹配计算。通过hashlimit的--hashlimit-mode参数,你可以指定四种匹配项及其组合,即:srcip(每个源地址IP为一个匹配项),dstip(每个目的地址IP为一个匹配项),srcport(每个源端口为一个匹配项),dstport(每个目的端口为一个匹配项)

除了前面介绍的三个参数外,hashlimit还有一个必须要用的参数,即--hashlimit-name。hashlimit会在/proc/net/ipt_hashlimit目录中,为每个调用了hashlimit模块的iptables命令建立一个文件,其中保存着各匹配项的信息。--hashlimit-name参数即用来指定该文件的文件名。

好了,以上我们已经介绍了hashlimit的工作原理和相应的参数,下面我们来看几个例子。

首先是前面的那个例子:
iptables -A INPUT -p tcp --dport 22 -m hashlimit --hashlimit-name ssh --hashlimit 5/sec --hashlimit-burst 10 --hashlimit-mode -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP 
在了解了hashlimit各参数的含义之后,我们现在就可以知道这两条iptables命令的作用。
第一条的作用是,为所有访问本机22端口的不同IP建立一个匹配项,匹配项对应的令牌桶容量为10,令牌产生速率为5个每秒。放行通过匹配的数据包。
第二条的作用是,丢弃所有其它访问本机22端口的数据包。

通过这两条命令,我们就实现了限制其它机器对本机22端口(ssh服务)频繁访问的功能,

再来我们看一个复杂点的限速。假设我们现在在一台NAT网关上,想限制内部网某个网段192.168.1.2/24对外的访问频率。(这个的主要作用是限制内部中毒主机对外的flood***)
那我们可以这么做:
iptables -N DEFLOOD
iptables -A FORWARD -s 192.168.1.2/24 -m state --state NEW -j DEFLOOD
iptables -A DEFLOOD -m hashlimit --hashlimit-name deflood --hashlimit 10/sec --hashlimit-burst 10 --hashlimit-mode srcip -j ACCEPT
iptables -P DEFLOOD -j DROP
第一条命令建立了一个自定义的处理链
第二条命令,所有来自192.168.1.2/24网段,并且打算新建网络连接的数据包,都进入DEFLOOD链处理
第三条命令,在DEFLOOD链中,为每个IP建立一个匹配项,对应令牌桶容量为10,产生速率为10个每秒。放行通过匹配的数据包。
第四条命令,在DEFLOOD链中丢弃所有其它的数据包

以上我们介绍了hashlimit模块的原理和使用。希望能对大家有所帮助:)


--
    你不能否认有这样的一种感情存在,它瞬间撕破我们的心灵,就好像灵魂突然被折
    断。尽管它会随着时间,随着那种莫名氛围的流逝而淡漠,甚至消失。但我们总会
    记得,当那种情感突然来临时,心是如何绷的紧紧的。像一个一经触碰就会爆裂的 
    气球。
    男孩愣愣的看着她的背影,那一瞬,他喜欢上了这个地方,然后再也不曾后悔。


※ 来源:·水木社区 newsmth.net·[FROM: 211.151.91.*]
 

 

source:http://www.newsmth.net/bbsanc.php?path=%2Fgroups%2Fcomp.faq%2FLinuxDev%2Fold-cream%2Fserver%2Ffirewall%2Fdoc%2FM.1179815512.D0

 

########################################

-- hashlimit <average> 最大平均匹配率
-- hashlimit-mode <mode> 指定限制的模式 目标IP(dstip),源IP(srcip),目标端口dstport,来源端口srcport
-- hashlimit-name 指定放在/proc/net/ipt_ hashlimit/中 文件的文件名
-- hashlimit-burst <burst> 指定限制峰值,默认为5
-- hashlimit-htable-size <size> 设定哈希表元值
-- hashlimit-htable-max <entries> 设定哈希表入口最大数量
-- hashlimit-htable-gcinterval<interval> 设定清空哈希表的时间间隔值,默认1000毫秒
--hashlimit-htable-expire <time> 定义空闲入口在哈希表中存在最长时间