IPtables recent模块

2018年11月16日 0 作者 oceansw

recent v1.2.11 options:
[!] –set                       Add source address to list, always matches.
[!] –rcheck                    Match if source address in list.
[!] –update                    Match if source address in list, also update last-seen time.
[!] –remove                    Match if source address in list, also removes that address from list.
–seconds seconds           For check and update commands above.
Specifies that the match will only occur if source address last seen within
the last ‘seconds’ seconds.
–hitcount hits             For check and update commands above.
Specifies that the match will only occur if source address seen hits times.
May be used in conjunction with the seconds option.
–rttl                      For check and update commands above.
Specifies that the match will only occur if the source address and the TTL
match between this packet and the one which was set.
Useful if you have problems with people spoofing their source address in order
to DoS you via this module.
–name name                 Name of the recent list to be used.  DEFAULT used if none given.
–rsource                   Match/Save the source address of each packet in the recent list table (default).
–rdest                     Match/Save the destination address of each packet in the recent list table.
ipt_recent v0.3.1: Stephen Frost .  http://snowman.net/projects/ipt_recent/

recent
Allows you to dynamically create a list of IP addresses and then match against that list  in  a  few  different
ways.

For  example,  you  can create a `badguy’ list out of people attempting to connect to port 139 on your firewall
and then DROP all future packets from them without considering them.

–name name
Specify the list to use for the commands. If no name is given then ‘DEFAULT’ will be used.

[!] –set
This will add the source address of the packet to the list. If the source  address  is  already  in  the
list,  this will update the existing entry. This will always return success (or failure if `!’ is passed
in).

[!] –rcheck
Check if the source address of the packet is currently in the list.

[!] –update
Like –rcheck, except it will update the “last seen” timestamp if it matches.

[!] –remove
Check if the source address of the packet is currently in the list  and  if  so  that  address  will  be
removed from the list and the rule will return true. If the address is not found, false is returned.

[!] –seconds seconds
This  option  must  be used in conjunction with one of –rcheck or –update. When used, this will narrow
the match to only happen when the address is in the list and was seen within the last  given  number  of
seconds.

[!] –hitcount hits
This  option  must  be used in conjunction with one of –rcheck or –update. When used, this will narrow
the match to only happen when the address is in the list and packets had been received greater  than  or
equal  to the given value. This option may be used along with –seconds to create an even narrower match
requiring a certain number of hits within a specific time frame.

–rttl This option must be used in conjunction with one of –rcheck or –update. When used,  this  will  narrow
the  match to only happen when the address is in the list and the TTL of the current packet matches that
of the packet which hit the –set rule. This may be useful if you have problems with people faking their
source  address in order to DoS you via this module by disallowing others access to your site by sending
bogus packets to you.

解决具体问题:限制 ssh 猜密码,对每个 IP 允许三分钟内允许有 5 次 TCP 的 NEW 请求

iptables -A INPUT -p tcp –dport 22 -m state –state NEW -m recent –name ROUTER-SSH –update –seconds 180 –hitcount 10 -j REJECT –reject-with tcp-reset

iptables -A INPUT -p tcp –dport 22 -m state –state NEW -m recent –name ROUTER-SSH –set -j ACCEPT

  本文只是利用iptables的recent模块来抵御简单的DOS攻击。下面以限制ssh远程连接为例,具体步骤如下:
  (1)#iptables -I INPUT -p tcp –dport 22 -m connlimit –connlimit-above 3 -j DROP
  (2)#iptables -I INPUT  -p tcp –dport 22 -m state –state NEW -m recent –set –name SSH
  (3)#iptables -I INPUT  -p tcp –dport 22 -m state –state NEW -m recent –update –seconds  300 –hitcount 3 –name SSH -j DROP
  以上三条规则的解释如下:
  1.利用connlimit模块将单IP的并发设置为3;会误杀使用NAT上网的用户,可以根据实际情况增大该值;
  2.利用recent和state模块限制单IP在300s内只能与本机建立3个新连接。被限制一分钟后即可恢复访问。 
  3.第一句是记录访问tcp 22端口的新连接,记录名称为SSH
   –set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目
  4.第三句是指SSH记录中的IP,300s内发起超过3次连接则拒绝此IP的连接。
   –update 是指每次建立连接都更新列表;
   –seconds必须与–update同时使用
   –hitcount必须与–update同时使用
  5.可以使用下面的这句记录日志:
   iptables -A INPUT -p tcp –dport 22 -m state –state NEW -m recent –update –name SSH –second 300 –hitcount 3 -j LOG –log-prefix “SSH Attack”

  本文只是利用iptables的recent模块来抵御简单的DOS攻击。下面以限制ssh远程连接为例,具体步骤如下:
(1)#iptables -I INPUT -p tcp –dport 22 -m connlimit –connlimit-above 3 -j DROP
(2)#iptables -I INPUT  -p tcp –dport 22 -m state –state NEW -m recent –set –name SSH
(3)#iptables -I INPUT  -p tcp –dport 22 -m state –state NEW -m recent –update –seconds  300 –hitcount 3 –name SSH -j DROP
以上三条规则的解释如下:
1.利用connlimit模块将单IP的并发设置为3;会误杀使用NAT上网的用户,可以根据实际情况增大该值;
2.利用recent和state模块限制单IP在300s内只能与本机建立3个新连接。被限制一分钟后即可恢复访问。
3.第一句是记录访问tcp 22端口的新连接,记录名称为SSH
–set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目
4.第三句是指SSH记录中的IP,300s内发起超过3次连接则拒绝此IP的连接。
–update 是指每次建立连接都更新列表;
–seconds必须与–update同时使用
–hitcount必须与–update同时使用
5.可以使用下面的这句记录日志:
iptables -A INPUT -p tcp –dport 22 -m state –state NEW -m recent –update –name SSH –second 300 –hitcount 3 -j LOG –log-prefix “SSH Attack”

iptables模块介绍:recent

 

  本文只是利用iptables的recent模块来抵御简单的DOS攻击。下面以限制ssh远程连接为例,具体步骤如下:
(1)#iptables -I INPUT -p tcp –dport 22 -m connlimit –connlimit-above 3 -j DROP
(2)#iptables -I INPUT  -p tcp –dport 22 -m state –state NEW -m recent –set –name SSH
(3)#iptables -I INPUT  -p tcp –dport 22 -m state –state NEW -m recent –update –seconds  300 –hitcount 3 –name SSH -j DROP
以上三条规则的解释如下:
1.利用connlimit模块将单IP的并发设置为3;会误杀使用NAT上网的用户,可以根据实际情况增大该值;
2.利用recent和state模块限制单IP在300s内只能与本机建立3个新连接。被限制一分钟后即可恢复访问。
3.第一句是记录访问tcp 22端口的新连接,记录名称为SSH
–set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目
4.第三句是指SSH记录中的IP,300s内发起超过3次连接则拒绝此IP的连接。
–update 是指每次建立连接都更新列表;
–seconds必须与–update同时使用
–hitcount必须与–update同时使用
5.可以使用下面的这句记录日志:
iptables -A INPUT -p tcp –dport 22 -m state –state NEW -m recent –update –name SSH –second 300 –hitcount 3 -j LOG –log-prefix “SSH Attack”

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