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」カテゴリの記事
- ◆ 【Open vSwitchのみで OpenFlowプログラミング】VLAN ID コンバータ 改(2013.08.10)
- ◆ 【Open vSwitchのみで OpenFlowプログラミング】VLAN ID コンバータ(2013.08.05)
- ◆ 【TremaでOpenFlowプログラミング】VLAN ID コンバータ(2013.05.12)
- ◆ Linux のネットワークネームスペース機能と Open vSwitch で仮想ネットワーク(OpenFlowスイッチとTrema)(2013.05.11)
- ◆ OpenFlow 1.0.0 メッセージと Trema API(Ruby) との対応表(2013.05.08)
「Trema」カテゴリの記事
- ◆【改訂】OpenFlow フレームワーク Trema 0.4 のインストール手順【0.4.7対応】(2014.06.11)
- ◆ Trema 0.4.7インストール失敗とバージョン指定インストール(2014.06.08)
- ◆ OpenFlowフレームワーク Trema 0.4 のインストール(2013.10.06)
- ◆ 【TremaでOpenFlowプログラミング】VLAN ID コンバータ(2013.05.12)
- ◆ Linux のネットワークネームスペース機能と Open vSwitch で仮想ネットワーク(OpenFlowスイッチとTrema)(2013.05.11)
「TremaでOpenFlowプログラミング」カテゴリの記事
- ◆ 【TremaでOpenFlowプログラミング】VLAN ID コンバータ(2013.05.12)
- ◆ OpenFlow 1.0.0 メッセージと Trema API(Ruby) との対応表(2013.05.08)
- ネットワークネームスペース機能使用時の Trema 停止エラー軽減方法(2013.03.16)
- 【TremaでOpenFlowプログラミング】マッチングルール早見表(2013.03.02)
- Trema の仮想ネットワーク機能には『OpenFlow実践入門』に書いてない強力な機能がありました。(2013.02.03)
この記事へのコメントは終了しました。
« Trema の仮想ネットワークの落とし穴。ARPなしで通信してしまう | トップページ | 2万円で OpenFlow スイッチを自作しよう »
コメント