web-dev-qa-db-ja.com

ハッシュ制限(例:kb / s-接続ではありません!)で帯域幅を制限することはできませんが、manページにはそうすべきだと書かれています

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人のユーザーの帯域幅の使用を個別に制限する必要があるため、基本的なサービス(特にプロキシ認証を使用できない愚かなモバイルアプリ)を許可するには、それぞれに非常に低い制限しかありませんが、他のすべてのユーザーにはサインインする必要があります。

3
dakhota

答えはコメントにあるので、OPを引用するには

解決策:私は3つのマイナーバージョンが遅れています。バイトベースのハッシュ制限がiptables1.4.15で導入されました(Ubuntu 13.04には1.4.12があります)– dakhota

2
yagmoth555

あなたのルールはACCEPTが特定のレートまでパケットしますが、その後DROPがルールに一致しない場合、トラフィックはありますか?デフォルトのチェーンポリシー(-P)または明示的なルール...

できることは、ルールを--hashlimit-aboveDROPトラフィックに変更することです。例:

# 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

その他のオプション:デフォルトのチェーンポリシー(これらのルールに一致しないトラフィックをブロックしますall)、または受け入れる同じトラフィックに一致し、ACCEPTハッシュ制限に一致しない場合はドロップする明示的なルールルール。

ハッシュリミットがルールを壊す方法に関しては、それはかなり奇妙に見えます。異なるテーブル名を使用した場合も同じようになりますか?それをサポートしていない古いバージョンがあるか、どういうわけか/ sを/ secとして取り、テーブルの他のすべてが1秒あたりであると想定していると思います。