使用 hashlimit 限制带宽(例如 kb/s - 而不是连接数!)不起作用,尽管手册页说应该这样做

使用 hashlimit 限制带宽(例如 kb/s - 而不是连接数!)不起作用,尽管手册页说应该这样做

根据iptables-extensions 手册页hashlimit 可以进行带宽限制:

“流量超过 512kbyte/s” =>

--hashlimit-mode srcip,dstip,srcport,dstport --hashlimit-above 512kb/s

但是,当我尝试指定这样的规则时,1)它不会像我预期的那样限制我的带宽,2)当我使用 iptables-save 转储规则时,无论我在数字后面输入什么,我都会得到相同的条目(kb/s、b/s、/sec、一些愚蠢的内容或什么都没有):

# iptables -t filter -A it2net -s 10.5.2.43/32 -m hashlimit --hashlimit-upto 8kb/s --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j ACCEPT
# iptables -t filter -A it2net -s 10.5.2.44/32 -m hashlimit --hashlimit-upto 8b/s --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j ACCEPT
# iptables -t filter -A it2net -s 10.5.2.45/32 -m hashlimit --hashlimit-upto 8 --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j ACCEPT
# iptables -t filter -A it2net -s 10.5.2.46/32 -m hashlimit --hashlimit-upto 8000 --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j ACCEPT
# iptables -t filter -A it2net -s 10.5.2.47/32 -m hashlimit --hashlimit-upto 8000b --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j ACCEPT
# iptables -t filter -A it2net -s 10.5.2.48/32 -m hashlimit --hashlimit-upto 8000xb --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j ACCEPT
# iptables -t filter -A it2net -s 10.5.2.49/32 -m hashlimit --hashlimit-upto 8000kb --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j ACCEPT

以及转储的相关部分:

-A it2net -s 10.5.2.43/32 -m hashlimit --hashlimit-upto 8/sec --hashlimit-burst 5 --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j ACCEPT
-A it2net -s 10.5.2.44/32 -m hashlimit --hashlimit-upto 8/sec --hashlimit-burst 5 --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j ACCEPT
-A it2net -s 10.5.2.45/32 -m hashlimit --hashlimit-upto 8/sec --hashlimit-burst 5 --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j ACCEPT
-A it2net -s 10.5.2.46/32 -m hashlimit --hashlimit-upto 10000/sec --hashlimit-burst 5 --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j ACCEPT
-A it2net -s 10.5.2.47/32 -m hashlimit --hashlimit-upto 10000/sec --hashlimit-burst 5 --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j ACCEPT
-A it2net -s 10.5.2.48/32 -m hashlimit --hashlimit-upto 10000/sec --hashlimit-burst 5 --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j ACCEPT
-A it2net -s 10.5.2.49/32 -m hashlimit --hashlimit-upto 10000/sec --hashlimit-burst 5 --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j ACCEPT

(我们不要担心为什么 8000 四舍五入为 10000......或者,我们应该担心吗?)

知道我遗漏了什么吗?我需要分别限制大约 100 个不断变化的用户的带宽使用量,因此每个用户的带宽限制都比较低,只能允许基本服务(尤其是无法使用代理身份验证的愚蠢移动应用程序),但其他所有服务都需要登录。

答案1

引用原帖,答案在评论中

解决方案:我落后了 3 个次要版本。基于字节的哈希限制是在 iptables 1.4.15 中引入的(Ubuntu 13.04 有 1.4.12)– dakhota

答案2

您的规则ACCEPT将数据包限制在特定速率,但之后是否有任何DROP流量不符合规则?默认链策略 ( -P) 或明确规则...

您可以做的是将您的规则更改为DROP使用--hashlimit-above;例如:

# iptables -t filter -A it2net -s 10.5.2.43/32 -m hashlimit --hashlimit-above 8kb/s --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j DROP
# iptables -t filter -A it2net -s 10.5.2.44/32 -m hashlimit --hashlimit-above 8b/s --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j DROP
# iptables -t filter -A it2net -s 10.5.2.45/32 -m hashlimit --hashlimit-above 8 --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j DROP
# iptables -t filter -A it2net -s 10.5.2.46/32 -m hashlimit --hashlimit-above 8000 --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j DROP
# iptables -t filter -A it2net -s 10.5.2.47/32 -m hashlimit --hashlimit-above 8000b --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j DROP
# iptables -t filter -A it2net -s 10.5.2.48/32 -m hashlimit --hashlimit-above 8000xb --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j DROP
# iptables -t filter -A it2net -s 10.5.2.49/32 -m hashlimit --hashlimit-above 8000kb --hashlimit-mode dstip --hashlimit-name test --hashlimit-htable-expire 3600000 -j DROP

其他选项:默认链策略(它将阻止全部您可以使用明确的规则来匹配您接受的相同流量(即不符合这些规则的流量),或者在使用明确的规则来匹配您接受的相同流量,并在其不符合ACCEPThashlimit 规则时将其丢弃。

至于 hashlimit 破坏规则的方式,看起来相当奇怪。如果您使用不同的表名,它会做同样的事情吗?我认为要么您有一个不支持它的旧版本,要么它以某种方式将 /s 视为 /sec 并假设表的其他所有内容都是每秒。

相关内容