次のシナリオをシミュレートしたいと思います。4台のubuntuサーバーマシンA、B、C、Dがあるとします。マシンAとマシンCの間でネットワーク帯域幅を20%、AとBの間で10%削減したいと思います。方法これを行うには、ネットワークシミュレーション/スロットルツールを使用しますか?
tc
iptablesマーキングと一緒に使用する場合に行います。
次のシナリオをシミュレートしたいと思います。4台のubuntuサーバーマシンA、B、C、Dがあるとします。マシンAとマシンCの間でネットワーク帯域幅を20%、AとBの間で10%削減したいと思います。方法これを行うには、ネットワークシミュレーション/スロットルツールを使用しますか?
tc
iptablesマーキングと一緒に使用する場合に行います。
回答:
これを行うにはtc
、u32
フィルターを単独で使用するか、iptablesマーキングと組み合わせて使用します(複雑なフィルターの構文を学習したくない場合は、もっと簡単です)。次の投稿では、前者のソリューションについて詳しく説明します。
例として、10メガビット/秒の仮想インターフェイスを実行しているA、B、C、Dを考えてみましょう 。
あなたは基本的に欲しい:
これをシミュレートするために、ブリッジに接続された4つのネットワーク名前空間と仮想イーサネットインターフェイスを作成します。
もちろん、あなたのケースでは実際のNICで作業し、ブリッジはインフラストラクチャに応じてゲートウェイまたはスイッチになります。
したがって、私のシミュレーションでは、10.0.0.0 / 24ネットワークで次のように設定します。
10.0.0.254
+-------+
| |
| br0 |
| |
+---+---+
|
| veth{A..D}.peer
|
+------------+------+-----+------------+
| | | |
vethA | vethB | vethC | vethD |
+---+---+ +---+---+ +---+---+ +---+---+
| | | | | | | |
| A | | B | | C | | D |
| | | | | | | |
+-------+ +-------+ +-------+ +-------+
10.0.0.1 10.0.0.2 10.0.0.3 10.0.0.4
最初に、セットアップの段階を説明します。セットアップの内容を理解できるため、慣れていない場合はスキップしてください。大したことはありません。ただし、知っておく必要があるのは、このコマンドip netns exec <namespace> <command>
により、ネットワーク名前空間(つまり、前の描画のボックスの1つ)でコマンドを実行できることです。これは次のセクションでも使用されます。
# Create the bridge
ip link add br0 type bridge
# Create network namespaces and veth interfaces and plug them into the bridge
for host in {A..D} ; do
ip link netns add ${host}
ip link add veth${host} type veth peer name veth${host}.peer
ip link set dev veth${host}.peer master br0
ip link set dev veth${host} netns ${host}
ip netns exec ${host} ip link set veth${host} up
done
# Assign IPs
ip addr add 10.0.0.254/24 dev br0
ip netns exec A ip addr add 10.0.0.1/24 dev vethA
ip netns exec B ip addr add 10.0.0.2/24 dev vethB
ip netns exec C ip addr add 10.0.0.3/24 dev vethC
ip netns exec D ip addr add 10.0.0.4/24 dev vethD
したがって、この時点で、前述のセットアップが完了しています。
それはあなたが望むものを得るために交通管制に入る時です。このtc
ツールを使用すると、キューイングの分野を追加できます。
3つの概念が付属しています:qdisc、クラス、フィルター。これらの概念を使用して、複雑なパケットフロー管理をセットアップし、任意の基準/基準に基づいてトラフィックに優先順位を付けることができます。
手短に :
これらすべては通常、葉がqdiscsでクラスがノードであるツリーとして機能します。ツリーまたはサブツリーのルートはとして宣言され<id>:
、子ノードはとして宣言され<parent_id>:<children_id>
ます。この構文を覚えておいてください。
あなたの場合のために、Aを取り、あなたがセットアップしたいツリーをレンダリングしてみましょうtc
:
1:
|
|
|
1:1
/ | \
/ | \
/ | \
1:10 1:20 1:30
| | |
| | |
:10 :20 :30
説明 :
1:
デバイスvethAに接続されているルートqdisc htb
です。階層トークンバケットの場合と同様に明示的に取得されます(デバイスのデフォルトqdiscは、pfifo
またはpfifo_fast
OSによって異なります)。これは、帯域幅管理に特に適しています。このレベルで定義されたフィルターに一致しないパケットは、1:30
クラスに送られます。1:1
htb
デバイスのトラフィック全体を10 Mbit / sに制限するクラスになります。1:10
htb
出力トラフィックを9 Mbit / s(10 Mbit / sの90%)に制限するクラスになります。1:20
htb
出力トラフィックを8 Mbit / s(10 Mbit / sの80%)に制限するクラスになります。1:30
htb
トラフィックを10 Mbit / s(フォールバック)に制限するクラスになります。:10, :20, :30
あるsfq
確率フェアネス・キューイングのためのqdisc。言い換えれば、これらのqdiscsは、フローに基づいた送信スケジュールの公平性を保証します。この全体は、次のコマンドで設定されます。
ip netns exec A tc qdisc add dev vethA root handle 1: htb default 30
ip netns exec A tc class add dev vethA parent 1: classid 1:1 htb rate 10mbit burst 15k
ip netns exec A tc class add dev vethA parent 1:1 classid 1:10 htb rate 9mbit burst 15k
ip netns exec A tc class add dev vethA parent 1:1 classid 1:20 htb rate 8mbit burst 15k
ip netns exec A tc class add dev vethA parent 1:1 classid 1:30 htb rate 10mbit burst 15k
ip netns exec A tc qdsic add dev vethA parent 1:10 handle 10: sfq perturb 10
ip netns exec A tc qdisc add dev vethA parent 1:20 handle 20: sfq perturb 10
ip netns exec A tc qdisc add dev vethA parent 1:30 handle 30: sfq perturb 10
最後に必要なのは、フィルターを追加して、宛先IPがBに等しい1:10
IPパケットがクラスに移動し、宛先IPがCに等しいIPパケットが1:20
クラスに移動するようにすることです。
ip netns exec A tc filter add dev vethA parent 1: protocol ip prio 1 u32 match ip dst 10.0.0.2/32 flowid 1:10
ip netns exec A tc filter add dev vethA parent 1: protocol ip prio 2 u32 match ip dst 10.0.0.3/32 flowid 1:20
アイデアがわかったら、tc
BとCに同様のルールを追加して、これらのリグからAへの送信も整形する必要があります。
それではテストしてみましょう。このため、私は個人的にで遊んでiperf
いますが、クライアントまたはサーバーとして実行できる単一のバイナリで構成され、両方のホスト間で可能な限り多くのトラフィックを自動的に送信します。
AとBの間:
$ ip netns exec B iperf -s -p 8001
...
$ ip netns exec A iperf -c 10.0.0.2 -p 8001 -t 10 -i 2
------------------------------------------------------------
Client connecting to 10.0.0.2, TCP port 8001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[ 5] local 10.0.0.1 port 58191 connected with 10.0.0.2 port 8001
[ ID] Interval Transfer Bandwidth
[ 5] 0.0- 2.0 sec 2.38 MBytes 9.96 Mbits/sec
[ 5] 2.0- 4.0 sec 2.12 MBytes 8.91 Mbits/sec
[ 5] 4.0- 6.0 sec 2.00 MBytes 8.39 Mbits/sec
[ 5] 6.0- 8.0 sec 2.12 MBytes 8.91 Mbits/sec
[ 5] 8.0-10.0 sec 2.00 MBytes 8.39 Mbits/sec
[ 5] 0.0-10.1 sec 10.8 MBytes 8.91 Mbits/sec
私たちは、取得9 Mbit / sの帯域幅の制限を。
AとCの間:
$ ip netns exec C iperf -s -p 8001
...
$ ip netns exec A iperf -c 10.0.0.3 -p 8001 -t 10 -i 2
------------------------------------------------------------
Client connecting to 10.0.0.3, TCP port 8001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[ 5] local 10.0.0.1 port 58522 connected with 10.0.0.3 port 8001
[ ID] Interval Transfer Bandwidth
[ 5] 0.0- 2.0 sec 2.25 MBytes 9.44 Mbits/sec
[ 5] 2.0- 4.0 sec 1.75 MBytes 7.34 Mbits/sec
[ 5] 4.0- 6.0 sec 1.88 MBytes 7.86 Mbits/sec
[ 5] 6.0- 8.0 sec 1.88 MBytes 7.86 Mbits/sec
[ 5] 8.0-10.0 sec 1.75 MBytes 7.34 Mbits/sec
[ 5] 0.0-10.1 sec 9.62 MBytes 7.98 Mbits/sec
私たちは、取得8 Mbit / sの帯域幅の制限を。
AとDの間:
$ ip netns exec D iperf -s -p 8001
...
$ ip netns exec A iperf -c 10.0.0.4 -p 8001 -t 10 -i 2
------------------------------------------------------------
Client connecting to 10.0.0.4, TCP port 8001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[ 5] local 10.0.0.1 port 40614 connected with 10.0.0.4 port 8001
[ ID] Interval Transfer Bandwidth
[ 5] 0.0- 2.0 sec 2.62 MBytes 11.0 Mbits/sec
[ 5] 2.0- 4.0 sec 2.25 MBytes 9.44 Mbits/sec
[ 5] 4.0- 6.0 sec 2.38 MBytes 9.96 Mbits/sec
[ 5] 6.0- 8.0 sec 2.25 MBytes 9.44 Mbits/sec
[ 5] 8.0-10.0 sec 2.38 MBytes 9.96 Mbits/sec
[ 5] 0.0-10.2 sec 12.0 MBytes 9.89 Mbits/sec
ここでは、10 Mbit / sの仮想インターフェースのフルスピードに達しています。
各実行の最初のメジャーのバーストはhtb
、適切なパラメーターを調整することにより、クラスでより適切に処理できることに注意してください。
削除する :
1:
:tc filter del dev vethA parent 1: prio 1 u32
。1:
:tc filter del dev vethA parent 1:
。1:20
とその子:tc class del dev vethA parent 1:1 classid
1:20
。tc qdisc del dev vethA
。シミュレーションセットをクリーンアップするには:
# Remove veth pairs and network namespaces
for host in {A..D} ; do
ip link del dev veth${host}.peer
ip netns del ${host}
done
# Remove the bridge
ip link del dev br0
最善の方法は、統合された(少なくともUbuntuサーバーで)netemモジュールでtcツールを使用することです。Stackoverflowのこの記事で詳細を確認できます。
トリクルはうまくいきます。
このディスカッションはいくつかの制限を示しています:https : //unix.stackexchange.com/questions/109973/how-to-change-speed-limit-of-running-trickle-instance