Linuxで簡易ネットワーク解析 - bridge, tc, netem

ロンドン橋がおちる おちる おちる
ロンドン橋がおちる さあどうしましょう
『London Bridge Is Falling Down』 - 高田三九三訳詞・イギリス民謡

Linuxを使ってパケットキャプチャや、パケットロスや通信遅延といった通信環境のシミュレーションを簡易的に実施するという話です。

本格的な評価のための通信レミュレーションとなると、専用の機材を使わないと難しいこともありますが、簡易的な確認であれば、ノートPCに入れたLinuxだけでできるようにしておくと、特別な機材準備もいらないので、結構便利だったりします。メモもかねて残しておきます。

やりたいこと

  • 有線ネットワーク上のパケットキャプチャ
  • 通信の遅延や瞬断、パケットロスのレミュレーション

準備


パケットキャプチャ用の接続と設定

パケットキャプチャのソフトの方は、Wiresharkやtcpdumpを使えばいいんですが、問題は接続方法。最近は安くてコンパクトやミラーリング対応のスイッチングハブ(以下ものもとか)もあるので、それを使うというのが基本的な方法です
実際、ものさえあればそれが一番手間いらずですが、あとで説明するネットワークエミュレーションもあわせて実施できるようにするため、ここではブリッジを作成した接続方法を説明します。

USB-Etherの接続

Linuxをブリッジにするために、まずUSB etherを2本USBポートに差します。挿した直後は、ホストOSの方で認識されてしまうので、virtualbox側で認識させます。何も問題なければ、ゲストOS側にeth3, eth4で認識されます。ifconfigで見えているか確認しましょう。
USB etherを2個さす理由は、bridgeの両端用です。通信キャプチャしたい機器と機器の間に準備したPCが挟まるような形でLANケーブルを接続します。

例) 機器Aと機器Bの通信をキャプチャしたい場合
 [元の接続]
 (機器A) ----- (ハブ等) ---- (機器B)

 [接続変更後]
 (機器A) ----- (ハブ等) --- [(USB Ether1) 解析用PC (USB Ether2)] ---- (機器B)


内蔵のetherポートやホストOSとの通信用の仮想ドライバを片方側に割り当ててもいいのですが、ここは独立性が高くなるよう専用ポートを用意するようにしています。これだと、既存のネットワークとの接続を維持したまま、ターゲットのネットワークを見れるというメリットもあります。

bridgeの設定

USB etherが認識できたら、これらを両端としたブリッジを構成します。ブリッジの作成は、brctlコマンドで行います。brctlはbridge-utilsのパッケージに含まれますので、入っていない場合はインストールしましょう。
先ほどのUSB etherがeth3, eth4とすると、以下一連のコマンドでeth3とeth4を中継するbridgeデバイスが作成できます。

brctl addbr br0
brctl addif br0 eth3
brctl addif br0 eth4
ifconfig eth3 0.0.0.0 up
ifconfig eth4 0.0.0.0 up
ifconfig br0 0.0.0.0 up

bridgeデバイスの状態は、brctl show br0で確認できます。
うまくいっていれば、これで通信がbridgeされているはずです。 試しに、br0を通るパケットをtcpdumpやwiresharkで見てみましょう。
tcpdump -i br0
機器Aから機器Bへのパケットが見えていればOKです。

大抵は、これでOKですが、マルチキャストパケットの場合、IGMP snoopingのために通信が中継されないことがあります。とりあえず全キャプチャしたいという時には、混乱のもとになるので、IGMP snooping機能は無効にしておいた方が安全かと思います。
bridge-utilsはまだ対応していないので、/sys/devices/virtual/net/brN/bridge以下のファイルを変更することで、設定を変更します。multicast_snoopingの内容を1から0に変更します。
echo 0 > /sys/devices/virtual/net/br0/bridge/multicast_snooping

その他、Linux bridgeの詳しい内容については、以下が参考になります。


通信環境のエミュレーション

パケットロスや、通信速度といったにはnetem (tcコマンド)を使います。
先の手順で機器Aと機器Bの通信は全て解析用PCがブリッジしているので、tcコマンドで中継しているデバイス (br0、又は、eth3やeth4)に設定することで、機器Aと機器B間の通信に対する遅延やエラーをエミュレートできます。

4797373512 eth0に100ms遅延
tc qdisc add dev eth0 root netem delay 100ms

eth0を100ms±10ms(ランダム)の遅延 (先にaddしたものを変更)
tc qdisc change dev eth0 root netem delay 100ms 10ms

パケットロス率を0.1%に変更
 tc qdisc change dev eth0 root netem loss 0.1%

bitエラー率を0.1%に変更 (ランダムなオフセットに対して1bit error)
tc qdisc change dev eth0 root netem corrupt 0.1% 

パケット重複 (1%)
 tc qdisc change dev eth0 root netem duplicate 1%

パケットリオーダリング (5パケット毎に10ms遅延して送信)
tc qdisc change dev eth0 root netem gap 5 delay 10ms

設定したフィルタを削除
tc qdisc change dev eth0 root

その他、netem, tcコマンドの詳細は、以下が参考になります。

警察の初動捜査と同じで、不具合や問題の解析も何か起こった時にすぐ解析できるかどうかは、結果や経過を大きく左右します。簡易的であっても、手軽に解析できる環境をもっておくというのはいざという時に強い味方になります。

4897977967
【関連書籍】
ルーター自作でわかるパケットの流れ 小俣 光之
Linuxネットワークプログラミングバイブル 小俣 光之 種田 元樹
実践 パケット解析 ―Wiresharkを使ったトラブルシューティング Chris Sanders 園田 道夫
パケットキャプチャ入門 第3版 (LANアナライザWireshark活用術) 竹下 恵
パケットキャプチャ実践技術―Wiresharkによるパケット解析 応用編 竹下 恵

Windowsのネットワーク設定を切り替えを便利に

あちこち旅をしてまわっても、自分から逃げることはできない。
ヘミングウェイ

ノートPCを持ち歩いて使うと、IPアドレス設定等を場所や目的にしたがって切り替えたい時が結構あります。大抵は、DHCPで事足りるかもしれませんが、固定IPが必要なことも結構あったりします。ノートPCだと、イントラやインターネットに接続するという以外に、ちょっとした調査や解析のためにローカルなネットワークに接続したい時なんかもあるでしょう。

Linuxであれば、ifconfigの設定scriptを準備しておくというのが常套手段かもしれません。一方、Windowsの方は、あんまりなじみがないかもしれませんが、netshコマンドでコマンドラインからネットワークアダプタの設定ができます。GUIでももちろんできますが、Windowsのアダプタ設定は階層が深いし、なんとも使いにくい。。。そこそこ切替頻度が高いのなら、バッチファイル用意しておくことをおすすめします。
例えば、「ローカルネットワーク接続」の設定を、固定IPやDHCP設定に切り替えるの次のようなバッチファイルを用意すればOK。

dhcp.bat
netsh interface ip set address "ローカル エリア接続" dhcp
netsh interface ip set dns "ローカル エリア接続" dhcp

fixedip.bat
netsh interface ip set address "ローカル エリア接続" static 192.168.1.10 255.255.255.0 192.168.1.1 1
netsh interface ip set dns "ローカル エリア接続" static 192.168.1.1 primary
netsh interface ip add dns "ローカル エリア接続" 192.168.1.2

もう少し細かいところは、以下あたりのページが参考になるかと思います。

なお、netsh interface dumpしたものをnetshに食わせればOKという説明もありますが、文字コードがsjis+CRLFになっている必要があるので、powershellやcygwinのターミナルからnetsh dump実行すると文字コードがUTF8になったりしてうまくいかない可能性があります。また、dump結果に「はい」とかの日本語が入ってエラーになるということもあるので、最初から、上記の例のように必要最低限の内容を書きだして、バッチファイルにした方が早いかと思います。その場合も、SJIS+CRLFでの保存は必要です。

なお、用意したバッチファイルは、管理者として実行する必要があります。ショートカットを作って、毎回管理者権限で実行する設定をしておくほうが良いです。

ちなみに、私の場合、設定ごとにショートカットを作って、作ったショートカットをLaunchyからキーボードショートカットで呼び出して使っています。

ちなみに、Let's noteにはネットワークセレクターという切り替えアプリが入ってますね。

4774149543

【関連記事】
WindowsでCUI環境


【関連書籍】
Clean Coder プロフェッショナルプログラマへの道
整理HACKS!―1分でスッキリする整理のコツと習慣
IDEA HACKS! 今日スグ役立つ仕事のコツと習慣

本のおすすめ

4873115655

4274065979

4822236862

4274068579

4822255131

B00SIM19YS


プロフィール

  • Author:proger
  • 組み込み関係で仕事してます

ブログ内検索