如何使iptables规则过期?


18

有人告诉我这是可能的,但我在Google或手册页上找不到任何内容。

我需要在一段时间内禁止IP,然后才自动将其取消禁止。

Answers:


18

据我所知,如果您要让iptables完全完全删除该规则,则将无法执行。目的是什么?如果您需要某种自动临时禁止,则标准解决方案是fail2ban

或者,您可以使用cron作业来删除要添加的规则,或者,如果要以交互方式执行,最好使用一个at作业:

iptables -I INPUT -s 192.168.1.100 -j DROP
echo "iptables -D INPUT -s 192.168.1.100 -j DROP" | at @10pm 

还可以看一下recentiptables 的模块。--seconds根据您的实际需求,此选项可能会有所帮助。man iptables了解更多信息。


哦,哇,“工作”看起来很棒。我可以将它与nohup和&结合使用吗?怎么样?
HappyDeveloper 2011年

无需使用nohup-at作业独立于用于创建它的终端执行。顺便说一下,这意味着它在不继承您的环境变量的shell中运行,并且/bin/sh默认情况下是这样。但这在这种情况下可能不会成为问题。
Eduardo Ivanec

9

在规则中加上时间戳(可能是从纪元开始的秒数)。定期扫描过期的规则。

请注意,最新的linux内核支持将IP地址动态加载到由iptable规则而非直接iptables规则查询的高速缓存中。

例:

iptables  -A INPUT -s 192.168.200.100/32 -m comment --comment "expire=`date -d '+ 5 min' +%s`" -j DROP 
iptables -L INPUT -n --line-numbers | tac | perl -ne 'next unless /(^\d+).*expire=(\d+)/; if ($2 < time) { print "iptables -D INPUT $1\n"; }'

当然iptables -D INPUT $1,您可以代替打印命令。


好点子。我不确定会怎么做,我会在想..
HappyDeveloper

+1非常好的主意,也许不是最简单的方法,但绝对是整洁的方法。
凯尔·史密斯

1
@HappyDeveloper:提供了添加/清除的示例
赛斯·罗伯森,

1
哈哈我也必须这样做,我使用awk进行清理:iptables -L FORWARD --line-numbers | sort -r | awk 'substr($8,1,4) == "exp@" && substr($8,5) < systime() { systems("iptables -D FORWARD " $1) }'规则如下:iptables -A FORWARD -j DROP -m comment --comment "exp@EPOCH"
凯尔·史密斯

我在perl中的2美分:iptables -L FORWARD --line-numbers | tac | perl -walne 'system "iptables -D FORWARD $F[0]" if $F[-2] =~ /^expire=(\d+)$/ and $1<time()'
tuomassalo '16

5

iptables提供了一种在满足用户定义条件的情况下将IP地址自动添加到列表的方法。我使用以下内容来帮助避免对我的ssh端口进行自动黑客攻击:

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name ssh --seconds 60 --reap -j DROP

通过将来自同一IP地址的连接尝试限制为每60秒一次,这有助于限制自动尝试访问服务器。

如果要在一个时间范围内允许设置尝试次数,例如5分钟内进行4次尝试,并且在失败时将其列入较长时间(例如24小时)的黑名单中,则可以执行以下操作:

iptables -X black
iptables -N black
iptables -A black   -m recent --set   --name blacklist   -j DROP

iptables -X ssh
iptables -N ssh
iptables -I ssh 1   -m recent --update    --name blacklist   --reap   --seconds 86400     -j DROP
iptables -I ssh 2   -m recent --update    --name timer       --reap   --seconds   600     --hitcount 4   -j black
iptables -I ssh 3   -m recent --set       --name timer   -j ACCEPT

iptables -A INPUT   -p TCP --dport ssh   -m state --state NEW -j ssh

在上面,我们创建了2个链;“ ssh”和“ black”,以及2个列表;“计时器”和“黑名单”。

简短地; 上面显示的最后一个链是ssh链的“门口”。

  • ssh链中的规则1检查源IP是否在列表“ blacklist”中。如果是这样,则会断开连接,并重新启动24小时黑名单计时器。如果规则1为假,则转到规则2。
  • ssh链中的规则2检查以查看源IP在5分钟内是否进行了4次以上的连接尝试。如果是这样,它将数据包发送到链“ black”,在链中将其添加到列表“ blacklist”。然后,链“ black”将连接断开,我们就完成了。
  • 仅当规则1和2为假时,才达到“ ssh”链中的规则3。如果是这样,则该数据包被接受,并且源IP被添加到列表“计时器”中,因此我们可以监视连接尝试的频率。

“ --reap”选项告诉内核搜索列表并清除任何早于设置时间限制的项目;列表“计时器”为5分钟,列表“黑名单”为24小时。

注意:多余的空格用于提高可读性,并且在Shell脚本中是可选的。


3

IPTables为此具有明确的功能:IP集。您只需制定一次规则,它就会像往常一样继续存在,但是会检查一组ips(或端口)中是否存在匹配项。很酷的一点是,可以在不干扰防火墙其余部分的情况下动态,有效地更新此集合。

主要网站实例

因此,要使用它,您仍然必须使用atcron计划删除。



2

正如有人已经说过的:您应该使用ipset来实现此功能。

ipset可以添加具有超时值的IP地址。超时结束后,记录将自动从ipset中删除。

timeout All set types supports the optional timeout parameter when creating a set and adding entries. The value of the timeout parameter for the create command means the default timeout value (in seconds) for new entries. If a set is created with timeout support, then the same timeout option can be used to specify non-default timeout values when adding entries. Zero timeout value means the entry is added permanent to the set. The timeout value of already added elements can be changed by readding the element using the -exist option. Example: ipset create test hash:ip timeout 300 ipset add test 192.168.0.1 timeout 60 ipset -exist add test 192.168.0.1 timeout 600

http://ipset.netfilter.org/ipset.man.html

这是控制此行为的首选方法。


0

我需要在一段时间内禁止IP,然后才自动将其取消禁止。

您可以尝试以下一种

# iptables -I INTPUT -s xxx.xxx.xxx.xxx -m time --utc --datestart 2013-09-09T15:00 --datestop 2013-09-09T15:30 -j DROP

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.