« Trema の仮想ネットワークの落とし穴。ARPなしで通信してしまう | トップページ | 2万円で OpenFlow スイッチを自作しよう »

2013年2月 3日 (日)

Trema の仮想ネットワーク機能には『OpenFlow実践入門』に書いてない強力な機能がありました。

『OpenFlow実践入門』(初版)の第10章と第11章で解説されている「シンプルなルーター」のテストをするには実機のホストを必要とします。しかし、実機不要でテストする方法があることが分かりました。

実機のホストの代わりに、ネットワークネームスペース機能を利用します。ただし、この機能を使うには、Ubuntu 12.04 以降のバージョンが必要だそうです。

ネットワークネームスペース機能は書籍では全く触れていないのですが、trema help でコマンドラインのヘルプを表示させると netns というサブコマンドがあり、気になってググってみました。すると、開発者の方のブログで仮想ネットワークで任意のアプリを動かすという記事がヒットして発見しました。

これ、すごく便利で強力な機能です!

「シンプルなルーター」のテスト環境、および実行方法は「11.4 実行してみよう」(P.183~) に記載があります。ここの仮想ネットワークをネットワークネームスペースを用いたものに置き換えて試します。

■仮想ネットワーク定義

netns のところがネットワークネームスペースで、仮想ホストのように IP アドレスを割り当てるだけでなく、さらにルーティング情報も追加できます。

今回は、デフォルトルートを設定としたので "0.0.0.0" にしましたが、特定のネットワークを指定する場合は "192.168.2.0/24" のようにビットマスクも付けて指定します。

vswitch( "switch" ) {
  datapath_id "0x1"
}
netns( "host1" ) {
  ip "192.168.1.2"
  netmask "255.255.255.0"
  route :net => "0.0.0.0", :gw => "192.168.1.1"
}
netns( "host2" ) {
  ip "192.168.2.2"
  netmask "255.255.255.0"
  route :net => "0.0.0.0", :gw => "192.168.2.1"
}
link "switch", "host1"
link "switch", "host2"

■ネットワークネームスペース内でシェル起動

Trema で仮想ネットワークを起動後に以下のようにして該当するネットワークネームスペース内でシェルを起動します。以下のコマンドでは先ほどの仮想ネットワークの定義で記述した host1 を起動しています。

$ trema netns host1

コマンドを実行すると新たにシェルが起動します。ここで実行されるコマンドはすべてこのネットワークネームスペース内に閉じたネットワーク環境で動きます。

■host1 での実行結果

まずは、ネットワーク環境を確認してみます。

インタフェース情報:

# ifconfig
lo	  Link encap:ローカルループバック
	  inetアドレス:127.0.0.1  マスク:255.0.0.0
	  inet6アドレス: ::1/128 範囲:ホスト
	  UP LOOPBACK RUNNING  MTU:16436  メトリック:1
	  RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0
	  TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0
	  衝突(Collisions):0 TXキュー長:0
	  RXバイト:0 (0.0 B)  TXバイト:0 (0.0 B)
trema0-1  Link encap:イーサネット  ハードウェアアドレス 86:5e:1c:38:95:28
	  inetアドレス:192.168.1.2  ブロードキャスト:192.168.1.255  マスク:255.255.255.0
	  inet6アドレス: fe80::845e:1cff:fe38:9528/64 範囲:リンク
	  UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
	  RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0
	  TXパケット:6 エラー:0 損失:0 オーバラン:0 キャリア:0
	  衝突(Collisions):0 TXキュー長:1000
	  RXバイト:0 (0.0 B)  TXバイト:468 (468.0 B)

ルーティング情報:

# netstat -r
カーネルIP経路テーブル
受信先サイト	ゲートウェイ	ネットマスク   フラグ	MSS Window  irtt インタフェース
default 	192.168.1.1	0.0.0.0 	UG	  0 0	       0 trema0-1
192.168.1.0	*		255.255.255.0	U	  0 0	       0 trema0-1

書籍と同様に ping を実行していきます。

# ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_req=2 ttl=64 time=40.0 ms
64 bytes from 192.168.1.1: icmp_req=3 ttl=64 time=34.3 ms
64 bytes from 192.168.1.1: icmp_req=4 ttl=64 time=22.1 ms
^C
--- 192.168.1.1 ping statistics ---
4 packets transmitted, 3 received, 25% packet loss, time 3011ms
rtt min/avg/max/mdev = 22.125/32.200/40.081/7.495 ms

# ping 192.168.2.2
PING 192.168.2.2 (192.168.2.2) 56(84) bytes of data.
64 bytes from 192.168.2.2: icmp_req=2 ttl=64 time=40.4 ms
64 bytes from 192.168.2.2: icmp_req=3 ttl=64 time=27.7 ms
64 bytes from 192.168.2.2: icmp_req=4 ttl=64 time=0.978 ms
64 bytes from 192.168.2.2: icmp_req=5 ttl=64 time=1.60 ms
^C
--- 192.168.2.2 ping statistics ---
5 packets transmitted, 4 received, 20% packet loss, time 4003ms
rtt min/avg/max/mdev = 0.978/17.684/40.457/17.005 ms

このときの arp キャッシュは、以下のようにルータ側がキャッシュされています:

# arp -a
? (192.168.1.1) at 00:00:00:01:00:01 [ether] on trema0-1

■終了手順

trema netns で起動したシェルを先に終了してから trema のコントローラ側を終了してください。

たとえば、host1 を起動したまま、trema コントローラ側を Ctrl-C で停止した場合、以下のように削除できないとのメッセージがでます:

Cannot remove /var/run/netns/host1: Device or resouce busy
Command 'sudo ip netns delete host1' failed!

ip netns list コマンドでネームスペースの一覧を確認できますのでゴミが残ってしまった場合は手動で削除してください。

以下は、ゴミが残ってしまっていた場合:

$ ip netns list
host2
host1

この場合、以下のように手動で削除:

$ sudo ip netns delete host1
$ sudo ip netns delete host2

■おまけ:確認に用いた環境

(1)  OS: Lubuntu 12.04 Desktop (i386)

  パッケージで入れた trema version 0.3.5

(2)  OS: Lubuntu 12.10 Desktop (i386)

  パッケージで入れた trema version 0.3.3

« Trema の仮想ネットワークの落とし穴。ARPなしで通信してしまう | トップページ | 2万円で OpenFlow スイッチを自作しよう »

OpenFlow」カテゴリの記事

Trema」カテゴリの記事

TremaでOpenFlowプログラミング」カテゴリの記事

コメント

この記事へのコメントは終了しました。

« Trema の仮想ネットワークの落とし穴。ARPなしで通信してしまう | トップページ | 2万円で OpenFlow スイッチを自作しよう »

最近のトラックバック

無料ブログはココログ