それほど高速ではないチャネルを介したインターネットアクセスを備えたホームネットワーク(またはホームではなく、小規模オフィスのネットワーク)があるとします。 そして、多くのユーザーがいて、誰もが何かをダウンロードしたいのですが、最高速度で。 ここでは、ユーザーが相互に干渉しないように、ユーザー間で最も効率的にインターネットチャネルを配信する方法のタスクに直面しています。 この記事では、Linuxサーバーを使用してこの問題を解決する方法について説明します。
結果として得たいものを述べましょう:
1.チャンネルがユーザー間で均等に分割されていること。
2.チャンネルが無駄にアイドル状態ではなかったこと。
3.オンラインゲーム、ssh、およびtelnetが、チャネルが完全にロードされている場合(例:トレント)でも「遅れない」ようにします。
インターネットが同時に10人のユーザーによって使用される場合、誰もがチャネルの1/10を自由に使用できます。1人のユーザーのみが現在アクティブである場合、彼はチャネル全体を自分で使用します。
これは、バージョン2.4.20以降のLinuxカーネルに含まれているHTBパッケージスケジューラを使用して実現できます。
tcコマンドを使用してシェーパーを構成できますが、より便利で直感的なセットアップのために、 htb.initスクリプトをダウンロードすることをお勧めします。 それらはhtb構成用の構成ファイルのセットを使用するため、名前をアルファベット順に並べると、シェーパークラスのツリーを視覚的に想像し、便利に編集できるようになります。
インターネットに接続するサーバーeth0インターフェース上にサーバーがあり、ローカルネットワークを「見る」eth1があるとします。
インターフェースからのトラフィックのみを制御できます。したがって、eth0にはユーザートラフィックをアップロードするためのルールがあり、-eth1にはダウンロードトラフィックがあります。
デフォルトでは、htb.init構成ファイルは/ etc / htb /にあります。 まず、アップロードトラフィックのシェーピングルールを作成します。シンプルにする必要があります。
eth0 (インターネット上の「見える」インターフェース)という名前のファイルを作成し、次の行をそのファイルに書き込みます。
DEFAULT=20
R2Q=1
DEFAULTパラメーターは、デフォルトでトラフィックが割り当てられるクラス番号を設定します-通常、これは最低の優先度を持つクラスです。 R2Qパラメータは、チャネル分離アルゴリズムの動作に影響し、チャネル幅に依存します。 2 Mbitの発信チャネルに対して、経験的にその値を選択しました。
次に、利用可能なすべてのインターネットフィードを含むクラスのeth0-2.full2MBitファイルを作成します。 ファイル名はインターフェイス名とクラスIDで構成され、ポイントの後にはクラスのセマンティック名があり、コメントとして使用され、システムによって無視されます。
RATE=2Mbit
CEIL=2Mbit
RATEは保証帯域であり、CEILは最大帯域です。 2 Mbitの最大帯域幅が保証されたチャネルがあるため、これらのパラメーターは同じです。
ここで、トラフィッククラスごとに1つのファイルを作成します。 私自身は、sshトラフィックとWorld Of WarcraftおよびCounter Strikeトラフィック用に個別のクラスを作成しましたが、優先度の高いすべてのトラフィックに対して1つのクラスを作成できます。
sshの例は、 eth0-2ファイル10.sshを作成することです。 コロン名には親クラス2のIDが含まれ、現在のクラスのIDは10です。クラスの識別子は任意に選択できます。
# class for outgoing ssh
RATE=128Kbit
CEIL=2Mbit
RULE=*:22
PRIO=1
BURST=100Kb
RATEパラメーターは、このクラスの保証帯域をCEILで指定します-最大。 (少なくとも)sshに128 KBitを割り当て、チャネル全体をダウンロードできるようにします(sftpでファイルをアップロードします)。 PRIOは、トラフィッククラスの優先度を設定します(1-最大、数値が大きいほど優先度が低くなります)。 BURSTは、他のクラスからのデータの転送に進む前に、最大速度で送信されるトラフィックの最大量を設定します。 このパラメーターを十分に高い値に設定することにより、sshトラフィックが最小限の遅延で送信されるようにします。
RULEは、このクラスへのトラフィックが選択されるルールを設定します。
形式は、RULE = [[saddr [/ prefix]] [:port [/ mask]]、] [daddr [/ prefix]] [:port [/ mask]]です。
コンマに注意してください! RULE = *:22は、宛先ポートが22のトラフィックを示し、RULE = *:22は、発信ポートが22のトラフィックを示します。
また、他のタイプのトラフィック用のクラスと、ID 20の「デフォルト」トラフィック用のクラスを作成します(最初に、クラス20に向けられるべき「クラス20」へのトラフィックであることを示しました)。 その中で、使用されているチャネル分離規則LEAF = sfqを示しているため、アップロードは異なるユーザーのTCPセッション間で均等に分割されます。
eth1については、サーバーのローカルリソースにフルスピードでアクセスできるようにするため、合計チャネル幅が100メガビットであることのみを考慮して、ルールはほぼ同じになります。2MBitの別のクラスが子孫として追加され、インターネットトラフィックに割り当てられます個々のユーザーのクラス、私がIPアドレスで行ったクラスへの分割。 各ユーザーに対して、最高速度と保証速度、および優先度を指定できます。
構成を編集したら、htb.initを再起動します。
/etc/init.d/htb.init restart
また、トラフィックシェーピングルールはすぐに有効になります。
ルールを作成するプロセスでは、通常、デバッグと監視のために、何らかの方法でトラフィックを視覚化する必要があるため、HTBトラフィッククラスの分布を視覚化するmuninサーバーモニタリングシステム用のプラグインを作成することにしました。 通常はセマンティックロードを実行するため、ツリーのリーフクラスのみのロードを表示することにしました。
公式のmuninプラグインリポジトリからプラグインをダウンロードできます。これはqos_と呼ばれ、プラグインフォルダーmunin / usr / share / munin / plugins /にコピーするだけです。 eth1は、負荷を監視するインターフェイスの名前です。
プラグイン構成ファイルでは、次を追加できます。
[qos_eth1]
env.ignore_queue1_10 yes
env.label_name1_31 Viperet
env.label_name1_32 Cornet
env.ignore_queueパラメーターを使用すると、指定したIDのクラスステータスをグラフに表示できなくなり、env.label_nameパラメーターを使用すると、グラフのクラスに人間が読めるラベルを設定できます。
結果は次のようになります。
2と1 Mbitの2つのインターネットチャネルがあり、ユーザーごとに2 Mbitのダウンロード速度制限があるため、グラフは、1人のユーザーがアクティブな場合、2 Mbitで速度がカットされ、いくつか-合計速度は3に達することができます。 20人を超える人々がこのような「きつい」チャネルで働いており、お互いに干渉することなく非常に快適に感じています。
この画像は実サーバーからのものであり、5分ごとに更新され、チャネルのロードの現在の画像を表示します。
UPD: htb.init configの例を投稿しました