在一台服务器上,我们试图阻止对中国国家的任何访问。
我们希望使用 iptables 而不是通过 .htaccess 来实现这一点。
但是,我们遇到的问题是,当一次添加多个 iptables 时(我们在这里为中国谈论超过 1000 个 ip 子网),一个会失败(错误 'iptables: Unknown error 18446744073709551615' 然后随后所有其他人将失败)意味着我们必须iptables -F
继续添加这些规则。
一些测试得出的结论是,问题似乎出在尝试一次运行很多(甚至一次 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)创建IP集
2) 将 IP 范围添加到集合中
3) 使用 netfilter/iptables 规则连接该集合,该规则拒绝来自集合 set01 的任何具有源 IP 地址的数据包
如您所见,我没有创建 4 个几乎相同的 iptables 规则,而是创建了一个 IP 集 set01,然后我添加了一些 IP 范围(只是一个示例,实际上可能有数百万个),最后我通过单个 iptables 规则。因此,与其维护一长串类似的 iptables 规则,不如根据区域文件创建一个 IP 集,然后一步阻止它。
请查看相关的 ipset 手册页以获取更多详细信息。
我同意 dsumsky 的观点,即您可能需要一种新方法。但是要为每加载 4 个条目延迟 1 秒,要插入的代码将是这样的:
您可以使用如下代码块来试验代码: