Raspberry Pi でパケット遅延器


Raspberry Pi を使って、パケットの遅延器を作ってみました。
Linux なら2枚の NIC を使って簡単に作ることができます。これの Raspberry Pi 版となります。

スポンサーリンク

USB-NIC を増設

Raspberry Pi 2/3 には1つの LAN ポートしかないため、2つめを追加する必要があります。
そこで今回 USB NIC を追加しました。手元にあったのが ESXi でも使うことが出来た LAN-GTJU3H3 だったのでこれを使用しました。
ちょうど Raspbian 2017-09 版でも装着したら、すぐに使えるという状態だったので手軽でした。


同様のチップを採用しているものも素直に動くのでは、と思います。

準備: eth0, eth1 をブリッジ接続にする

ブリッジのためのユーティリティをインストールして、ブリッジの設定を行います。
以下のようにしてブリッジインターフェース br0 を追加して、ここに eth0, eth1 を繋ぎます。

ちなみにこの設定をすると eth0, eth1 からこの本体への ssh などは出来なくなるのでご注意ください

各種設定

遅延やら帯域制限やら、パケットロスやらを発生するように設定してみます。

まず準備した RaspberryPi を以下のような感じで、機器の間に挟み込みます。

※ 基本的には RPI から見て出力方向に、パケットの流れを操作するイメージになります。

パケットロスの設定

PC1 から PC2 へ向かう方向にパケットロスを設定するには以下のようになります。
この例では 30% の確率でパケットロスを設定しています。

遅延の設定

PC2 から PC1 への通信に対して、 100ms のレイテンシ(遅延)を挿入するには以下のようになります。

この状態で PC1 (Windows) から、PC2 に向けて ping を実行した結果が以下のようになります。
およそ 100ms のレイテンシが加算されていることが確認できました。

なおここで 遅延時間の誤差というか揺らいだ遅延時間をいれることもできて、以下のように設定が可能でした。
(今回は 500ms 遅延を中央値として正規分布で ± 30ms の範囲で遅延するという設定です)。

帯域の設定

今度は帯域の制限をしてみます。
PC2 のほうで iperf をサーバー起動させて、 PC1 で iperf をクライアントモードで接続して帯域の状態を確認してみます。
この場合、 PC1 から送信する向きになるので eth1 側に帯域制限の設定を適用することになります。
以下の例では 500kbps に制限する例です。

設定の解除

各インターフェースに適用した設定を解除するには以下のコマンドを実行します。

まとめ

Raspberry Pi を使って、ネットワークの遅延器を作る実験してみました。Raspberry pi で作ることによって、通常の Linux PC よりは小型のものが出来ると思います。
ただ RaspberryPi の LAN は内部では USB で繋がっているため、 Gigabit Ethernet の帯域については処理することが出来ません。

tc コマンドの詳細はこちらのページが詳しく説明されていてよさそうに思います。
Qiita / tcコマンドの使い方

また帯域制限についてはこちらのページも参考にさせてもらいました。狙った帯域になかなか設定できなかったので助かりました。
仮想化でプリセールスしてるSEの一日 / WANem で Software-Defined なネットワーク帯域制御装置を作る (1)

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする