iptables常用模块介绍

iptables模块介绍:connlimit

 转自:http://www.cszhi.com/20120510/iptables-modules-connlimit.html

connlimit模块允许你限制每个客户端ip的并发连接数,即每个ip同时连接到一个服务器个数。
connlimit模块主要可以限制内网用户的网络使用,对服务器而言则可以限制每个ip发起的连接数。

参数:

--connlimit-above n 限制为多少个
--connlimit-mask n 这组主机的掩码,默认是connlimit-mask 32 ,即每ip.


例:
#允许每个客户机同时两个telnet连接

iptables -A INPUT -p tcp --syn --dport 23 -m connlimit --connlimit-above 2 -j REJECT
或
iptables -A INPUT -p tcp --syn --dport 23 -m connlimit ! --connlimit-above 2 -j ACCEPT

#只允许每组C类ip同时16个http连接

iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 16 --connlimit-mask 24 -j REJECT

#只允许每个ip同时5个80端口转发,超过的丢弃:

iptables -I FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 5 -j DROP

#只允许每组C类ip同时10个80端口转发:

iptables -I FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 --connlimit-mask 24 -j DROP

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

iptables -A INPUT -s 192.186.1.0/24 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP
iptables -A INPUT -s 192.186.1.0/24 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT



iptables模块介绍:limit

转自:http://www.cszhi.com/20120510/iptables-modules-limit.html

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,也就是说你要把时间单位凑成整的。

例如设置以下规则:

iptables -A INPUT -p icmp -m limit --limit 6/m --limit-burst 5 -j ACCEPT
iptables -A INPUT -p icmp -j DROP

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

例:
防止SYN-Flood 碎片攻击

iptables -N syn-flood
iptables -A syn-flood -m limit –limit 100/s –limit-burst 150 -j RETURN
iptables -A syn-flood -j DROP
iptables -I INPUT -j syn-flood



iptables模块介绍:recent

转自:http://www.cszhi.com/20120510/iptables-modules-recent.html

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

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

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

基于上面的说明,现在来看四个基本方法的作用:
–set将地址添加进列表,并更新信息,包含地址加入的时间戳。–rcheck检查地址是否在列表。–update跟rcheck一样,但会刷新时间戳。–remove就是在列表里删除地址,如果要删除的地址不存在就会返回假。

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

iptables -P INPUT DROP
iptables -A INPUT -s 127.0.0.1/32 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -m length --length 128 -m recent --set --name SSHOPEN --rsource -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --rcheck --seconds 15 --name SSHOPEN --rsource -j ACCEPT

说明:
1. 将INPUT链默认策略置为DROP,当包走完INPUT链而没被拿走时就会丢弃掉;
2. 本地localhost的包全部接受;
3. 对于已建立连接或是与已连接相关的包都接受,服务器对外连接回来的包一般都走这条;基本环境已经配好了,现在开始要为连接到服务器的ssh打开通路。
4. icmp类型8是ping包;指定包大小为128字节;recent用的列表名称为SSHOPEN,列表记录源地址。符合上述条件的数据包都接收。如果ping包内容为100字节,则加上IP头、ICMP头的28字节,总共128字节。
5. 接受一般的ping包;
6. 对连接ssh 22端口的连接进行处理,来源于SSHOPEN源地址列表并且在列表时间小于等于15秒的才放行。

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

#限制每ip在一分钟内最多对服务器只能有8个http连接

iptables -I INPUT -p tcp --dport 80 -d 199.15.25.116 -m state --state NEW -m recent --name httpuser --set
iptables -A INPUT -m recent --update --name httpuser --seconds 60 --hitcount 9 -j LOG --log-prefix 'HTTP attack: '
iptables -A INPUT -m recent --update --name httpuser --seconds 60 --hitcount 9 -j DROP

说明:
199.15.25.116是服务器ip

1. -I,将本规则插入到 INPUT 链里头的最上头。只要是 TCP连接,目标端口是80,目标 IP是我们服务器的IP,刚刚新被建立起来时,我们就将这个联机列入 httpuser 这分清单中;
2. -A,将本规则附在 INPUT 链的最尾端。只要是60秒内,同一个来源连续产生多个联机,到达第9个联机时,我们对此联机留下Log记录。记录行会以 HTTP attack 开头。每一次的本规则比对, –update 均会更新httpuser清单中的列表;
3. -A,将本规则附在 INPUT 链的最尾端。同样的比对条件,但是本次的动作则是将此连接丢掉;
4. 所以,这三行规则表示,我们允许一个客户端,每一分钟内可以接上服务器8个。具体数值可以看管理者决定。这些规则另外也可以用在其它对外开放的网络服务上,例如 port 22 (SSH), port 25 (smtp email)。

#对连接到本机的SSH连接进行限制,每个IP每小时只限连接5次

-A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --rcheck --seconds 3600 --hitcount 5 -j DROP
-A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --set -j ACCEPT



状态检测的包过滤
-m state 
      --state {NEW,ESTATBLISHED,INVALID,RELATED}  指定检测那种状态
-m multiport 指定多端口号
      --sport
      --dport
      --ports
-m iprange 指定IP段
      --src-range ip-ip
      --dst-range ip-ip
-m connlimit 连接限定
      --comlimit-above # 限定大连接个数
-m limit 现在连接速率,也就是限定匹配数据包的个数
      --limit  指定速率
      --limit-burst # 峰值速率,最大限定
-m string 按字符串限定
      --algo bm|kmp  指定算法bm或kmp
      --string "STRING" 指定字符串本身
 





转载于:https://my.oschina.net/lenglingx/blog/638944

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值