web-dev-qa-db-ja.com

Linuxでユーザーごとのアップロード帯域幅を制限する方法は?

DebianLennyでユーザーごとのアップロード帯域幅を制限するためにtcコマンドを提供できる人はいますか?

ユーザーごとにiptablesでパケットをマークするには、次のコマンドを使用できることがわかりました

iptables -t mangle -A OUTPUT -p tcp -m owner --uid-owner testuser -j MARK --set-mark 500

しかし、私はtcの使い方がわかりません

更新

次のコマンドを実行することで、テストユーザーのアップロード帯域幅を10Mビットに制限することができました

iptables -t mangle -N HTB_OUT
iptables -t mangle -I POSTROUTING -j HTB_OUT
iptables -t mangle -A HTB_OUT -j MARK --set-mark 30
iptables -t mangle -A HTB_OUT -m owner --uid-owner testuser -j MARK --set-mark 10

tc qdisc replace dev eth0 root handle 1: htb default 30
tc class replace dev eth0 parent 1: classid 1:1 htb rate 10Mbit burst 5k
tc class replace dev eth0 parent 1:1 classid 1:10 htb rate 10Mbit ceil 10Mbit
tc qdisc replace dev eth0 parent 1:10 handle 10: sfq perturb 10
tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 10 fw flowid 1:10

問題は、テストユーザーのFTP帯域幅を制限したくないが、上記のコマンドを実行することにより、FTP速度も10Mビットに制限されることです。

よろしく

2
Gihan Lasita

私があなたのhtb設定で見る明らかな問題のカップル。

まず、1:30のハンドルがないので、default 30。おそらくあなたはdefault 1?これにより、ルールがトラフィックを別のクラスにアタッチしない限り、すべてのトラフィックがクラスID 1:1にアタッチされます。

次に、htb 1:1の最高レベルクラスのレートを妥当なものに設定し、ラインレートよりも低くする必要があります。たとえば、ラインレートが100Mbitの場合、レートはおそらく90%である必要があります:90Mbit。 75%の回線速度など、より保守的な設定を推奨する人もいます。私は危険なゲームを90%でプレイしていますが、問題なく動作します。パケットのドロップや不適切な帯域幅の割り当てに気付いた場合は減らしてください。後者は、アップストリームバッファリングを示しています。

第3に、レート制限クラスは、クラスを割り当ててもよい保証帯域幅にrateを設定し、ユーザーに許可する最大レベルにceilを設定する必要があります。 。たとえば、テストユーザーに400kビットの保証帯域幅を提供したいとしますが、それ以外の場合は回線がアイドル状態の場合は、回線レートまで増加させます。セットする rate 400kbitそしてあなたが1:1のレートとして置いたものに固執します。 ceilを設定しない場合、デフォルトでレートになります。

第4に、ftpトラフィックを免除するという目標を達成するには、マークだけでなくconnmarkを使用する必要があります。そうしないと、関連するデータ接続が--set-mark10から適切に免除されません。Connmarkは関連する接続を適切に取得します。

私は次の(テストされていない!)ルールを頭のてっぺんから外すことをお勧めします:

# flush rules out of postrouting so you're not constantly inserting during testing.
iptables -t mangle -F POSTROUTING
iptables -t mangle -X HTB_OUT

# The use of RETURN here is to fall out of our user chain and hit 
# -j CONNMARK --save-mark in the POSTROUTING chain.
iptables -t mangle -N HTB_OUT
iptables -t mangle -A HTB_OUT -j MARK --set-mark 30
iptables -t mangle -A HTB_OUT -p tcp --dport 21 -j MARK --set-mark 30
iptables -t mangle -A HTB_OUT -m mark ! --mark 0 -j RETURN
iptables -t mangle -A HTB_OUT -m owner --uid-owner testuser -j MARK --set-mark 10
iptables -t mangle -A HTB_OUT -m mark ! --mark 0 -j RETURN

iptables -t mangle -A POSTROUTING -j CONNMARK --restore-mark
iptables -t mangle -A POSTROUTING -m mark ! --mark 0 -j ACCEPT
iptables -t mangle -A POSTROUTING -j HTB_OUT
iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark

次に、tcの場合、次のようになります。

# set a script variable that will represent our line-rate minus some change
CAPRATE=90Mbit
CAP_SUB_400=89Mbit

# clear our qdisc settings for eth0 so we're starting from a clean slate.
tc qdisc del dev eth0 root

tc qdisc add dev eth0 root handle 1: htb default 20
tc class add dev eth0 parent 1: classid 1:1 htb rate ${CAPRATE} burst 5k
# this is our capped class:
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 400kbit ceil ${CAPRATE}
# this is our default, catch-all class:
tc class add dev eth0 parent 1:1 classid 1:20 htb rate ${CAP_SUB_400} ceil ${CAPRATE}
tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10
tc qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 10

tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 10 fw flowid 1:10

覚えておくべきこと:親の直接の子のすべてのrateの合計は、親rateを超えてはなりません。ここで少しごまかして、1:20のレートを89600kbitではなく89Mbitに切り下げました。アンダーコミットすることはできますが、オーバーコミットしないでください。

iptablesルールが評価されます順番に。ポリシーで許可されている場合は、最も一般的な一致が最初に表示されます。このほとんどは、HTB_OUTチェーンに入る前にPOSTROUTINGルールによって回避されますが、これは大まかな目安です。

だからSFQは何のために...それは鍋をかき混ぜるようなものです。 SFQは、すべての接続(実際にはエンドポイントペア)に帯域幅の公平なシェアを与えようとします。その後、同じ内部バケットに含まれる接続が多すぎる場合に備えて、摂動秒ごとに再び混合します(これはハッシュの方法が原因で可能です)。 src/dst/portpairで実行されます)。詳細については、lartcまたはtc-sfqのマンページを確認してください。

2
Andrew Domaszek
iptables -A OUTPUT -m conntrack --connbytes from:to --connbytes-mode packets/bytes/avgpkt -m owner --uid-owner owner -J DROP

その他の可能性-m connlimit-m hashlimit

0
ArrowInTree