今は昔、coreemuといふ者ありけり。

Posted on 2012/11/11(Sun) 00:06 in technical

quagga/xorpにまじりてLinux network namespaceを取りつつ、よろづのことに使ひけり。

今日は coreemu というネットワークエミュレータの話をしようと思う。

GNS3のIOS使わない全てOSS版、みたいなものだと思ってくれればいい。

前述の通り、関連キーワードは Linux network namespace, Quagga, XORP である。

What is coreemu ?

coreemuとは、tcl/tkで書かれたGUIでネットワークトポロジを作成し、作成した仮想ノード別にルーティングテーブル(Linux network namespace)およびプロセスを分離し、各仮想ノードでquagga/xorp等を動作させて、IPネットワークをエミュレートするためのアプリケーションである。

各仮想ノードは、Linux Containerのような形である程度独立して動くものの、ルートディレクトリが隔離されるわけでもないので、アプリケーションコンテナのような形で動くことになる。

とりあえず触ってみる

まずはインストールしてみよう。

手元で動作を確認しているのはUbuntu系列だけなので、説明にはXubuntuを使用する。

しかし、基本的に Netnwork namespaceが使用出来るカーネル以降であれば、おおよそ動作するはずなので、CentOSやFedoraが良い人は、そちらのパッケージを使おう。

インストールは Coreemu Wiki : Quick start に従うのが速い。

面倒なのでrootでやる(今回は12.04なのでpreciseを使う)と、:

# cd ~
# software-center /root/core_4.4-0ubuntu1_precise_amd64.deb
# apt-get install quagga
# /etc/init.d/core start
# core

(software-centerで上手くいかない人は、こっち参照)

で、こうなる。

image0

で、左側のルータを適当に選んでポイポイ置いて、なんかこう線を引く的なアイコンでペイペイ線を引いていく。

image1

あとは、エミュレーション開始ボタン(どのアイコンかはご想像にお任せします)を押して、各ノードの枠が緑色になって消えたら、起動完了である。

image2

では、実際に動作しているところを見てみる。

各ノードはダブルクリックするとbashで開く。各ノードを右クリックして、vtysh(quaggaのシェル)を直接開くことも可能だ。

image3

で、仮想ノードはある程度独立したネットワーク環境になる。

quaggaに入って見ると、こんな感じになる。

image4

通報

最初にvtyshを使おうとすると、(END)みたいな表示が出て、'q'を押さないと表示から抜けられなかったりして、超面倒なので、各シェルの設定(~/.bashrcとか~/.profileとか/etc/profileとか/etc/bash.bashrcとか)に、VTYSH_PAGER="more"と書いておこう。そうすれば、(END)のような表示は出なくなる。

また、デフォルトのルータ構成ではOSPFv2/OSPFv3が全てのIFで動作するような初期コンフィグで動く。

OSPF大好きっ子の方にとっては、クリックひとつでOSPF動作ノードが1台増えると聞いたら、クリックが止まらないのではなかろうか?(なこたぁない)

と、ここで、デフォルトではquaggaを動かすことが暗黙の了解のようになっているけど、ちょっと待って欲しい。

トポロジ構成中に仮想ノードをダブルクリックすると、初期コンフィグを操作することができるのだが、そこではルーティングプロセスとして、quagga以外にXORPを選択することも出来る(仕方ないことだけどBirdは無いよ><)

image5

もちろん、見ての通り他の初期設定も変更可能なので、BGP大好きっ子はBGPの設定を狂ったように入れることも出来る。

image6

ここに無いものでも、UserDefineや、起動後のシェルから起動することもできるので、例えばマルチキャストデーモンであるmrd6を設定して動かすことも出来る。

色々な使い方が想像できることじゃろ?

そうじゃろうそうじゃろう。

機能は色々

例えば、簡単に遅延を載せることが出来る。

こんな感じ。(分かりやすいように、Widgets->Throughputにチェックを入れてる)

image7

見ての通り、遅延だけでなく、帯域制限やロス率、複製率も設定できる。

これを使って、手元の本当に適当な環境で、TCPの遅延別スループットの測定とか、TCPの輻輳制御アルゴリズムのテストが出来る。

他にも、最近になって(4.4以降)、右クリックからのwireshark起動も出来るようになったので、デバッグや動作確認も簡単だ。

アドレス表示をやめてインタフェース名表示にすることも出来るので、表示をスッキリさせることも出来る。

image8

物理IFと関連付けることもできるので、「quaggaと892Jの相互接続試験をしたいけど、そこそこ大きめのネットワークを通知させたりして、Webサーバとクライアントも擬似したいなぁ」という思いに対しても回答を持つ。

image9

スケールもそこそこ

1コア512MB割り当てのVirtualBox上でcoreemuを動作させているが、10台程度の仮想ノードであればピンピンしている。そうは言っても、その辺が限界なんでしょ?という意見もあるだろう。

とりあえず50台ほど動かしてみたが、こんな感じだ。(もちろん、PCの性能やリソースに左右されるのは言うまでもない)

image10

当然だが、先のように物理IFに関連付けることで、複数台のマシンを使用すれば1万台規模のネットワーク再現は難しくないし、単にCPUとメモリを山積みにすれば、1台で数千台の再現も不可能ではないと思っている(もちろん、Linuxのファイルディスクリプタの設定や、ARPテーブル、NDPテーブル、ルーティングテーブルの大きさの調整は必須だろうが)。

更に、coreemuには分散処理を行うためのエミュレーションノード割り当て機能が実装されている。

使用するには、以下の編集を加えて、coreを再起動する必要がある。別に0.0.0.0ではなく、待ち受けるIPアドレスになりさえすればいい。

/etc/core/core.conf

#listenaddr = localhost
listenaddr = 0.0.0.0

再起動。

# /etc/init.d/core restart

では、192.168.1.1と192.168.1.2のcoreemu動作ノードがあると仮定して設定をしてみよう。

まず、GUIを表示すべきノードは1台だけだ。

そして、2台のノードをエミュレーションノードとして登録する。

Session->Emulation Servers...から、エミュレーションノード設定画面を出して、2台のノードを登録する。

image11

そして、トポロジを描いたら、各仮想ノードがどのホストで動作するかを決定する。

image12

そして、動作している際の、各分散ノード間がどうなっているかをwiresharkで見ると、こんな感じになる。

image13

そう、みんな大好きL2 GRE、Transparent Ethernet Bridge(0x6558)だね!(これが言いたくてこの記事書いた)

おしまい

つまり、Linuxで動くアプリなら何でもこのようにNetwork namespaceで区切って試験をすることが出来る。

そう、ユニキャストプロトコルルーティングに加えて、マルチキャストやらIPsecやら。拠点間VPNの前試験にも使えるね。

(ただ、VLCのようなXを必要とするアプリケーションは動かない場合もあるので気を付けるんだ)

更に、分散処理も可能だから大規模なネットワークも作れるし、物理IFとの関連付けも出来る。

僕は、特に意味もなく余った物理IFを2個持ってるマシンで動かして、ループバックなiperfやその他パケットぽいぽい投げる試験機代わりに使えるかなぁ、とか思って余ったNICを探してしまったよ。

研修で装置が準備出来ないけど、ルーティングプロトコルを見せてあげたい人にも向いてるんじゃないだろうか。

quaggaを動かす余計なプロセスをcoreemuが吸収してくれるので、Linuxの基本操作とルーティングに専念できるかもしれない。

まぁそういうわけで、みんなもTransparent Ethernet Bridge(0x6558)をよろしくね!

今日の教訓: 現実逃避のための記事は長くなる。