web-dev-qa-db-ja.com

ユーザーごとの帯域幅を制限するにはどうすればよいですか?

要約すると:私は、Web GUIを使用してトレントクライアントを実行している数人の友人がいる専用サーバーを持っています。各ユーザーはサーバー上のユーザー名でクライアントを実行しているため、ダウンロードはユーザーディレクトリに移動し、自分だけが自分のファイルなどにアクセスできます。

ユーザーごとに毎月の帯域幅を監視および制限するにはどうすればよいですか?

多分iptablesを使う方法があるに違いないと思っていました。そして、ユーザーXのすべてのプロセスで使用される帯域幅を監視します。また、毎月の許容帯域幅Y GBを超えると、トレントクライアントのネットワークがブロックされるか、クライアントが完全に終了するというメッセージが表示されます。私はイカについても考えましたが、複数のトレントクライアントを使用することになるので、これは多くのサーバーリソースを使用する可能性があります...

私はdebian lennyを使用しています。

これを行う方法がわかりません...

これはまったく可能でしょうか?これに対する部分的な解決策でさえ感謝しています...

32
loco41211

Iptablesの--quotaオプションを使用すると、転送制限をバイト単位で設定できます。それぞれ異なるユーザー名で複数のtorrentクライアントを実行しているので、katrielが示唆するように、それを--uid-ownerオプションと組み合わせることができます。

このようにして、ユーザーのダウンロード速度を制限することなく、期間(日/週/月/その他)ごとに転送制限を強制できます。

パケットカウンターを永続的にするには、サーバーを再起動する必要がある場合やファイアウォールルールをフラッシュする必要がある場合にパケットカウンターを復元できるように、定期的に(たとえば、cronジョブを介して)保存する必要があります。

13
alemartini

'tc'トラフィックシェーピングコマンドを使用できます。

お友達のそれぞれに、BitTorrentで使用する異なるポートを与えます。各ポートのiptablesでTCPパケットをマークします。

iptables -t mangle -A FORWARD -p tcp --sport 6881 -j MARK --set-mark 100
iptables -t mangle -A FORWARD -p tcp --dport 6881 -j MARK --set-mark 100

次に、tcコマンドを使用して、各ユーザーの最大帯域幅とレートを設定します。

月末に、tcコマンドを削除および追加して、カウントをリセットできます。

次の方法で、各ユーザーの使用状況を監視できます。

tc filter show dev ethX

Debian install shorewallを使用している場合は、iptablesをいじることなくトラフィックシェーピングを簡単に実行できます。/etc/shorewallディレクトリにあるtcdevices、tcclasses、tcrulesを編集するだけです。詳細はこちら: http://www.shorewall.net/traffic_shaping.htm

他の人が示唆したように、ユーザー名でパケットをマークすることは、ポートよりもおそらく良いです、それでiptablesを更新することなくポートを変更することができます。

13
chris.moos

上記の質問を追加します。

Iptablesとユーザーマッチングを使用して、次のようにパケットに色を付けることができます。

iptables -t mangle -A OUTPUT -p tcp -m owner --uid-owner someuser -j MARK --set-mark 100

そして 'tc'を使用してユーザーごとに制限します。

12
katriel

各ユーザーに毎月許可する月間トラフィックの量に応じて、他のユーザーから提案されたいくつかのツールを使用して、それに応じて帯域幅制限を設定できます。

たとえば、ダウンロードの最大制限を250 GB /月に設定するとします。これを1か月の時間数(約730)で割り、次に3600で割ると、最大ダウンロードレートが得られます。この例では、最大のダウンロードレートになります100 KB/s

次に、最大数DLレートが100 KB /秒)を設定すると、250 GB /月のダウンロード制限が自動的に適用されます(もちろん、トラフィックシェーパーが適切に動作している場合)。ユーザーが100 KB /秒より速くダウンロードできない場合、ユーザーは250 GB /月を超えてダウンロードすることはできません。

ダウンロード率を制限するために、tcまたは言及されている他のツールのいくつかを使用できます。 tcを直接処理したくない場合は、設定が非常に簡単な cbq.init を使用できます。このスクリプトはshaperパッケージとしてDebian Etchに存在していましたが、その後削除されたようです。とにかく、それはSourceForgeからダウンロードできる単純なスクリプトです。

もちろん、このアプローチはあなたの場合には役に立たないかもしれません(たとえば、ユーザーが利用可能な最大速度でダウンロードできるようにしたいが、それでもあなたの最大制限を強制したい場合、私の提案は機能しません)。

8
mfriedman

私はこれが古い記事であることを知っていますが、今日でも答えを探して偶然見つけましたが、結局私にとって完璧に機能するものをつなぎ合わせました。 25Mbsのダウンリンクと2.5Mbsのアップリンクがあり、このリンクを共有している4人と5台のサーバーがあります。サーバーではアップリンクの帯域幅が重要ですが、ダウンリンクは4人で使用すると便利なので、誰もそれを独占しません。

Centos 6.3をルーターとして実行していますが、これらのコマンドはどのLinuxでも機能するはずです。 eth0はプロバイダーへのアップリンクですeth1は24ポートスイッチとwifiアクセスポイント経由のLANです。ダウンロードを25 Mbsの5つ(約500KB /秒)に制限していますアップロードを200Kbit(約25KB /秒)に制限しています

tc qdisc add dev eth0 root handle 1:0 htb default 99
tc class add dev eth0 parent 1:0 classid 1:1 htb rate 100Mbit ceil 100Mbit
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 200Kbit ceil 200Kbit prio 2
tc qdisc add dev eth0 parent 1:11 handle 10: sfq perturb 10

tc qdisc add dev eth1 root handle 2:0 htb default 99
tc class add dev eth1 parent 2:0 classid 2:1 htb rate 100Mbit ceil 100Mbit
tc class add dev eth1 parent 2:1 classid 2:11 htb rate 5Mbit ceil 5Mbit prio 2
tc qdisc add dev eth1 parent 2:11 handle 20: sfq perturb 10

次に、ユーザーを制限するには、ユーザーごとに2つのiptables行を使用します

アップロードを制限するには:

iptables -t mangle -A POSTROUTING -o eth0 -p tcp -s 192.168.0.100 -j CLASSIFY --set-class 1:11

ダウンロードを制限する

iptables -t mangle -A POSTROUTING -o eth1 -p tcp -d 192.168.0.100 -j CLASSIFY --set-class 2:11

制限したい人と一致するようにIPアドレスとethポートを変更するだけです

7
BrierMay

完全を期すために、trickleというユーザー空間デーモンがあります。単一プロセスの帯域幅を制限するために使用できます。使い方は非常に簡単です:f.e. aptitudeが使用する帯域幅を制限するには、次のように書きます:trickle -d 10 aptitude install wesnothただし、LD_PRELOADを使用して機能するため、シェルアクセス権を持つユーザーによって簡単に上書きされる可能性があります。

3
liori

seripacct カーネル patch を見てください(これには実際にはかなり長い history があります)。 旧バージョンのドキュメント では、クォータの適用と監視も提供されているように見え、独自のポリシースクリプトを提供することも可能です。

Useripacctの作成者は、必要な動作を取得するためにカーネルパッチに頼らなければならなかったことを考えると、デフォルトでより簡単な方法を使用できるとは思えません。ここでの他のほとんどの回答で提案されているように(実際にはあなたが探しているものではありません)、またはVM =各ユーザー( OpenVZ のような軽量OS仮想化を使用)およびVMごとのアカウンティングトラフィック vnstat)によってかなり簡単に評価されます )。しかし、それはやり過ぎのようです(突然、1つのシステムではなく、管理するVMがたくさんあります)。

2
timday