iptables(5)常用扩展模块iprange、string、time、connlimit、limit

简介

        之前我们已经介绍过扩展模块的简单使用,比如使用-m tcp/udp ,-m multiport参数通过--dports,--sports可以设置连续和非连续的端口范围。那么我们如何匹配其他的一些参数呢,比如源地址范围,目的地址范围,时间范围等,这就是我们这篇文章介绍的内容。

iprange扩展模块

在不使用任何扩展模块的情况下,使用-s选项或者-d选项即可匹配报文的源地址与目标地址,而且在指定IP地址时,可以同时指定多个IP地址,每个IP用”逗号”隔开,但是,-s选项与-d选项并不能一次性的指定一段连续的IP地址范围,如果我们需要指定一段连续的IP地址范围,可以使用iprange扩展模块。

iprange扩展模块中有两个扩展匹配条件可以使用,--src-range,--dst-range两个选项分别用于匹配报文的源地址所在范围与目标地址所在范围。

通过-m参数使用扩展模块iprange,然后通过--src-range指定源IP地址范围,范围之间通过-符号连接,当然也可以通过!符号进行取反,大家需要多做测试,举一反三
目的地址--dst-range前面有!,即标识目的地之不是192.168.151.1-192.168.151.20这个范围的

string扩展模块

使用string扩展模块,可以指定要匹配的字符串,如果报文中包含对应的字符串,则符合匹配条件。

为了更好的介绍效果,我现在我的Debian系统上安装web服务,以便更好的展示字符串匹配的效果。

安装apache2

安装apache2服务
服务已经启动
在/var/www/html目录下创建index1.html文件
此时通过192.168.140.248可以正常访问140.250 web服务中的该文件

配置string

’-m string’表示使用string模块,’–algo bm’表示使用bm算法去匹配指定的字符串,’ –string “test” ‘则表示我们想要匹配的字符串为”test”
在iptables命令中,当使用-m string模块时,可以使用--algo选项来指定搜索算法。这里有两个可选项:

--algo bm:指定使用Boyer-Moore算法进行搜索。
--algo kmp:指定使用Knuth-Morris-Pratt算法进行搜索。
Boyer-Moore(bm)算法:
    1.是一种高效的字符串搜索算法,特别适用于长模式串的搜索。
    2.通过预计算两个跳转表(坏后缀表和好后缀表)来减少不必要的比较,从而提高搜索效率。
    3.在iptables的string模块中,这是默认的搜索算法。
Knuth-Morris-Pratt(kmp)算法:
    1.也是一种高效的字符串搜索算法,由Donald Knuth、James H. Morris和Vaughan Pratt共同发明。
    2.该算法利用已经部分匹配这个信息,避免重新检查字符的重复部分,从而在文本串中搜索一个词(或其他模式)的所有出现位置。
    3.在iptables的string模块中,可以作为可选的搜索算法。

那么上述的配置会生效吗?

此时通过140.248去访问140.250,发现依旧可以进行访问,也就是说上面配置的策略并没有生效。
可以看到,没有匹配到任何的数据包,这是为什么呢?

没有匹配到任何数据包,我们设置的策略没有生效的原因是因为,当我们通过140.248去访问140.250的时候,这是个request过程,也就是请求发送到140.250,然后140.250主机返回数据。也就是说数据包进入iptables的INPUT链的时候是请求数据包,请求中没有任何test相关参数。而主机响应的数据包是不通过INPUT链的。

我们可以回顾下前面文章描述的数据包处理过程:

上图中,是iptables处理数据包的过程由本机发出的数据包是不会经过input链的,所以我们配置的规则应用在INPUT链上是没有效果的。

重新配置规则,将规则应用在OUTPUT链上,注意,由于是由本机响应的,那么源地址就不能是192.168.140.248了,而是到达目的地址为192.168.140.248的数据包包含test参数,匹配上后会被REJECT
此时无法查看该文件
该条目也匹配上了对应的数据包

time扩展模块

可以通过time扩展模块,根据时间段区匹配报文,如果报文到达的时间在指定的时间范围以内,则符合匹配条件。

-m time表示使用time扩展模块,--timestart选项用于指定起始时间,--timestop选项用于指定结束时间。

上图中,从源10.1.1.1来的tcp数据包目的端口为80的,在8:00-12:00范围内会被REJECT

上面是基于时间的,可以设置基于星期的策略

 通过--weekdays参数设置

通过--weekdays可以匹配一周的具体某天,数字1-7代表从星期一到星期天,根据自己的需求设置对应的日期

星期可以和每天的具体时间联合使用,如下:

图中表示每个星期1-3,12-14点该策略生效

基于月份的策略

通过--monthdays设置

每个月的15,16,17号生效

当然可以将月份和星期联合起来

上图所示,当月份和星期一起的时候标识,每个月的星期1,并且要在每月的15/16/17号其中的某一天时才回生效

设置日期范围

除了使用–weekdays选项与–monthdays选项,还可以使用–datestart 选项与-datestop选项,指定具体的日期范围

指定具体的日期范围,可以根据自己的需求进行指定

注意:在上述的参数中,只有--monthdays --weekdays可以前面增加!参数进行取反,其他的参数不能取反。更多的参数组合,需要大家根据自己的需求自行探索设置。

connlimit扩展模块

connlimit扩展模块,可以限制每个IP地址同时链接到server端的链接数量,注意:不用指定IP,其默认就是针对”每个客户端IP”,即对单IP的并发连接数限制。

通过-m connlimit进行对应的设置

-m connlimit 的一些常用参数及其说明:

--connlimit-above n #限制为多少个。这个参数用于指定超过多少个连接时,iptables 应该执行相应的动作(如 REJECT、DROP 等)。

--connlimit-mask bits #这组主机的掩码。默认是 --connlimit-mask 32,即每个 IP 地址都被单独考虑。通过减小掩码值,可以指定一个更大的 IP 地址范围,以便在这个范围内共享连接数限制。

--connlimit-upto n #如果现有连接数小于或等于设置的并发连接数值,那么就放行。
上图中含义为到达本机80端口的每个ip的连接数为10,如果超过就会被REJECT,注意在显示的详细信息中有srv/32,因为默认是基于32位掩码的,即是基于主机ip地址的
可以通过--connlimit-mask参数指定掩码范围,即在一个C类网段中的最大连接数是10
图中我们使用了! --connlimit-above进行取反,意思是连接数不大于100,不取反表示大于100,取反后表示不大于100即小于等于100,注意最后的动作是ACCEPT,即连接数小于等于100,匹配tcp端口号443的匹配上该规则,动作是ACCEPT
--connlimit-upto表示小于等于50,就相当于上面的! --connlimit-above参数,表示的是一个含义

 limit扩展模块

limit模块是对”报文到达速率”进行限制的。如果我想限制单位时间内流入的包的数量,就能用limit模块,可以以秒为单位进行限制,也可以以分钟、小时、天作为单位进行限制。

具体参数如下

-m limit 的参数解释和介绍:

主要参数
--limit
描述:设置最大平均匹配速率。
格式:--limit rate[/second|/minute|/hour|/day]
示例:
--limit 1000/s:设置最大平均匹配速率为每秒 1000 个数据包。
--limit 5/m:设置最大平均匹配速率为每分钟 5 个数据包。

--limit-burst
描述:表示一开始能匹配的数据包数量。一旦达到此数量,将开始应用 --limit 指定的速率限制。每匹配到一个数据包,--limit-burst 的值减 1。当值为 0 时,必须等待一段时间(基于 --limit 的速率),才能再次匹配数据包。
格式:--limit-burst number
要点:
--limit-burst 的值要比 --limit 的值大。
默认情况下,--limit-burst 的值会随时间恢复(基于 --limit 的速率)。
示例:--limit-burst 15:一开始能匹配的数据包数量为 15 个。

我们想要限制外部主机对本机进行ping操作时,本机最多每5秒中放行一个ping包,那么,我们可以进行如下设置

上图中,我们设置每分钟允许12个icmp数据包,那么基本上是5秒放行一个icmp数据包,但是直接配置后,我们去测结果是没有效果的,原因是,当进行匹配的时候,比如第6秒没有匹配上,那么就会依次往下匹配,我们的默认动作是放行所有,所以直接ping,看不到任何效果。需要在这条后天插入一条icmp的拒绝策略
在第一条后面插入一条icmp的REJECT策略
此时ping,我们就会发现中间会出现unreachable,每隔4个数据包一次,因为我们是没5个数据包匹配一次icmp

如果此时观察上面的图就会发现,为什么前面有6个数据包都是通的,我们不是设置了5个数据包匹配一次吗?

其实当我们配置了--limit参数后,会默认配置上一个--limit-burst,当该值匹配完成后才回轮到--limit进行匹配。

这里的默认值是5,于是先匹配5个数据包,然后在进行匹配,就会出现前面有6个数据包是通的情况
通过-R参数修改我们上面第一个条目,将burst设置为10,那么我们再去ping的时候,就会放行更多的数据包,注意此时去ping,你看到的现象不是10+1个先通的数据包这样,因为算法不是简单的相加。

 limit模块使用了令牌桶算法,我们这里简单说一下这个算法。

通过控制令牌产生的速率和令牌桶的容量,实现对数据流量的限制。我们可以想象一下,有一个桶,桶里面放了10块令牌,而且这个桶最多也只能放下10块令牌,所有报文如果想要进来,都必须要有桶中的令牌才行。然后这个桶可以自己生成令牌,就是每隔5秒钟会生成一块新的令牌,如果此时,桶中的令牌不足10块,那么新生成的令牌就存放在桶中,如果桶中已经存在10块令牌,新生成的令牌就只能溢出桶(令牌被丢弃),如果此时有10个报文想要进来,那么这10个报文就去桶里找令牌,正好一人一个,此时桶空了(真的空了吗?)。

请大家注意一个问题,每隔5秒会生成令牌,举例来说我1秒拿走一个令牌,到第5秒,桶里面剩下5个令牌,但是每5秒生成一个令牌,其实桶里还有6个令牌。那么按照顺序,我们继续拿令牌,再过5秒,我又拿走5个令牌,桶里剩下的应该是2个令牌。继续拿走令牌拿走2个,花费2秒,那么此时桶里没有令牌了,需要等待3秒钟才会有新的令牌,那么此时3秒数据包是无法进入的。

3秒钟后新的令牌产生,一个数据包拿走令牌后,桶里又没有令牌了,那么此时需要等待4秒,因为第5秒才会有新的令牌生成,也就是从此时开始,每隔4秒才能有一个数据包进入。

在我们这个例子中,我们有一个这个桶里最多可以放置多少个令牌就是通过--limit-burst来设置的,而给桶里放置令牌的速度是通过--limit来设置的

此时我们ping的时候就会产生这种结果,对应我们上面的令牌桶算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Monster✺◟(∗❛ัᴗ❛ั∗)◞✺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值