在shell脚本中的iptables块之间添加睡眠/延迟

在一台服务器上,我们试图阻止中国的访问。

我们希望用iptables而不是通过.htaccess来实现。

但是,我们遇到的问题是,当一次添加多个iptables(我们在这里讨论1000多个ip中国子网)时,会出现一个错误(错误“iptables:Unknown error 18446744073709551615”,然后所有其他的会失败),这意味着我们必须iptables -F为了继续添加这些规则。

一些testing的结论是,这个问题似乎是当试图一次运行很多(甚至一次10多个似乎抛出错误),而不是服务器只是不喜欢一些特定的规则。

所以我想知道,如果试图在每个iptables规则运行之间添加一个睡眠(或其他一些延迟),可能会改善这个过程?

我们已经尝试过多种实现这些iptables的方法,但是如果可能的话,我们希望使用下面的nixCraft中的脚本 。

 #!/bin/bash ### Block all traffic from AFGHANISTAN (af) and CHINA (CN). Use ISO code ### ISO="af cn" ### Set PATH ### IPT=/sbin/iptables WGET=/usr/bin/wget EGREP=/bin/egrep ### No editing below ### SPAMLIST="countrydrop" ZONEROOT="/root/iptables" DLROOT="http://www.ipdeny.com/ipblocks/data/countries" cleanOldRules(){ $IPT -F $IPT -X $IPT -t nat -F $IPT -t nat -X $IPT -t mangle -F $IPT -t mangle -X $IPT -P INPUT ACCEPT $IPT -P OUTPUT ACCEPT $IPT -P FORWARD ACCEPT } # create a dir [ ! -d $ZONEROOT ] && /bin/mkdir -p $ZONEROOT # clean old rules cleanOldRules # create a new iptables list $IPT -N $SPAMLIST for c in $ISO do # local zone file tDB=$ZONEROOT/$c.zone # get fresh zone file $WGET -O $tDB $DLROOT/$c.zone # country specific log message SPAMDROPMSG="$c Country Drop" # get BADIPS=$(egrep -v "^#|^$" $tDB) for ipblock in $BADIPS do $IPT -A $SPAMLIST -s $ipblock -j LOG --log-prefix "$SPAMDROPMSG" $IPT -A $SPAMLIST -s $ipblock -j DROP done done # Drop everything $IPT -I INPUT -j $SPAMLIST $IPT -I OUTPUT -j $SPAMLIST $IPT -I FORWARD -j $SPAMLIST # call your other iptable script # /path/to/other/iptables.sh exit 0 

我不是特别熟悉shell脚本,但是我不确定在这个脚本的哪一点,我可以在iptables处理之间添加某种延迟,甚至可能。 请有人指出我在正确的方向吗? 谢谢。

Netfilter / iptables在使用更多规则时不能很好地扩展,因为它们应该是按顺序匹配的。 但是自从Linux 2.6.36内核以来,有一个新的特性被称为IP集 ,这有助于通过使用散列技术来消除这些规则。 简而言之,它是如何工作的:

1)创build一个IP集

 ipset create set01 hash:net 

2)添加IP范围的设置

 ipset add set01 192.168.1.0/24 ipset add set01 192.168.2.0/24 ipset add set01 192.168.3.0/24 ipset add set01 192.168.4.0/24 ... ... 

3)使用netfilter / iptables规则连接集合,该规则拒绝来自集合set01的任何具有源IP地址的分组

 iptables -A INPUT -m set --match-set set01 src -j REJECT 

正如你所看到的,与其创build4个几乎相同的iptables规则,我创build了一个IP set01,然后我添加了一些IP范围(仅仅是一个例子,实际上可能有数百万个),最后我阻止了它们单个iptables规则。 因此,不要维护一个类似iptables规则的长列表,根据区域文件创build一个或多个IP集,然后一步阻止。

请查看相关的ipset手册页获取更多详细信息。

我同意dsumsky,你可能需要一个新的方法。 但是为了每载入4个条目延迟1秒,要插入的代码就是这样的:

 i=0 # delay iterator BADIPS=$(egrep -v "^#|^$" $tDB) for ipblock in $BADIPS do # delay to help rules load properly. if [[ $i == 5 ]] then sleep 1 i=0 fi i=$((i+1)) $IPT -A $SPAMLIST -s $ipblock -j LOG --log-prefix "$SPAMDROPMSG" $IPT -A $SPAMLIST -s $ipblock -j DROP done 

你可以用这样的代码块来试验代码:

  #!/bin/bash i=0 while [ 1 ] do i=$((i+1)) if [[ $i == 5 ]] then sleep 1 i=0 fi echo hello $i done