gpt4 book ai didi

bash - 如何从黑名单中快速向 iptables 添加规则?

转载 作者:行者123 更新时间:2023-12-05 02:22:48 25 4
gpt4 key购买 nike

我正在使用 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

这对于简短的测试列表来说似乎工作正常,但手动添加许多(200,000+)条目到 iptables 需要花费大量时间,我不确定为什么?根据列表,我计算出这需要 10 个小时以上才能完成,这看起来很愚蠢。

查看 iptables-save 输出的格式后,我创建了一个新脚本,它使用 iptables-save 来保存工作 iptables 规则,然后将 block 的预期格式附加到此文件,例如:- 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 64 位上测试这些相同的列表时,第二个脚本工作正常。我试过在桌面计算机上运行脚本,然后使用 iptables-save 保存规则集的“正确”格式版本,然后使用 iptables-restore 和 still 收到错误。

我不知道如何解决这个问题,为什么初始脚本需要这么长时间才能将规则添加到 iptables,以及什么可能导致第二个脚本中的列表出现问题。

最佳答案

如果您需要阻止多个 IP 地址,请改用 ipset

第 1 步:创建 IP 集:

# Hashsize of 1024 is usually enough. Higher numbers might speed up the search,
# but at the cost of higher memory usage.
ipset create BlockAddress hash:ip hashsize 1024

第 2 步:将要阻止的地址添加到该 IP 集中:

# Put this in a loop, the loop reading a file containing list of addresses to block 
ipset add BlockAddress $IP_TO_BLOCK

最后,用 netfilter 中的 一个 行替换所有要阻止的行:

iptables -t raw -A PREROUTING -m set --match-set BlockAddress src -j DROP

完成。 iptables-restore 将变得更加快速。

重要说明:强烈建议不要使用要添加到 netfilter 的域名; netfilter 需要首先进行 DNS 解析,如果 DNS 配置不正确和/或太慢,它将失败。相反,对要阻止的域名进行预解析(或定期解析),并将找到的 IP 地址提供给“包含要阻止的地址列表的文件”。它应该是一个简单的脚本,每 5 分钟左右从 crontab 调用一次。


编辑 1:

这是我用来获取 facebook.com 地址的 cronjob 示例,每 5 分钟调用一次:

#!/bin/bash
fbookfile=/etc/iptables.d/facebook.ip
for d in www.facebook.com m.facebook.com facebook.com; do
dig +short "$d" >> "$fbookfile"
done
sort -n -u "$fbookfile" -o "$fbookfile"

每隔半小时,另一个 cronjob 将这些地址提供给 ipset:

#!/bin/bash
ipset flush IP_Fbook
while read ip; do
ipset add IP_Fbook "$ip"
done < /etc/iptables.d/facebook.ip

注意:我必须这样做,因为 dig +short facebook.com 会返回 恰好一个 IP 地址。经过一番观察,返回的 IP 地址每大约 5 分钟更改一次。由于我太忙于制作优化版本,所以我采取了简单的方法,每 30 分钟只进行一次刷新/重建,以最大限度地减少 CPU 峰值。

关于bash - 如何从黑名单中快速向 iptables 添加规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27696067/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com