我有这个循环来使用 ipset/iptables 阻止 IP 和 CIDR:
# this is just an example. the actual list IPs/CIDR is very large
cat blockip.txt
13.31.0.254
cat blockcidr.txt
13.32.0.0/15
环形:
#!/bin/bash
ipset -F
ipset -N -! blacklist hash:net maxelem 1000000
for ip in $(cat blockip.txt blockcidr.txt); do
ipset -A blacklist $ip
done
iptables -A FORWARD -m set --match-set blacklist dst -j DROP
注意:我一直使用这个ipset -A
选项,但我不知道这个选项到底是什么意思,因为它没有出现在“ Man Ipset ”中,此时,我假设它add
与 相同-A
,因为输出在这两种情况下都是一样的。
#!/bin/bash
ipset -F
ipset -N -! blacklist hash:net maxelem 1000000
for ip in $(cat blockip.txt blockcidr.txt); do
ipset add blacklist $ip -q
done
iptables -A FORWARD -m set --match-set blacklist dst -j DROP
两种情况:
sudo ipset -L
Name: blacklist
Type: hash:net
Revision: 7
Header: family inet hashsize 1024 maxelem 1000000 bucketsize 12 initval 0xbc0136c8
Size in memory: 552
References: 0
Number of entries: 2
Members:
13.31.0.254
13.32.0.0/15
“它工作正常”,但我读到添加 IP 和 CIDR 的ipset -A
速度非常慢。使用ipset save 和 restore哪个更快。但我不明白它是如何工作的,我的尝试失败了:
注意:我还没有找到解释为什么使用保存/恢复选项而不是add
or更快的解释-A
#!/bin/bash
ipset -F
ipset -N -! blacklist hash:net maxelem 1000000
for ip in $(cat blockip.txt blockcidr.txt); do
ipset add blacklist $ip # ??
ipset save blacklist -f newblacklist.txt # ???
done
ipset restore -! < newblacklist.txt # ??
iptables -A FORWARD -m set --match-set blacklist dst -j DROP # ??
出去:
sudo ipset -L
Name: blacklist
Type: hash:net
Revision: 7
Header: family inet hashsize 1024 maxelem 1000000 bucketsize 12 initval 0xcb0e583b
Size in memory: 552
References: 0
Number of entries: 2
Members:
13.32.0.0/15
13.31.0.254
cat newblacklist.txt # out wrong
create blacklist hash:net family inet hashsize 1024 maxelem 1000000 bucketsize 12 initval 0xcb0e583b
add blacklist 13.32.0.0/15
add blacklist 13.31.0.254
我将不胜感激任何帮助(提供完整的答案,包括建议的循环或对我的循环的更正)
这对我有用:
请根据您的需要调整 create 语句中的选项 - 根据集合的大小,这些选项非常重要。这进一步假设该文件
blockcidr.txt
仅包含如下行:之后,恢复工作正常。
在这种情况下,更新
这种循环的瓶颈始终是子流程的创建。
ipset
如果您有 10000 多个条目,则可执行 ipset 正在加载到内存中,为您要添加的每一行解析选项...我的循环仅包含 bash 内部命令,因此无需加载/执行任何可执行文件 - 只是将一些文本写入文件。当然 - 对 ipset 的单次调用比对 ipset 的 10000 多次调用要快得多...