家庭用BuffaloルータのOpenFlow化へのチャレンジ 〜OpenvSwitch構築手順メモ編〜
前回、家庭用Buffaloルータ”BHR-4GRV"をOpenFlow化して、OpenFlow基本動作を確認しました。
家庭用BuffaloルータのOpenFlow化へのチャレンジ 〜OpenFlow1.3動作確認編〜 - SDN開発エンジニアを目指した活動ブログ
SDN/OpenFlowの実験環境で、OpenFlowスイッチ台数を増やすことを想定して、OpenvSwitch構築手順をメモっておきます。
◆構築手順の流れ
(1) Buffaloルータ”BHR-4GRV"のOpenWRT化
(2) OpenWRTのネットワーク設定
(3) OpenvSwitchパッケージのインストール
◆BHR-4GRVのOpenWRT化
本構築手順は、MacBook(Mac OS X)での作業を想定しております。
注) ここでの構築手順は、個人の構築メモとして掲載しております。
(Buffaloルータ”BHR-4GRV"が文鎮化してしまうなどの不測な事態が発生しても、あくまでも、自己責任でお願いします。)
1. OpenWRファームウェアの入手
BHR-4GRV専用のOpenWRTファームウェアはありませんが、WZR-HP-G450Hで代用可能です。
Table of Hardware - OpenWrt Wiki
以下のファームウェアをダウンロードし、MacBookのローカルディスクに置いておきます。
openwrt-ar71xx-generic-wzr-hp-g450h-squashfs-tftp.bin
2. debugモードでのログイン
BHR-4GRVの初期状態では、192.168.12.1が設定されているようです。
まずは、WEBブラウザの管理コンソールから管理者パスワード(8文字以内)を設定しておきます。
そして、以下のURLからdebugモードでログインします。
http://192.168.12.1/cgi-bin/cgi?req=frm&frm=py-db/55debug.html ID:bufpy Password: otdpopy + 管理者パスワード
成功するとdebugメニュー画面が表示されるので、telnetd を有効にします。
以降、telnetでのアクセスが可能となります。
3. uboot変数の確認と変更
bootloader 「u-boot」用の変数(パラメータ)を確認します。
ipaddr: 192.168.11.1
uboot_ethaddr: 02:AA:BB:CC:DD:22
BHR-4GRVのデフォルト管理IPは192.168.12.1ですが、uboot変数値は192.168.11.1になっている点を留意しておきましょう。
# ubootenv list
tftpでのファームウェアインストールをできるようにするために accept_open_rt_fmt を設定します。
# ubootenv set accept_open_rt_fmt 1
末尾に変数が登録されたことを確認します。
# ubootenv list
4. MacBookのアドレス設定
IPアドレスを以下に設定します。
IPアドレス:192.168.11.2
サブネットマスク:255.255.255.0
以下のコマンドで、MacBook上のarpテーブルにMACアドレスをスタティックで登録しておきます。
$ sudo arp -s 192.168.11.1 02:AA:BB:CC:DD:22
5. TFTPでのOpenWRTファームウェアのインストール
まずは、TFTP動作環境を設定しておきます。
$ tftp tftp> connect 192.168.11.1 tftp> verbose tftp> binary tftp> trace tftp> rexmt 1 tftp> timeout 60
つぎに、BHR-4GRVの電源ONして、数秒後に、OpenWRTファームウェアの流し込みを開始します。
tftp> put openwrt-ar71xx-generic-wzr-hp-g450h-squashfs-tftp.bin
以上で、OpenWRT化は完了です。
こちらのURLも参考になると思います。
Buffalo WHR-HP-G300N - OpenWrt Wiki
◆OpenWRTのネットワーク設定
BHR-4GRVのOpenWRT化が完了したら、つぎに、OpenvSwitch動作環境に関わるネットワーク設定を行います。
なお、BHR-4GRVの外観上のRJ45ポートが、Etherポートに対応しているわけではないようです。
すなわち、BHR-4GRV内部のEtherSwitchでeth0ポートを共有する仕組みとなっているみたいです。
よって、今回は、下図のようなVLAN構成となるようにコンフィグ設定を行います。
OpenFlowコントローラとのSecureチャネル接続は、WANポート(青色のポート)を使用することにします。
1. OpenWRTへのログイン
BHR-4GRVのLAN側ポートとMacBookをLANケーブル接続して、rootユーザで、OpenWRTにログインしてみます。
(青色のWAN側ポートではありません。)
$ ssh root@192.168.1.1 root@192.168.1.1's password: BusyBox v1.19.4 (2014-03-30 18:50:39 JST) built-in shell (ash) Enter 'help' for a list of built-in commands. _______ ________ __ | |.-----.-----.-----.| | | |.----.| |_ | - || _ | -__| || | | || _|| _| |_______|| __|_____|__|__||________||__| |____| |__| W I R E L E S S F R E E D O M ----------------------------------------------------- BARRIER BREAKER (Bleeding Edge, r40300) ----------------------------------------------------- * 1/2 oz Galliano Pour all ingredients into * 4 oz cold Coffee an irish coffee mug filled * 1 1/2 oz Dark Rum with crushed ice. Stir. * 2 tsp. Creme de Cacao -----------------------------------------------------
2. SSH通過の設定
外部から、WANポートに対してSSHログインが可能なように、firewall設定を行います。
root@OpenWrt:~# vi /etc/config/firewall ----------------------- config zone option name lan list network 'lan' option input ACCEPT option output ACCEPT option forward ACCEPT config zone option name wan list network 'wan' option input ACCEPT option output ACCEPT option forward ACCEPT config forwarding option src lan option dest wan # Allow SSH config rule option name Allow-ssh option src wan option proto tcp option dest_port 22 option target ACCEPT
コンフィグ設定を行ったら、firewallルール有効化のために再起動します。
root@OpenWrt:~# /etc/init.d/firewall restart
3. アドレス設定
WAN側ポートには、以下のIPアドレスを設定します。
IPアドレス:192.168.0.1
サブネットマスク:255.255.255.0
root@OpenWrt:~# vi /etc/config/network ----------------------- config interface 'loopback' option ifname 'lo' option proto 'static' option ipaddr '127.0.0.1' option netmask '255.0.0.0' config switch option name 'switch0' option reset '1' option enable_vlan '1' config switch_vlan option device 'switch0' option vlan '1' option ports '0t 2' config interface 'lan1' option ifname 'eth0.1' option proto 'static' config switch_vlan option device 'switch0' option vlan '2' option ports '0t 3' config interface 'lan2' option ifname 'eth0.2' option proto 'static' config switch_vlan option device 'switch0' option vlan '3' option ports '0t 4' config interface 'lan3' option ifname 'eth0.3' option proto 'static' config switch_vlan option device 'switch0' option vlan '4' option ports '0t 5' config interface 'lan4' option ifname 'eth0.4' option proto 'static' config switch_vlan option device 'switch0' option vlan '5' option ports '0t 1' config interface 'wan1' option ifname 'eth0.5' option proto 'static' option ipaddr '192.168.0.1' option netmask '255.255.255.0'
コンフィグ設定を行ったら、ネットワーク有効化のために再起動します。
root@OpenWrt:~# /etc/init.d/network restart
BHR-4GRVのWAN側ポートとMacBookをLANケーブル接続して、OpenWRTに再ログインします。
NIC設定の確認すると、こんな感じで出力されます。
root@OpenWrt:~# ifconfig eth0 Link encap:Ethernet HWaddr 96:3C:D2:D7:9E:BB inet6 addr: fe80::943c:d2ff:fed7:9ebb/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:42 errors:0 dropped:0 overruns:0 frame:0 TX packets:54 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:6061 (5.9 KiB) TX bytes:7534 (7.3 KiB) Interrupt:4 eth0.1 Link encap:Ethernet HWaddr 96:3C:D2:D7:9E:BB inet6 addr: fe80::943c:d2ff:fed7:9ebb/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:4 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:408 (408.0 B) eth0.2 Link encap:Ethernet HWaddr 96:3C:D2:D7:9E:BB inet6 addr: fe80::943c:d2ff:fed7:9ebb/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:4 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:408 (408.0 B) eth0.3 Link encap:Ethernet HWaddr 96:3C:D2:D7:9E:BB inet6 addr: fe80::943c:d2ff:fed7:9ebb/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:5 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:478 (478.0 B) eth0.4 Link encap:Ethernet HWaddr 96:3C:D2:D7:9E:BB inet6 addr: fe80::943c:d2ff:fed7:9ebb/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:4 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:408 (408.0 B) eth0.5 Link encap:Ethernet HWaddr 96:3C:D2:D7:9E:BB inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0 inet6 addr: fe80::943c:d2ff:fed7:9ebb/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:42 errors:0 dropped:0 overruns:0 frame:0 TX packets:33 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:5305 (5.1 KiB) TX bytes:5184 (5.0 KiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:432 errors:0 dropped:0 overruns:0 frame:0 TX packets:432 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:29376 (28.6 KiB) TX bytes:29376 (28.6 KiB)
◆OpenvSwitchインストール
OpenWRTのネットワーク設定が終わったら、OpenvSwitchパッケージをインストールします。
1. OpenvSwitchパッケージの入手
まずは、MacBook上に、OpenvSwitchパッケージをダウンロードしておきます。
Releases · ttsubo/openvswitch · GitHub
そして、OpenWRT上に、OpenvSwitchパッケージをアップロードします。
scp kmod-crypto-crc32c_3.10.34-1_ar71xx.ipk root@192.168.0.1:/root scp kmod-crypto-hash_3.10.34-1_ar71xx.ipk root@192.168.0.1:/root scp kmod-gre_3.10.34-1_ar71xx.ipk root@192.168.0.1:/root scp kmod-iptunnel_3.10.34-1_ar71xx.ipk root@192.168.0.1:/root scp kmod-lib-crc32c_3.10.34-1_ar71xx.ipk root@192.168.0.1:/root scp kmod-llc_3.10.34-1_ar71xx.ipk root@192.168.0.1:/root scp kmod-openvswitch_3.10.34.2.1.0-1_ar71xx.ipk root@192.168.0.1:/root scp kmod-stp_3.10.34-1_ar71xx.ipk root@192.168.0.1:/root scp openvswitch-common_2.1.0-1_ar71xx.ipk root@192.168.0.1:/root scp openvswitch-switch_2.1.0-1_ar71xx.ipk root@192.168.0.1:/root scp libopenssl_1.0.1f-1_ar71xx.ipk root@192.168.0.1:/root scp libpcap_1.5.3-1_ar71xx.ipk root@192.168.0.1:/root scp librt_0.9.33.2-1_ar71xx.ipk root@192.168.0.1:/root scp libpthread_0.9.33.2-1_ar71xx.ipk root@192.168.0.1:/root scp zlib_1.2.8-1_ar71xx.ipk root@192.168.0.1:/root
そして、OpenWRT上で、パッケージインストールを行います。
$ ssh root@192.168.0.1 root@192.168.0.1's password: BusyBox v1.19.4 (2014-03-30 18:50:39 JST) built-in shell (ash) Enter 'help' for a list of built-in commands. _______ ________ __ | |.-----.-----.-----.| | | |.----.| |_ | - || _ | -__| || | | || _|| _| |_______|| __|_____|__|__||________||__| |____| |__| W I R E L E S S F R E E D O M ----------------------------------------------------- BARRIER BREAKER (Bleeding Edge, r40300) ----------------------------------------------------- * 1/2 oz Galliano Pour all ingredients into * 4 oz cold Coffee an irish coffee mug filled * 1 1/2 oz Dark Rum with crushed ice. Stir. * 2 tsp. Creme de Cacao ----------------------------------------------------- root@OpenWrt:~# ls -l -rw-r--r-- 1 root root 1704 Mar 30 15:13 kmod-crypto-crc32c_3.10.34-1_ar71xx.ipk -rw-r--r-- 1 root root 6620 Mar 30 15:13 kmod-crypto-hash_3.10.34-1_ar71xx.ipk -rw-r--r-- 1 root root 8155 Mar 30 15:13 kmod-gre_3.10.34-1_ar71xx.ipk -rw-r--r-- 1 root root 8220 Mar 30 15:14 kmod-iptunnel_3.10.34-1_ar71xx.ipk -rw-r--r-- 1 root root 1591 Mar 30 15:14 kmod-lib-crc32c_3.10.34-1_ar71xx.ipk -rw-r--r-- 1 root root 684 Mar 30 15:14 kmod-llc_3.10.34-1_ar71xx.ipk -rw-r--r-- 1 root root 39049 Mar 30 15:14 kmod-openvswitch_3.10.34.2.1.0-1_ar71xx.ipk -rw-r--r-- 1 root root 695 Mar 30 15:14 kmod-stp_3.10.34-1_ar71xx.ipk -rw-r--r-- 1 root root 674063 Mar 30 15:15 libopenssl_1.0.1f-1_ar71xx.ipk -rw-r--r-- 1 root root 88627 Mar 30 15:16 libpcap_1.5.3-1_ar71xx.ipk -rw-r--r-- 1 root root 31833 Mar 30 15:16 libpthread_0.9.33.2-1_ar71xx.ipk -rw-r--r-- 1 root root 5592 Mar 30 15:16 librt_0.9.33.2-1_ar71xx.ipk -rw-r--r-- 1 root root 523230 Mar 30 15:15 openvswitch-common_2.1.0-1_ar71xx.ipk -rw-r--r-- 1 root root 1421554 Mar 30 15:15 openvswitch-switch_2.1.0-1_ar71xx.ipk -rw-r--r-- 1 root root 40544 Mar 30 15:16 zlib_1.2.8-1_ar71xx.ipk root@OpenWrt:~# opkg install kmod-llc_3.10.34-1_ar71xx.ipk Installing kmod-llc (3.10.34-1) to root... Configuring kmod-llc. root@OpenWrt:~# opkg install kmod-stp_3.10.34-1_ar71xx.ipk Installing kmod-stp (3.10.34-1) to root... Configuring kmod-stp. root@OpenWrt:~# opkg install kmod-iptunnel_3.10.34-1_ar71xx.ipk Installing kmod-iptunnel (3.10.34-1) to root... Configuring kmod-iptunnel. root@OpenWrt:~# opkg install kmod-gre_3.10.34-1_ar71xx.ipk Installing kmod-gre (3.10.34-1) to root... Configuring kmod-gre. root@OpenWrt:~# opkg install kmod-crypto-hash_3.10.34-1_ar71xx.ipk Installing kmod-crypto-hash (3.10.34-1) to root... Configuring kmod-crypto-hash. root@OpenWrt:~# opkg install kmod-crypto-crc32c_3.10.34-1_ar71xx.ipk Installing kmod-crypto-crc32c (3.10.34-1) to root... Configuring kmod-crypto-crc32c. root@OpenWrt:~# opkg install kmod-lib-crc32c_3.10.34-1_ar71xx.ipk Installing kmod-lib-crc32c (3.10.34-1) to root... Configuring kmod-lib-crc32c. root@OpenWrt:~# modprobe libcrc32c root@OpenWrt:~# opkg install kmod-openvswitch_3.10.34.2.1.0-1_ar71xx.ipk Installing kmod-openvswitch (3.10.34+2.1.0-1) to root... Configuring kmod-openvswitch. root@OpenWrt:~# lsmod|grep open gre 1874 2 openvswitch libcrc32c 599 1 openvswitch openvswitch 60332 0 root@OpenWrt:~# opkg install zlib_1.2.8-1_ar71xx.ipk Installing zlib (1.2.8-1) to root... Configuring zlib. root@OpenWrt:~# opkg install libopenssl_1.0.1f-1_ar71xx.ipk Installing libopenssl (1.0.1f-1) to root... Configuring libopenssl. root@OpenWrt:~# opkg install libpcap_1.5.3-1_ar71xx.ipk Installing libpcap (1.5.3-1) to root... Configuring libpcap. root@OpenWrt:~# opkg install libpthread_0.9.33.2-1_ar71xx.ipk Installing libpthread (0.9.33.2-1) to root... Configuring libpthread. root@OpenWrt:~# opkg install librt_0.9.33.2-1_ar71xx.ipk Installing librt (0.9.33.2-1) to root... Configuring librt. root@OpenWrt:~# opkg install openvswitch-common_2.1.0-1_ar71xx.ipk Installing openvswitch-common (2.1.0-1) to root... Configuring openvswitch-common. root@OpenWrt:~# opkg install openvswitch-switch_2.1.0-1_ar71xx.ipk Installing openvswitch-switch (2.1.0-1) to root... Configuring openvswitch-switch. root@OpenWrt:~# /etc/init.d/openvswitch start 2014-03-30T15:26:01Z|00001|reconnect|INFO|unix:/var/run/db.sock: connecting... 2014-03-30T15:26:01Z|00002|reconnect|INFO|unix:/var/run/db.sock: connected
以上で、OpenvSwitchインストールは完了です。
いちおう、OpenvSwitchのバージョンを確認しておきます。
root@OpenWrt:~# ovs-vsctl -V ovs-vsctl (Open vSwitch) 2.1.0 Compiled Mar 30 2014 17:50:11
2. OpenvSwitch設定
ここからは、一般的なOpenvSwitch設定作業ですね。
root@OpenWrt:~# ovs-vsctl add-br br0 root@OpenWrt:~# ovs-vsctl add-port br0 eth0.1 root@OpenWrt:~# ovs-vsctl add-port br0 eth0.2 root@OpenWrt:~# ovs-vsctl set-controller br0 tcp:192.168.0.100:6633 root@OpenWrt:~# ovs-vsctl set bridge br0 other-config:datapath-id=0000000000000001 root@OpenWrt:~# ovs-vsctl set bridge br0 protocols=OpenFlow13
設定結果を確認しておきます。
root@OpenWrt:~# ovs-vsctl show 6d27491f-e242-4a02-acf3-cd0c28d16de2 Bridge "br0" Controller "tcp:192.168.0.100:6633" Port "eth0.2" Interface "eth0.2" Port "eth0.1" Interface "eth0.1" Port "br0" Interface "br0" type: internal root@OpenWrt:~# ovs-ofctl dump-ports-desc br0 --protocols=OpenFlow13 OFPST_PORT_DESC reply (OF1.3) (xid=0x2): 1(eth0.1): addr:96:3c:d2:d7:9e:bb config: 0 state: 0 current: 1GB-FD AUTO_NEG advertised: 1GB-FD supported: 1GB-FD speed: 1000 Mbps now, 1000 Mbps max 2(eth0.2): addr:96:3c:d2:d7:9e:bb config: 0 state: 0 current: 1GB-FD AUTO_NEG advertised: 1GB-FD supported: 1GB-FD speed: 1000 Mbps now, 1000 Mbps max LOCAL(br0): addr:fa:e4:ce:22:a1:9b config: 0 state: 0 speed: 0 Mbps now, 0 Mbps max
以上で、OpenWRT上でのOpenvSwitch環境が構築できました。
◆留意事項
OpenWRT上でのネットワーク設定では、各ポートをeth0上で共有する形態になっています。
従って、各ポートに割り当てられたMACアドレスがみんな同じ値になってしまっております。
今回のSDN/OpenFlow実験環境で使用する際には、MACアドレス制御もOpenFlowで管理が可能となるので、特に気にする必要がないと思います。しかし、オーバレイNWネットワークとして、本装置を活用する場合には、ネットワークトポロジ上でのMACテーブル管理で、ループ等の弊害が発生するかもしれません。
◆終わりに
前回を通じて、"OpenWRT+OpenvSwitch"でOpenFlow1.3スイッチ環境を構築してみました。
構築手順も、OpenWRTファーム構築さえ慣れてしまえば、OpenFlowスイッチ台数の拡張時にも、それほど苦労なく対応できると思います。
さらに、OpenFlowスイッチが6,000円程度で入手可能というのは、いちばんの魅力かもしれません。