本サイトでは、アフィリエイト広告およびGoogleアドセンスを利用しています。

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 を繋ぎます。

$ sudo apt install bridge-utils

$ sudo brctl addbr br0
$ sudo brctl addif br0 eth0 
$ sudo brctl addif br0 eth1

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

各種設定

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

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

[PC1] --- [RPI] --- [PC2] 172.16.0.100
        eth0  eth1

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

パケットロスの設定

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

$ sudo tc qdisc add dev eth1 root netem drop 30%

遅延の設定

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

$ sudo tc qdisc add dev eth0 root netem delay 100ms

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

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

$ sudo tc qdisc add dev eth0 root netem delay 500ms 30ms distribution normal

帯域の設定

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

$ sudo tc qdisc add dev eth1 root tbf limit 15Kb buffer 10Kb/8 rate 500Kbit

設定の解除

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

$ sudo tc qdisc del dev eth0 root
$ sudo tc qdisk del dev eth1 root

まとめ

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

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

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

linux
すらりんをフォローする
すらりん日記

コメント

  1. マスキタカオ より:

    貴重な情報をご提供頂きありがとうございました。お蔭様にて、基本設定やパケットロスの設定などはうまくいきました。ただ、帯域制限については、以下のような問題が発生しております。
     さて、
    $ sudo tc qdisc add dev eth1 root tbf limit 15Kb buffer 10Kb/8 rate 500Kbit
    と打ち込むと
    tbf: unknown parameter “500Kbit”
    と表示され、うまく実行できていないようにみえます。その他として、
    $ sudo tc qdisc add dev eth1 root tbf limit 15Kb buffer 10Kb/8 rate 500kbit
    $ sudo tc qdisc add dev eth1 root tbf limit 15Kb buffer 10Kb/8 rate 500kbps
    等としても同様の応答となります。
     さらに、
    $ sudo tc qdisc add dev eth1 root tbf rate 500kbit
    とすると
    Command line is not complete. Try option “help”.
    と表示され、対処方法が理解できません。
     当方の目的としては、***bit/sec, ***byte/sec 等のように帯域制限をかけることになります。ご面倒をおかけしますが、コメント頂けると幸いに存じます。
    (#)なお上記において、500kbpsの帯域制限をかける際、limit 15Kb buffer 10Kb/8の箇所の意味もよく理解できおりません。

  2. すらりん より:

    こちらでも、同じパラメータを入れて割と最近の Raspbian で実行してみましたが、
    “sudo tc qdisc add dev eth0 root tbf limit 15Kb buffer 10Kb/8 rate 500Kbit”
    というコマンドで、エラーは出ませんでした。
    そのため、問題があるとすれば使用している Raspbian の構成、インストール済みのソフトウェアの環境・設定などが影響しているのでは?とも思います。

    また、各パラメータの意味についてですが少々ややこしくて、自分も理解しているとはいえない状況です。すみません。
    ざっくりといえば、一定量のバッファを用意して、それを指定されたビットレートになるように調整しつつ流量をコントロールする、といったところでしょうか。
    この例ではバッファは 10Kb/8 のサイズで複数用意して、それをレートに合わせてネットワークに流す、といった感じだと自分は思っております。
    (間違っていたらすみません。)

    Linux Traffic Control について、詳しくは以下のページで解説されている情報らが参考になるかと思います。

  3. MT より:

    お忙しい中、ご回答頂きありがとうございました。
    これより、再度試してみます。

  4. […] Raspberry Pi でパケット遅延器 […]

タイトルとURLをコピーしました