【Iptables】05 Iptables常用的匹配扩展模块

特别说明:此系列博文根据 朱双印博客-iptables系列博文,个人实践后总结,此为个人笔记精简版,更通俗易懂请参考 朱双印博客-iptables系列博文 原文内容,诸君必能有所收获

05 Iptables常用的匹配扩展模块

我们已经了解了扩展匹配端口的模块,那么还有那些扩展模块会经常用到的呢?

iprange扩展模块

前面我们用到了与端口相关的扩展匹配条件,使我们能够指定连续的,不连续的端口,保证了我们端口指定匹配条件的需求,那么有没有扩展匹配条件关于IP的呢,使我们不用逗号去连接一系列连续的IP;这时我们就要用到新的扩展模块iprange了,iprange扩展模块主要针对"一段连续的IP地址范围",分为指定连续源地址IP的 --src-range 选项和指定连续目标地址IP的 --dst-range 选项,现在看一下示例吧

iptables -t filter -I INPUT -m iprange --src-range 192.168.200.115-192.168.200.120 -j DROP
在这里插入图片描述我们使用 -m 选项指定了扩展模块,使用短横线来连接IP段的始末, --src-range 来指定这是一段连续IP段,同样的我们也可以使用 ! 取反

string扩展模块

从名字可以看出,这是一个与字符串相关的扩展模块,实际上的确是你想的那样,该扩展模块用于匹配报文中包含某些字符,以便我们制定动作

为了验证此模块的作用,我们需要在另一台主机的默认页面目录添加两个html页面,内容我这里分别写入hello和world,开启这台主机的http服务,在本机curl ,查看是否能访问这两个页面,能访问后,添加iptables规则如下

iptables -t filter -I INPUT -m string --algo bm --string "hello" -j REJECT

这是一条拒绝报文中含有字符串"hello"访问本机的规则,再次访问两个页面,查看一下效果
在这里插入图片描述
上面,我们用到了扩展模块string,使用了 -m 选项,命令中 --algo bm 表示使用bm算法去匹配指定的字符串;另外的 --string “hello” 表示我们要匹配的字符串为 hello ,可以看到,由于hello.html页面里含有hello字符串,所以此报文被通过,总结一下

  • –algo:用于匹配指定字符串的算法,可选的算法有bm 和 kmp ,此选项为必选项,我们使用时随便指定一个算法即可
  • –string :用于指定匹配的字符串
time扩展模块

还是一样的,看见这个扩展模块的名字,我们知道这个模块是和时间有联系的;该模块主要用于根据时间段区来匹配报文,如果报文到达的时间在指定时间范围内,则符合匹配条件

比如,我们想本机在时间段00:00到02:00不能访问网页,我们需要在OUTPUT链定义规则

iptables -I OUTPUT -p tcp --dport 80 -m time --timestart 00:00 --timestop 02:00 -j REJECT

iptables -I OUTPUT -p tcp --dport 443 -m time --timestart 00:00 --timestop 02:00 -j REJECT

上述的规则里面,用到了 -m time ,指定time扩展模块,用到了 --timestart 和 --timestop 选项,分别代表时间段的起始时间和结束时间

时间的格式是多样的,除了小时时间段,星期用规则匹配怎么办?我们可以使用如下规则

iptables -I OUTPUT -p tcp --dport 80 -m time --weekdays 6,7 -j REJECT

上述规则表示拒绝周六和周日向任意IP地址的80端口发送报文,使用的是 time扩展模块的 --weekdays 选项,该选项后跟数字,用逗号隔开,也可以跟星期英文缩写,即 Mon、Tue、Wed、Thu、Fri、Sat、Sun

同样的,单月的时间段用规则怎么表示?

iptables -I OUTPUT -p tcp --dport 80 -m time --monthdays 14,15 -j REJECT

这条规则表示禁止在每月的14,15日禁止本机向任意目标地址的80端口发送报文

日期段怎么表示?

iptables -I OUTPUT -p tcp --dport 80 -m time --datestart 2019-02-12 --datestop 2019-03-24

上述规则表示在日期段 20190212到20190324之间的时间内,禁止向任意目标地址的80端口发送报文

不同时间匹配条件可以组合起来使用,匹配条件之间为"与"的关系,即必须同时满足才会匹配成功

iptables -I OUTPUT -p tcp --dport 80 -m time --weekdays 5 --monthdays 01,02,03 -j REJECT

上述规则表示,匹配条件必须同时满足为在01,02,03日之间,并且为星期五才会匹配成功,匹配成功后拒绝本机向任意目标地址80端发送报文

最后,比较特殊的是,时间扩展模块中只有 --monthdays 和 --weekdays才能使用 ! 取反

connlimit扩展模块

使用connlimit扩展模块,可以限制IP地址同时连接到server端的连接数量

如,我们想限制每个IP地址最多只能占用两个ssh连接远程到本机,我们可以定义规则如下

iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT

上述规则,使用了扩展模块的 --connlimit-above选项,指定了数字2,表示限制连接的上限,在由于22端口是ssh服务使用的,所以完成了我们的预想

CentOS6中可以使用 ! 对 --connlimit-above选项取反,同样的,我们要注意取反的坑,在CentOS7中,使用了另一个选项来表示取反的效果,即 --connlimit-upto 选项,效果和 ! 相同

其实,我们还能使用 --connlimit-mask 选项来限制某段IP的动作,配合着 --connlimit-above 选项,可以实现某段IP的所有IP只能有2个IP能连接本机,即

iptables -I INPUT -p tcp -m connlimit --connlimit-above 2 --connlimit-mask 24 -j REJECT

这样,在255.255.255.0掩码表示的254个IP中,只能同时存在连个IP能连接上本机

limit扩展模块

之前了解了connlimit扩展模块,它是用来限制连接数量的,那么这个limit扩展模块又是用来干嘛的?

limit模块主要用于限制报文到达速率,即限制单位时间内包流入或流出的数量,我们可以使用limit模块指定单位时间,每秒,每分钟…,比如限制每秒流入3个数据包

现在,我们想限制其他主机ping本机的操作,限制为6秒放行一个ping的数据包,可以进行如下配置

iptables -I INPUT -p icmp -m limit --limit 10/minute -j ACCEPT

上述规则,我们指定了 limit 扩展模块,使用了模块的 --limit 选项,指定 10/minute,即每分钟10个数据包,配合动作ACCEPT,完整的表示了需要每6秒钟放行一个ping 数据包,那么结果如何呢,试一下
在这里插入图片描述
结果好像不是我们想象的那样,为什么按规则来执行,只能是第6个包才会被放行的,怎么前面5个ping数据包也放行了?

我们可以再看一下规则,会发现,它表示的是,每6秒放行一个ping数据包,但是ping会每秒都往本机发送数据包,之前5秒到达本机的数据包没有规则匹配,就会被默认的策略匹配,我们的默认策略又刚好是ACCEPT,所以才导致前5秒的ping数据包也被放行了

理解了这个,我们就知道怎么做了,我们只有在INPUT链末尾加一条规则,规则匹配条件是只要是icmp协议的数据包我都不接收,这样就能达到我们限制6秒一次放行的目的,所以,添加一条规则

iptables -A INPUT -p icmp -j REJECT
在这里插入图片描述
这样,我们在来看一下结果如何吧
在这里插入图片描述
从上图中可以看到,除了前5条ping数据包有异常没有被拒绝,其他都是每隔6秒放行一次,那么为什么前面5个没有被拒绝呢?

这就要说的limit扩展模块的另一个选项, --limit-burst 选项,这个选项主要用于指定空闲时可放行的数据包的数量,在不使用该选项指定放行包的数量时,默认值为5,想要彻底弄明白为什么前5个会被放行,可以这样理解,我们设置了 --limit-burst 之后(默认5)

就如同想要豪华套餐需要排队,并且需要持有优惠券,系统有个发券的盒子,但是最多只能存放5张,现在,每个人排队摸盒子,只能摸一下,有券就会拿走,没有只能遗憾离开;由于空闲时间没人排队,系统集赞了5张放进盒子里,一下子来了很多人,大家排队摸盒子拿券,这时由于盒子里的券在第一个人拿了之后会变的少于5张,系统就会6秒生成一张,于是第1到5的人都拿到券去兑换了,第6个人一摸,盒子里还没有券,离开了,第7个人一摸,刚好是第1个人摸了之后系统经过6秒生成的券,他也去兑换了;此后,每隔6秒生成一个券,如果排队的人很多,那么之后只有6的倍数加一的人才有机会得到券,如果人少了呢?那么系统在盒子满5张的时候就会停止生成券

所以,饶了一圈,终于算是有所理解了, --limit 选项就是上述指定多久生成一张券的,–limit-burst选项是指定最多可以存放多少券的
【Iptables】iptables目录
【Iptables】06 IPtables扩展匹配条件之 “-tcp-flags”

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值