我希望使用 iptables hashlimit 来限制滥用的网络爬虫,就像这个问题正在尝试限制 ssh 暴力扫描。
他们偶尔会在我们的网站上遇到效率低下的代码路径。这让我们感到无奈,因为他们并行化程度太高,而且速度太快(例如,每秒 3-5 个传入连接)。最终用户不会经常遇到这种情况,即使遇到,也不会是 10 倍或 20 倍的并行。
我知道我需要做一些调整,以确保突发大小足以满足浏览器上的真实用户的需求,并确保我的每个 IP 检查不会影响 NAT 后面的几个用户。不过,这一切似乎都是可行的。在我们的实时网站上进行调整应该不是什么大问题,在前几周我只会记录而不是丢弃。
话虽如此,我还是有点担心 hashlimit 的内存使用情况。主要是我想确保网站不会因为这个 iptables 规则内存不足而瘫痪。
--hashlimit-htable-size buckets
The number of buckets of the hash table
--hashlimit-htable-max entries
Maximum entries in the hash.
但并不完全清楚什么是存储桶以及什么是条目。
另外,当哈希表填满时会发生什么(最大条目或存储桶)?希望规则失败,iptables 继续执行下一个规则,但它并没有真正说明。
这是我正在考虑的规则。它在有限的测试中按设计工作,但对数千个远程 IP 进行负载测试有点棘手。
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW \
-m hashlimit --hashlimit-name=WWW --hashlimit-above 1/sec --hashlimit-burst 50 \
--hashlimit-mode srcip -j LOGACCEPT
答案1
我想您知道哈希算法的一般工作原理:它根据数据(IP、IP 对等)计算出某个函数,并使用该函数的值作为表中的索引来定位与该数据相关的结构。表中的每个单元格(对应于哈希函数的一个可能值)通常称为哈希桶。
不幸的是,不同的数据集可能会产生相同的哈希函数值,并且会与同一个哈希桶相关联。这就是为什么哈希桶可能包含多个哈希条目,这些条目通常存储为链接列表。因此,在进行查找时,首先计算哈希函数并选择一个哈希桶,如果它包含多个哈希条目,则逐一分析它们以找到合适的哈希条目。
因此 hashlimit-htable-size 限制了哈希桶的数量(哈希表本身的大小),而 hashlimit-htable-max 限制了所有哈希条目的数量(存储在所有哈希桶中)。