SDN開発エンジニアを目指した活動ブログ

〜SDNなオープンソース製品を実際に使って試してみる〜

家庭用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化

本構築手順は、MacBookMac 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ポート(青色のポート)を使用することにします。
f:id:ttsubo:20140406165055j:plain

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円程度で入手可能というのは、いちばんの魅力かもしれません。