【发布时间】:2021-01-30 04:50:49
【问题描述】:
我正在使用 Ubuntu Server 14.04 32bit 进行以下操作。
我正在尝试使用阻止列表将区域阻止(中国、俄罗斯...)添加到我的防火墙规则中,并且正在努力解决我的脚本完成所需的时间以及了解不同脚本为何无法工作的原因。
我最初以http://whatnotlinux.blogspot.com/2012/12/add-block-lists-to-iptables-from.html 为例,并整理/更改了部分脚本,使其与以下内容非常接近:
#!/bin/bash
# Blacklist's names & URLs array
declare -A blacklists
blacklists[china]="http://www.example.com"
#blacklists[key]="url"
for key in ${!blacklists[@]}; do
#Download blacklist
wget --output-document=/tmp/blacklist_$key.gz -w 3 ${blacklists[$key]}
iptables -D INPUT -j $key #Delete current iptables chain link
iptables -F $key #Flush current iptables chain
iptables -X $key #Delete current iptables chain
iptables -N $key #Create current iptables chain
iptables -A INPUT -j $key #Link current iptables chain to INPUT chain
#Read blacklist
while read line; do
#Drop description, keep only IP range
ip_range=`echo -n $line | sed -e 's/.*:\(.*\)-\(.*\)/\1-\2/'`
#Test if it's an IP range
if [[ $ip_range =~ ^[0-9].*$ ]]; then
# Add to the blacklist
iptables -A $key -m iprange --src-range $ip_range -j LOGNDROP
fi
done < <(zcat /tmp/blacklist_$key.gz | iconv -f latin1 -t utf-8 - | dos2unix)
done
# Delete files
rm /tmp/blacklist*
exit 0
这似乎适用于简短的测试列表,但手动向 iptables 添加许多(200,000+)条目需要花费大量时间,我不知道为什么?根据列表,我计算出这需要 10 个小时以上才能完成,这看起来很愚蠢。
查看 iptables-save 输出的格式后,我创建了一个新脚本,该脚本使用 iptables-save 保存工作 iptables 规则,然后将预期的块格式附加到此文件,例如:-A bogon -m iprange --src-range 0.0.0.1-0.255.255.255 -j LOGNDROP,并最终使用 iptables-restore 来加载文件,如下所示:
#!/bin/bash
# Blacklist's names & URLs arrays
declare -A blacklists
blacklists[china]="http://www.example.com"
#blacklists[key]="url"
iptables -F # Flush iptables chains
iptables -X # Delete all user created chains
iptables -P FORWARD DROP # Drop all forwarded traffic
iptables -N LOGNDROP # Create LOGNDROP chain
iptables -A LOGNDROP -p tcp -m limit --limit 5/min -j LOG --log-prefix "Denied TCP: " --log-level 7
iptables -A LOGNDROP -p udp -m limit --limit 5/min -j LOG --log-prefix "Denied UDP: " --log-level 7
iptables -A LOGNDROP -p icmp -m limit --limit 5/min -j LOG --log-prefix "Denied ICMP: " --log-level 7
iptables -A LOGNDROP -j DROP # Drop after logging
# Build first part of iptables-rules
for key in ${!blacklists[@]}; do
iptables -N $key # Create chain for current list
iptables -A INPUT -j $key # Link input to current list chain
done
iptables-save | sed '$d' | sed '$d' > /tmp/iptables-rules.rules # Save WORKING iptables-rules and remove last 2 liens (COMMIT & comment)
for key in ${!blacklists[@]}; do
#Download blacklist
wget --output-document=/tmp/blacklist_$key.gz -w 3 ${blacklists[$key]}
zcat /tmp/blacklist_$key.gz | sed '1,2d' | sed s/.*:/-A\ $key\ -m\ iprange\ --src-range\ / | sed s/$/\ -j\ LOGNDROP/ >> iptables-rules.rules
done
echo 'COMMIT' >> /tmp/iptables-rules.rules
iptables-restore < /tmp/iptables-rules.rules
# Delete files
rm /tmp/blacklist*
rm /tmp/iptables-rules.rules
exit 0
这对于测试平台上的大多数列表都很有效,但是如果包含特定列表会产生 iptables-restore: line 389971 failed 错误,这始终是最后一行(提交)。我已经读过,由于 iptables 的工作方式,每当重新加载规则出现问题时,错误总是会说最后一行失败。
真正奇怪的是,在 Ubuntu Desktop 14.04 64bit 上测试这些相同的列表,第二个脚本工作得很好。我尝试在桌面机器上运行脚本,然后使用 iptables-save 保存规则集的“正确”格式版本,然后使用 iptables-restore 和 still将此文件加载到服务器上的 iptables > 收到错误。
我不知道如何解决这个问题,为什么初始脚本需要这么长时间才能将规则添加到 iptables,以及可能导致第二个脚本中的列表出现问题的原因。
【问题讨论】:
-
要么在你的第一个代码的内部循环中添加一个
echo started cmd iptables ....; iptables ... ; echo done cmd iptables ...,要么使用set -vx来直观地确认延迟在哪里。我可以看到,鉴于您似乎拥有的规则大小,运行所有这些命令可能需要一段时间。 (根本)无法帮助您解决第二个想法,但是鉴于它的速度要快得多,因此尝试解决该问题是有意义的。鉴于您的问题空间的 SA 性质,您可能会考虑标记您的问题并将其移至http://serverfault.com。祝你好运。 -
我之前添加了一个回显来显示循环当前正在添加的规则,唯一的延迟似乎是这些命令可以运行的速度。我刚刚在安装了 FRESH 14.04.1 Ubuntu Server 32 位的虚拟机上运行了第二个脚本,它运行良好。这导致我更新物理测试机器上的所有包并重试,仍然失败!
-
嗯。好的,所以您确定慢速机器的硬盘驱动器没有坏扇区或其他会导致这种情况的问题?两台机器上是否有相同的 amt 磁盘可用。两台机器上的 RAM 配置文件相同? “擦洗”测试是否显示磁盘或 RAM 中的任何弱点?最后,您能否在该机器上添加一个额外的磁盘,或者将其换成已知良好的磁盘?似乎你会想到这一切。 +1 坚持和耐心!祝你好运!
-
不确定,但您可能会达到 iptables 和您的操作系统版本的某种限制。您可能希望通过 ipset 或 xtables-addons 使用 Geoip(如果您的内核支持它们。)我写的旧帖子中的更多信息:web-tech.ga-usa.com/2011/09/… 和 web-tech.ga-usa.com/2011/09/…。 :)
-
@shelter,澄清一下,如果“慢”机器是指使用实际 iptables -A 命令而不是 iptables-restore 手动添加规则的机器,我的任何测试机器(虚拟或物理)的持续时间很长。限制,内存或其他是一个想法,但是 iptables-restore 脚本在具有相同操作系统和更少内存的 VM 上运行良好!我研究了 ipsets,但我还有一些阅读要做才能完全掌握。我担心的是,这种规模的防火墙规则肯定已经在企业界完成了,我不确定“正确”的方法