iptables hashlimit 突发存储桶没有重新填充?

iptables hashlimit 突发存储桶没有重新填充?

我的理解是,netfilter 的 hashlimit 模块应该实现漏桶算法...我使用下面的 iptables 配置

iptables -A INPUT -s 207.[...] -m hashlimit --hashlimit-above 34722b/s \
--hashlimit-burst 600m --hashlimit-name hashlimitTable1 \
--hashlimit-htable-expire 604800000 -j DROP

这对于单次 700 MB 的大型下载来说非常有效,但如果我在下载完成后等待三个小时,然后再进行另一次下载,规则仍会立即匹配(无突发)并将带宽限制为 ~34kB/s。

cat /proc/net/ipt_hashlimit/hashlimitTable1并在第一次大量下载后检查节目

                     This seems to represent the burst "bucket" size
                      and it does go down and reach 0 after 600 MB
                      have been downloaded, but it never increases
                              no matter how long I wait.
                                       |
                                       |
604555 0.0.0.0:0->0.0.0.0:0 4194304000 0 1931967

hashlimit 没有实现“漏桶”算法吗?还是我的配置不正确?

man 8 iptables-extensions|grep -e 'hashlimit-burst amount' -A 7

--hashlimit-burst amount
       Maximum  initial  number  of  packets to match: this number gets
       recharged by one every time the limit  specified  above  is  not
       reached,  up  to this number; the default is 5.  When byte-based
       rate matching is requested, this option specifies the amount  of
       bytes  that  can  exceed  the given rate.  This option should be
       used with caution -- if the entry expires, the  burst  value  is
       reset too.

这表明我的预期行为是正确的,但也许我需要从相反的角度确保规则匹配:

iptables -A INPUT -s 207.[...] -m hashlimit --hashlimit-upto 34722b/s \
--hashlimit-burst 600m --hashlimit-name hashlimitTable1 \
--hashlimit-htable-expire 604800000 -j ACCEPT;
iptables -A INPUT -s 207.[...] -j DROP;

不幸的是,这导致了完全相同的观察到的行为,即使用以wget --limit-rate=1024 http://207.[...]/testFile.bin1KiBps 的极低速率下载 19 多分钟,但最大令牌数从未增加到零以上,并且在等待额外一个小时没有下载后带宽仍然限制为 ~34KBps...

我已经确认过期时间、垃圾收集间隔、htable-size 和 htable-max 对问题没有任何影响。如果我将过期时间设置得非常短(例如 10 秒),那么显然它会重置突发,但这会导致违反平均带宽。

相关内容