Click Modular Routerとは
MIT(マサチューセッツ工科大学)が作ったソフトウェアルータで、 プロトコルを実装・評価するためのシミュレータ。SDN
、さらには DPN
ができるすごいヤツ。簡易なDSLを記述することでルータやゲートウェイなど、様々なネットワークノードを実装できるので便利です。
どのように使うの?
element
というモジュールを組み合わせることでノードを設計・実装します。様々なモジュールが提供されています。また、ドキュメントも充実していて親切。欲しいモジュールがあればユーザ自身で C++
を用いて実装することも可能です。
モジュール(element)
下図に element
を接続することで設計されたノード(CLICKDIR/conf/demo.click)を示します。薄黄色の箱の一つ一つが element
です。
element
は其々が C++
実装されたクラスです。提供される仮想クラスを継承・仮想メンバ関数を実装することで element
を作れます。
パッケージ(.click)
ノードを記述するときにDSLを用います。element
を宣言・接続するだけ、とても簡単。下記に.clickファイル(CLICKDIR/conf/demo.click)を示します。
// Suck stuff in.
PollDevice(eth7) -> c0 :: Classifier(12/0806 20/0001,
12/0806 20/0002,
12/0800,
-);
out :: Queue(1024) -> ToDevice(eth4);
// ARP request need to be answered, obviously
c0[0]
-> ARPResponder(7.0.0.1 00:C0:95:E1:FC:D6)
-> out;
// ARP responses are handed to Linux
c0[1]
-> ToHost();
// Non-IP packets are dropped
c0[3]
-> Discard;
// Other IP packets. Split on UDP, TCP and rest
c0[2]
-> Strip(14)
-> CheckIPHeader()
-> c1 :: Classifier(9/17, 9/6, -);
// TCP packets
c1[1] -> Print(TCP) -> out;
// UDP packets
c1[0]
-> Print(UDP)
-> udp_mon :: IPRateMonitor(DST, PACKETS, 0, 10, 30)
-> udp_block :: Block(20)
-> out;
// non-UDP and non-TCP packets
c1[2] -> Print(UNKNOWN) -> out;
インストール手順
下記にインストール手順を示します。足りないモノが何かがあれば configure
が教えてくれるはず。
$ git clone git://github.com/kohler/click.git
or
$ wget read.cs.ucla.edu/click/click-VERSION.tar.gz
$ tar czvf click-VERSION.tar.gz click
$ cd click && autoconf
$ sudo ./configure --prefix=CLICKDIR
$ sudo make
$ sudo make install
動作確認
テスト用のパッケージ conf/test.click
を実行、"ok"が5つ出ればインストール完了。
$ userlevel/click conf/test.click
ok: 40 | 45000028 00000000 401177c3 01000001 02000002 13691369
ok: 40 | 45000028 00000000 401177c3 01000001 02000002 13691369
ok: 40 | 45000028 00000000 401177c3 01000001 02000002 13691369
ok: 40 | 45000028 00000000 401177c3 01000001 02000002 13691369
ok: 40 | 45000028 00000000 401177c3 01000001 02000002 13691369
ついでに、ping箱(icmp エコー要求を受信すると標準出力するネットワークノード)を実行。他の計算機から ping
してみると
$ sudo ./userlevel/click conf/print-pings.click
1400313867.128195: 192.168.0.6 > 192.168.0.2: icmp echo (9733, 0)
1400313868.124981: 192.168.0.6 > 192.168.0.2: icmp echo (9733, 1)
1400313869.126363: 192.168.0.6 > 192.168.0.2: icmp echo (9733, 2)
1400313870.127983: 192.168.0.6 > 192.168.0.2: icmp echo (9733, 3)
1400313871.128845: 192.168.0.6 > 192.168.0.2: icmp echo (9733, 4)
1400313872.129952: 192.168.0.6 > 192.168.0.2: icmp echo (9733, 5)
1400313873.131363: 192.168.0.6 > 192.168.0.2: icmp echo (9733, 6)
1400313874.132591: 192.168.0.6 > 192.168.0.2: icmp echo (9733, 7)