web-dev-qa-db-ja.com

共有インターネット接続での帯域幅管理のオプション

前提:

田舎の場所、高帯域幅のインターネット接続のための多くのオプションはありません。群を抜いて最速の衛星インターネットですが、高価であるため(機器と月額費用の両方があり、遅延の欠点があります)、複数の世帯がそれを共有したいと考えています。

これ自体は簡単です。世帯ごとにサブネット(VLANまたは物理ポート)を使用してルーターを設定し、それらの間のトラフィックをブロックして、それらのサブネットにルーティングするようにモデムを構成するか、ダブルNATを設定します。

問題:

TCPが通常機能する方法は、各TCP接続が多かれ少なかれ利用可能な帯域幅の1/nを取得することを意味します。ここで、nは接続の数です。 1つの世帯/ユーザーが多数の接続を作成すると、接続全体のシェアが大きくなります。これは特に公平ではありません-飽和リンクでは、各household均等なシェアを取得する必要があります。一方、他の誰も接続を使用していない場合は、全帯域幅を使用できる必要があります。

たとえば、4世帯が12Mビット/秒のダウン接続を共有しているとします。それらの1つがダウンロード/ストリーミング/その他のものである場合、それらは完全な12Mbit/s(または十分に近い)を使用できるはずです。 2つの世帯が接続を使用している場合、1つの世帯が1つのファイルをダウンロードしていても、他の世帯が11をダウンロードしているかに関係なく、それぞれ6Mbit/sを取得する必要がありますそれぞれ4Mbit/sを取得します。

これまでに解決したこと:

このようなポリシーを(ダウンストリーム用に)実装するのに最適な場所は、細いパイプのもう一方の端、つまりISPです。もちろん、この場合は不可能なので、なんとかして概算できるといいですね。しかし、どうやって?このようなものをサポートする市販のルーターはありますか? LinuxまたはBSDボックスを構成することはできますか?防弾である必要はありません-誤動作TCPサーバーまたは積極的なUDPサービスは、おそらく私が自分の側でできることを回避する可能性があります-しかし、それはほとんどの一般的なケースで機能するはずです多くのRFC準拠のTCP接続で構成されるトラフィック。

明確にするために、私はnotが特定のアプリケーションの優先順位付けについて話しているのではなく、特定のイーサネットデバイスまたはIPアドレス範囲との間のトラフィックを集約しています。一部のトラフィックに他のトラフィックよりも高い優先度を与えることは十分にサポートされているようですが、トラフィックのクラスに帯域幅を均等に割り当てようとすると、状況はあまり明確ではありません。

Web上のトラフィックシェーピングについては、ひどく書かれた/ひどく逆流した/そうでなければ情報に通じていない情報がたくさんあります。ルーターのハードウェアに関するドキュメントはひどく不特定なので、私は輪になって走り回っているようです。

私が理解しているように、TCPをこのように動作させる方法は、実際に利用可能なパイプよりもわずかに狭いパイプをシミュレートし、パケットを人為的にドロップして元に戻すことです。上記の例では、余分なパケットを人為的にドロップすることで、全員に正確に3Mbit/sを与えるのはかなり簡単です。これは、ほとんどの場合、予備の容量があるため、接続を効率的に使用しません。

私が求めていることを行う方法はありますか?私はそれについて間違っていますか?私は(または問題の世帯が)これにお金を費やすことをいとわない-それが手頃な価格の既製のルーター/アプライアンスであろうと、LinuxまたはBSDディストリビューションを実行するための汎用ボックスであろうと。

13
pmdj

この問題を解決するために何かを構築する場合、私はこれを設定します:

ここでは、1つのリンクを共有する4台のコンピューターの例を取り上げます。ネットワークは次のような形になります。

{ ISP }=========[ SOHO router] ===LAN1=== [eth0 |Linux Box| eth1] ===LAN2=== Home Desktops/Laptops

LAN2で静的IPアドレスを使用するとします。

Linux Box 192.168.1.1
Home 1    192.168.1.11
Home 2    192.168.1.12
Home 3    192.168.1.13
Home 4    192.168.1.14

最初に小さなスクリプトを書いて、pingを実行してどこかに結果を書き込むことで、どのクライアントが稼働しているかを検出します。 「これは読者のための演習として残します」接続されているホストの総数を計算します(1〜4)

オンラインのホストがない場合は、必ず処理してください。

帯域幅の合計を、接続されているホストの数で割ります。 (1の場合は12Mb、2の場合は6Mb、3の場合は4Mb、4の場合は3Mb)

次に、HTBアルゴリズムでtcを使用して、WAN側デバイスの各アドレスの帯域幅を制限します。まず、ルートクラスを作成します。

DEV="eth0"
TC="/sbin/tc"
TOT_BW=12
$TC qdisc add dev $DEV root handle 1: htb default 99

次に、「クライアント」ごとにクラスを追加します(たとえば、3つのクライアント)

NB_CLT=3
CLT_BW=$(($TOT_BW/$NB_CLT))mbit
for i in seq $NB_CLT
do
    $TC class add def $DEV parent 1: classid 1:$i htb rate $CLT_BW ceil $CLT_BW burst 15k cburst 1500
    $TC filter add dev $DEV protocol ip parent 1:0 prio 1 flowid 1:$i u32 \
     match ip dst 192.168.1.1$i/32 \
     match ip src [Router IP in LAN1]/32
done

(上記のスクリプトは完全にテストされておらず、タイプミスもありません)

今でも、毎分実行するようにスクリプトを適切にスクリプト化し、新しいホストが起動または停止するたびにバケット/フィルターを更新する必要があります。

それがあなたを正しい方向に向けてくれることを願っています、幸運を祈ります。

代替ソリューション

すべてのホストにローカルQoSソフトウェアをインストールして、帯域幅を制限します。私は個人的にNetLimiterを使用しています(無料ではありません)

4
mveroone

OpenWRTはそれをサポートしているようですが、私自身は使用したことがありません。彼らのウェブサイトの ネットワークトラフィック制御 ページ、特に2番目の例を見ることができます: HTBとの単純な帯域幅共有(別名トラフィックシェーピング) 。これにはqdiscの単純な呼び出しが含まれるため、どのLinuxボックスでも実行できます。

2
user2313067

https://superuser.com/a/1210164/257859 で説明されている設定は、まさにそれを行います:

[...]キューは、その制限されたBWをすべてのLANクライアント(正確にはLAN IP)間で均等に分散します。

0
ndemou