自宅ネットワークにおけるOpenFlowスイッチ OpenvSwitchの導入¶
モチベーション¶
日本においてOpenFlowは近年のファブリック技術の発展・普及と 共に注目されている技術の一つである。
一般にOpenFlowに関してはUTMとの連携や帯域の有効活用が 現在よりも、そして、ファブリック技術よりも柔軟に可能と言われている。 しかし、また発展中の技術であること、実装が多くは存在しないことから、 OpenFlow技術自身が広く認知されているとは言い難い。
本稿では、 自宅における生活のネットワークをOpenFlowで制御できるようにする ことを目的とする。
自宅における運用に際して以下の点を留意した。
- 低価格: 個人で常識を疑われない投資コストであること
- 省電力: 暑くならない(電力が高い=熱いではないけれど)
- ファンレス: 夜寝れること
機材は図の通りである。 IX2015は必ずしも必要ない。 ただし、 この場合、Vlan100に相当する部分のルータのみブロードバンドルータに担わせ、 vlan210だけ、他
コントローラはNOXを用いる。 これは、OpenFlow Tutorialなどでも用いられており、 一般に広く用いられているコントローラ実装ためである。
スイッチはOpenFlowをサポートする仮想スイッチソフトウェアの OpenvSwitchを用いる。 仮想化の
NEC IX2015
ファンレスルータ。vlanを食える。トンネルもできる。L3としてしか動かず、vlanが透過できないことだけ問題。
NetGear GS108Ev2
ファンレススイッチ。vlanを食える。Windowsからしか管理できないがとにかく安い。7000円以下。
EPSON NP11
atomのPC。省電力。小さい。SSDに換装してある。
Debianの基本的な設定¶
VLAN I/Fの作成¶
まず、Debianに対してvlanを切る。
必要なpkgのインストール
aptitude install vlan
次に、interfacesにvlan I/Fの情報を書き、 networkingをrestartする。
/etc/network/interfaces
auto lo
iface lo inet loopback
auto eth2.200
iface eth2.200 inet static
address 192.168.200.240
netmask 255.255.255.0
gateway 192.168.200.254
dns-nameservers 192.168.200.254
auto eth2.210
iface eth2.210 inet manual
auto eth2.220
iface eth2.220 inet manual
し、
sudo /etc/init.d/networing restart
する。
Note
restartのタイミングでI/Fがtaggedでないとアクセスできなくなるので注意。
eth2.XXXはeth2を物理的なI/FとしてVLANIDがXXXの 802.1aq taggedの論理I/Fを切ることを意味する。
ifaceのmanualはアドレスは手動でつけられることを意味する。 必要に応じて、I/Fがup/downする際のpre/postスクリプトを記述することも出来る。 今回の場合、Debianではvlan210, vlan220をブリッジインタフェースとして 利用するため、アドレスを付与しない(L3終端しない)ようにした。
OpenvSwitch(ovs)インストール¶
まず、Debian上にソフトウェアスイッチであるovsをインストールする。 次に、ovsの初期化と先ほど作成した2つのvlan I/Fの追加を行い、 (OpenFlowスイッチとしてではなく)通常のスイッチとして動作させる。
ソースからのインストール¶
(2012/03/01現在) debianではovsのpkgは存在しない。 sidでは存在するが、ここでは、ソースからコンパイルした。
wheezyにあげます
sudo aptitude update
sudo aptitude full-upgrade
# コンパイルなどに必要なパッケージのインストール
sudo apt-get install python-qt4 python-zopeinterface python-twisted-conch pkg-config
sudo apt-get install build-essential fakeroot
# レポジトリの取得
mkdir ~/src
cd ~/src
git clone git://openvswitch.org/openvswitch
# 導入
cd openvswitch/
dpkg-checkbuilddeps
dpkg-checkbuilddeps: Unmet build dependencies: debhelper (>= 8) python-all (>= 2.6.6-3~)
といわれたので、
sudo apt-get install debhelper python-all
してから
fakeroot debian/rules binary
あるいは
DEB_BUILD_OPTIONS='parallel=8 nocheck' fakeroot debian/rules binary
を実行。後者はunit checkが飛ばされる。
cd ..
sudo dpkg -i openvswitch-common_1.10.90-1_i386.deb
sudo apt-get install uuid-runtime
sudo dpkg -i openvswitch-switch_1.10.90-1_i386.deb
すると、"Module openvswitch not found."
/usr/share/doc/openvswitch-datapath-source/README.Debian
をみろと怒られる。
sudo apt-get install module-assistant
sudo dpkg -i openvswitch-datapath-source_1.10.90-1_all.deb
/usr/share/doc/openvswitch-datapath-source/README.Debianを見ます。
sudo module-assistant auto-install openvswitch-datapath
sudo dpkg -i openvswitch-switch_1.10.90-1_i386.deb
あたらしいやつ¶
ovs-vsctl --no-wait init
# ブリッジの追加
ovs-vsctl add-br br0
# 確認 -> br0が見える
sudo ovs-vsctl show
# datapath変更
ovs-vsctl set bridge br0 datapath_type=netdev
# I/F追加
sudo ovs-vsctl add-port br0 eth2.210
sudo ovs-vsctl add-port br0 eth2.220
これで、bridgeにI/Fを追加できました!
ovsの初期設定(ここまでふるい)(旧設定)¶
# ovsの裏で動くDBが格納されるディレクトリとファイルを作成
sudo mkdir mkdir -p /usr/local/etc/openvswitch
sudo ovsdb-tool create /usr/local/etc/openvswitch/conf.db vswitchd/vswitch.ovsschema
# この時点で、DB Serverが動くので、まずは起動
sudo ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock \
--remote=db:Open_vSwitch,manager_options \
--bootstrap-ca-cert=db:SSL,ca_cert \
--pidfile --detach
# DBの初期化
ovs-vsctl --no-wait init
# 仮想スイッチを起動し、DBと接続する
# この時点では、単なる1つのプロセスであり、どのI/Fとも接続されていない
ovs-vswitchd unix:/usr/local/var/run/openvswitch/db.sock --pidfile --detach
POX¶
cd ~src
git clone git://github.com/noxrepo/pox.git
cd
sudo ovs-vsctl get-controller br0
sudo ovs-vsctl set-controller br0 tcp:127.0.0.1:6633
sudo ovs-vsctl get-controller br0
> tcp:127.0.0.1:6633
sudo ovs-ofctl dump-flows br0
> NXST_FLOW reply (xid=0x4):
./pox.py forwarding.l2_learning
NOXのインストール¶
http://blog.bitmeister.jp/?p=2176 を参考にしました。
cd /etc/apt/sources.list.d
sudo wget http://openflowswitch.org/downloads/debian/nox.listsudo
apt-get update
sudo apt-get install nox-dependencies
cd ~
git clone git://noxrepo.org/nox
cd nox
cd ~/nox/build/src
sudo vi +1125 /usr/lib/python2.6/dist-packages/twisted/internet/base.py
の下に
def _handleSigchld(self, signum, frame, _threadSupport=platform.supportsThreads()):
from twisted.internet.process import reapAllProcesses
if _threadSupport:
self.callFromThread(reapAllProcesses)
else:
self.callLater(0, reapAllProcesses)
初めてのOpenFlow Forwarding¶
$ ./nox_core -v -i ptcp:6633 pyswitch
別のウィンドウで
$ sudo ovs-vsctl get-controller br0
$ sudo ovs-vsctl set-controller br0 tcp:127.0.0.1:6633
$ sudo ovs-vsctl get-controller br0
tcp:127.0.0.1:6633
$ sudo ovs-ofctl dump-flows br0