• 进入"运维那点事"后,希望您第一件事就是阅读“关于”栏目,仔细阅读“关于Ctrl+c问题”,不希望误会!

Iptables防攻击模块介绍(五)

安全管理 彭东稳 8年前 (2015-11-25) 27093次浏览 已收录 0个评论

 Limit模块

用于限制匹配数据包的频率或速率,Limit的工作方式就像一个单位大门口的保安,当有人要进入时,需要找他办理通行证。早上上班时,保安手里有一定数量的通行证,来一个人,就签发一个,当通行证用完后,再来人就进不去了,但他们不会等,而是到别的地方去(在iptables里,这相当于一个包不符合某条规则,就会由后面的规则来处理,如果都不符合,就由缺省的策略处理)。但有个规定,每隔一段时间保安就要签发一个新的通行证。这样,后面来的人如果恰巧赶上,也就可以进去了。如果没有人来,那通行证就保留下来,以备来的人用。如果一直没人来,可用的通行证的数量就增加了,但不是无限增大的,最多也就是刚开始时保安手里有的那个数量。也就是说,刚开始时,通行证的数量是有限的,但每隔一段时间就有新的通行证可用。limit match有两个参数就对应这种情况,–limit-burst指定刚开始时有多少通行证可用,–limit指定要隔多长时间才能签发一个新的通行证。要注意的是,我这里强调的是“签发一个新的通行证”,这是以iptables的角度考虑的。在你自己写规则时,就要从这个角度考虑。比如,你指定了–limit 3/minute –limit-burst 5 ,意思是开始时有5个通行证,用完之后每20秒增加一个(这就是从iptables的角度看的,要是以用户的角度看,说法就是每一分钟增加三个或者每分钟只能过三个)。你要是想每20分钟过一个,只能写成–limit 3/hour –limit-burst 5,也就是说你要把时间单位凑成整的。

实例

然后从另一部主机上ping这部主机,就会发生如下的现象:首先可以看到前四个包的回应都很正常,然后从第五个包开始,我们每10秒可以收到一个正常的回应。这是因为我们设定了单位时间(在这里是每分钟)内允许通过的数据包的个数是每分钟6个,也即每10秒钟一个;其次我们又设定了事件触发阀值为5,所以我们的前四个包都是正常的,只是从第五个包开始,限制规则开始生效,故只能每10秒收到一个正常回应。

假设我们停止ping,30秒后又开始ping,这时的现象是:前两个包是正常的,从第三个包开始丢包,这是因为在这里我的允许一个包通过的周期是10秒,如果在一个周期内系统没有收到符合条件的包,系统的触发值就会恢复1,所以假如我们30秒内没有符合条件的包通过,系统的触发值就会恢复到3,假如5个周期内都没有符合条件的包通过,系统都触发值就会完全恢复。

防止Syn Flood攻击

Connlimit模块

允许你限制每个客户端ip的并发连接数,即每个ip同时连接到一个服务器个数。其中:

实例

1.允许每个客户机同时3个SSH连接.

2.只允许每组C类IP同时3个SSH连接.

3.只允许每个IP同时5个80端口转发,超过的丢弃.

4.防止DOS太多连接进来,那么可以允许最多15个初始连接,超过的丢弃.

Recent模块

可以看作是iptables里面维护了一个地址列表,这个地址列表可以通过”–set”、”–update”、”–rcheck”、”–remove”四种方法来修改列表,每次使用时只能选用一种。还可附带”–name”参数来指 定列表的名字(默认为DEFAULT),“–rsource”、“–rdest”指示当前方法应用到数据包的源地址还是目的地址(默认是前者)。

recent语句都带有布尔型返回值,每次执行若结果为真,则会执行后续的语句,比如“-j ACCEPT”之类的。

对于实现前面提到的功能,还需要额外的参数。“–second”限制包地址被记录进列表的时间要小于等于后面的时间。另外,还有”–hitcount”、”–rttl”,显然是可以有其他高级的play

基于上面的说明,现在来看四个基本方法的作用:

–set将地址添加进列表,并更新信息,包含地址加入的时间戳。

–rcheck检查地址是否在列表。

–updatercheck一样,但会刷新时间戳。

–remove就是在列表里删除地址,如果要删除的地址不存在就会返回假。

实例

1.限制每IP在一分钟内最多对服务器只能有3个SSH连接(注意三条语句的顺序)

第一条,可以使用这一条记录攻击日志,不想记录日志就不用(默认在/var/log/message)。
第二条,对于SSH中记录的IP,60s内发起超过3次新连接请求则拒绝此IP在300s内的连接。60s之后才能再次发起新请求。(–update指每次建立连接都更新列表)。
第三条,记录访问tcp 22端口的新连接,记录文件名称为SSH;–set记录数据包的来源IP,如果IP已经存在将更新已经存在的条目(SSH文件存在于内存中“/proc/net/xt_recent/SSH”)。

2.限制无法ssh直接连接服务器,需先用较大包ping一下,此时在15秒内才可以连接上.

第一条,将INPUT链默认策略置为DROP,当包走完INPUT链而没被拿走时就会丢弃掉;

第二条,本地localhost的包全部接受。

第三条,对于已建立连接或是与已连接相关的包都接受,服务器对外连接回来的包一般都走这条;基本环境已经配好了,现在开始要为连接到服务器的ssh打开通路。

第四条,指定包大小为128字节;recent用的列表名称为SSHOPEN,列表记录源地址。符合上述条件的数据包都接收。如果ping包内容为100字节,则加上IP头、ICMP头的28字节,总共128字节。

第五条,接受一般的ping包。

第六条,对连接ssh 22端口的连接进行处理,来源于SSH源地址列表并且在列表时间小于等于15秒的才放行。

测试:无法SSH直接连接服务器,使用“ping -l 100 服务器IP ”后,15秒内就可以SSH连接服务器了。


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (3)
[资助本站您就扫码 谢谢]
分享 (0)

您必须 登录 才能发表评论!