假设某人希望获得被阻止的 IP 地址列表。
我见过以下示例脚本:
BLOCKDB="/path/to/ip.blocked.file"
# omit comments lines
IPS=$(grep -Ev "^#" $BLOCKDB)
for i in $IPS
do
iptables -A INPUT -s $i -j DROP
iptables -A OUTPUT -d $i -j DROP
done
几千行代码,转换成几千个 iptables 条目,是合理的吗?
这个上限是多少?超过这个上限,系统效率会受到显著影响吗?
答案1
我认为我已经通过这篇文章找到了解决方案,而 IPSet 似乎就是答案
总共:
如果 IP 地址集包含数千个项目,iptables 性能就会下降(实际上,netfilter 的性能会下降,因为 iptables 只是一个管理防火墙的工具)。您的 CPU 负载也会增加。幸运的是,有一个完美的解决方案 - ipsets
如果您想要执行以下操作,IPSet 是完美的工具:
- 一次性存储多个IP地址或端口号,并通过iptables进行集合匹配;
- 动态更新针对 IP 地址或端口的 iptables 规则,而不会影响性能;
- 使用单个 iptables 规则表达基于复杂 IP 地址和端口的规则集,并受益于 IP 集的速度
安装 ipset 很简单sudo apt-get install ipset
然后运行以下命令
ipset -N autoban iphash ––hashsize 4096 ––probes 2 ––resize 50
将其添加到您的 iptables 链中。它可能因您的防火墙设置而异。这里我们使用 ethin 链。
iptables -I ethin 2 -p tcp -m multiport ––dport 80,443 -m set ––match-set autoban src -j DROP
现在,您可以将所有不良 IP 添加到您的 ipset 中。例如,您有一个文本文件,名为 bots.txt,每行一个 IP。因此,您可以使用简单的 bash 脚本将它们添加到 ipset:
for i in $( cat /tmp/bots.txt ) ; do ipset -A autoban $i ; done
检查运行:
ipset -L autoban