一、简介
hashlimit是iptables的一个匹配模块,用它结合iptables的其它命令可以实现限速的功能。注意:单独hashlimit模块是无法进行限速的;
二、原理介绍
实际上,使用 hashlimit 进行限速主要包括两个步骤:
- 对符合 hashlimit 匹配规则包放行
- 丢弃/拒绝未放行的包
2.1 令牌桶模型
hashlimit 的匹配方式是基于令牌桶(Token bucket)的模型,令牌桶是一种网络通讯中常见的缓冲区工作原理,它有两个重要的参数,令牌桶容量n
和令牌产生速率s
;
令牌桶容量n
:可以把令牌当成是门票,而令牌桶则是负责制作和发放门票的管理员,它手里最多有n张令牌。初始时,管理员开始手里有n张令牌,每当一个数据包到达后,管理员就看看手里是否还有可用的令牌。如果有,就把令牌发给这个数据包,hashlimit 就告诉iptables,这个数据包被匹配了,而当管理员把手上所有的令牌都发完了,再来的数据包就拿不到令牌了;这时,hashlimit 模块就告诉 iptables ,这个数据包不能被匹配,对应参数--hashlimit-burst
;令牌产生速率s
:当令牌桶中的令牌数量少于n,它就会以速率s来产生新的令牌,直到令牌数量到达n为止;
通过令牌桶机制,可以有效的控制单位时间内通过(匹配)的数据包数量,又可以容许短时间内突发的大量数据包的通过(只要数据包数量不超过令牌桶n),对应参数--hashlimit
;
2.2 匹配项
除了令牌桶模型外,hashlimit 匹配的另外一个重要概念是匹配项。在hashlimit中,每个匹配项拥有一个单独的令牌桶,执行独立的匹配计算,对应参数--hashlimit-mode
,匹配项的可选参数为以下几种:
srcip
:每个源地址IP为一个匹配项;dstip
:每个目的地址IP为一个匹配项;srcport
:每个源端口为一个匹配项;dstport
:每个目的端口为一个匹配项;
2.3 相关配置参数
hashlimit 的相关匹配项参数介绍如下:
--hashlimit-name
:该参数指定了每个调用了 hashlimit 模块的 iptables 命令而建立的文件名,该文件存放在 /proc/net/ipt_hashlimit 目录中,其中保存着各匹配项的信息;--hashlimit
:令牌产生速率,示例:5/sec 代表每秒产生5个;--hashlimit-burst
:令牌桶容量,默认是5;--hashlimit-mode
:匹配项,每个匹配项拥有一个单独的令牌桶,执行独立的匹配计算,可选参数如下所示:srcip
:每个源地址IP为一个匹配项;dstip
:每个目的地址IP为一个匹配项;srcport
:每个源端口为一个匹配项;dstport
:每个目的端口为一个匹配项;
--hashlimit-htable-size
:设置哈希表的元值;--hashlimit-htable-max
:设定哈希表入口最大数量;
三、示例介绍
3.1 实例一
iptables -A INPUT -p tcp --dport 1234 -m hashlimit --hashlimit-name HashLimitName --hashlimit 1/sec --hashlimit-burst 1 --hashlimit-mode srcip -j ACCEPT |
上述实例解释信息为:
- 为所有访问本机 1234 端口的不同IP建立一个匹配项;
- 匹配项对应的令牌桶容量为10;
- 令牌产生速率为5个每秒;
- 放行通过匹配的数据包;
- 丢弃所有其它访问本机 1234 端口的数据包;
3.2 实例二
iptables -N DEFLOOD |
- 建立了一个自定义的处理链;
- 所有来自于 192.168.1.2/24 网段的并且打算新建网络连接的数据包,都进入 DEFLOOD 链处理 ;
- 在 DEFLOOD 链中,为每个IP建立一个匹配项,对应令牌桶容量为10,产生速率为10个每秒;
- 放行通过匹配的数据包;
- 在 DEFLOOD 链中丢弃所有其它的数据包 ;