OpenFlow簡易ルータの実践活用(2) 〜LINC-Switch導入編〜
前回は、OpenvSwitch (2.0.0)で構築したOpenFlowスイッチとOpenFlow簡易ルータを、自宅ネットワークに導入してみました。
今回は、OpenFlowスイッチとして、LINC-Switchを採用して、前回と同様に自宅ネットワークに導入してみたいと思います。
◆導入形態
導入形態は、前回とまったく同様の構成になります。
OpenFlow簡易ルータの実践活用(1) 〜OpenvSwitch導入編〜 - SDN開発エンジニアを目指した活動ブログ
1. Ryuコントローラの最新化
Ryuコントローラのインストールが最近行われていない場合は、後述のof_configが失敗する可能性があります。
私のRyuコントローラ環境では、lxmlをアップグレードすることでof_configが使用できるようになりました。
$ sudo pip install lxml --upgrade
2. LINC-Switchの環境構築
つぎに、LINC-Switch環境手順です。
こちらのブログ記事を参考にさせて頂きました。
Raspberry Piで家庭内LANをOpenFlow化 (part 1) | d.yasukun
LINC-Switchのインストールが完了したら、早速、LINC-Switchを起動してみます。
$ sudo LINC-Switch/rel/linc/bin/linc console Exec: /home/tsubo/LINC-Switch/rel/linc/erts-5.10.4/bin/erlexec -boot /home/tsubo/LINC-Switch/rel/linc/releases/1.0/linc -mode embedded -config /home/tsubo/LINC-Switch/rel/linc/releases/1.0/sys.config -args_file /home/tsubo/LINC-Switch/rel/linc/releases/1.0/vm.args -- console Root: /home/tsubo/LINC-Switch/rel/linc Erlang R16B03-1 (erts-5.10.4) [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] 22:09:22.086 [info] Application lager started on node linc@OFS 22:09:22.087 [info] Application ssh started on node linc@OFS 22:09:22.087 [info] Application enetconf started on node linc@OFS 22:09:22.125 [info] Application linc started on node linc@OFS Eshell V5.10.4 (abort with ^G) (linc@OFS)1> 22:09:22.158 [info] Created port: {port,1,[{queues_status,disabled},{queues,[]},{config,{port_configuration,undefined,up,false,false,false}},{features,{features,undefined,'100Mb-FD',true,copper,unsupported}},{queues,[]},{interface,"eth2"}]} 22:09:22.194 [info] Created port: {port,2,[{queues_status,disabled},{queues,[]},{config,{port_configuration,undefined,up,false,false,false}},{features,{features,undefined,'100Mb-FD',true,copper,unsupported}},{queues,[]},{interface,"eth1"}]}
3. of_configによるdatapath-idの変更
LINC-Switchのdatapath-idは、デフォルト値を使用せず、「0000000000000001」に変更する必要があります。
LINC-Switchでは、of-configによりdatapath-idを変更できるようです。
Ryuコントローラも、of_configに対応しておりますので、今回は、of_config用pythonスクリプトで対応します。
from ryu.lib.of_config.capable_switch import OFCapableSwitch import time sess = OFCapableSwitch( host='192.168.0.1', port=1830, username='linc', password='linc', unknown_host_cb=lambda host, fingeprint: True) #------------------------------------------- # edit_config " #------------------------------------------- csw = sess.get_config('running') for p in csw.logical_switches.switch: p.datapath_id = '00:00:00:00:00:01:00:00' sess.edit_config('running', csw) time.sleep(3) #------------------------------------------- # get_config " #------------------------------------------- csw = sess.get_config('running') for p in csw.logical_switches.switch: print p
of_config用pythonスクリプトを、Ryuコントローラから起動します。
$ python of_config.py OFLogicalSwitchType(capabilities=None,check_controller_certificate=None,controllers=OFLogicalSwitchControllersType(controller=[OFControllerType(id='Switch0-DefaultController',ip_address='192.168.0.100',local_ip_address=None,local_port=None,port=6633,protocol='tcp',role='equal',state=OFControllerStateType(connection_state='down',current_version=None,local_ip_address_in_use=None,local_port_in_use=None,supported_versions=[1.3]))]),datapath_id='00:00:00:00:00:01:00:00',enabled=None,id='LogicalSwitch0',lost_connection_behavior=None,resources=OFLogicalSwitchResourcesType(certificate=None,flow_table=[],port=['LogicalSwitch0-Port2', 'LogicalSwitch0-Port1'],queue=[])) $
4. OpenFlow簡易ルータの動作準備
ここからは、前回とまったく同様の手順です。
Ryu SDN Frameworkが動作する環境に、OpenFlow簡易ルータのプログラム一式を以下のサイトからダウンロードした上で、 Ryuコントローラを起動します。
Release OpenFlow簡易ルータ(基本動作版) · ttsubo/simpleRouter · GitHub
- Ryuコントローラの起動
$ cd simpleRouter-0.1/ryu-app/ $ ryu-manager openflowRouter.py loading app openflowRouter.py loading app ryu.controller.ofp_handler loading app ryu.controller.ofp_handler creating context wsgi instantiating app None of SimpleMonitor creating context monitor instantiating app openflowRouter.py of OpenflowRouter instantiating app ryu.controller.ofp_handler of OFPHandler (10256) wsgi starting up on http://0.0.0.0:8080/
- eth1側の物理ポート設定
$ curl -s -X POST -d '{"interface": {"macaddress": "00:00:00:00:00:01", "ipaddress": "192.168.100.100", "port": "1", "opposite_ipaddress": "192.168.100.1"}}' http://localhost:8080/openflow/0000000000000001/interface | python -mjson.tool { "id": "0000000000000001", "interface": { "ipaddress": "192.168.100.100", "macaddress": "00:00:00:00:00:01", "opposite_ipaddress": "192.168.100.1", "port": "1" } }
- eth2側の物理ポート設定
$ curl -s -X POST -d '{"interface": {"macaddress": "00:00:00:00:00:02", "ipaddress": "192.168.101.100", "port": "2", "opposite_ipaddress": "192.168.101.1"}}' http://localhost:8080/openflow/0000000000000001/interface | python -mjson.tool { "id": "0000000000000001", "interface": { "ipaddress": "192.168.101.100", "macaddress": "00:00:00:00:00:02", "opposite_ipaddress": "192.168.101.1", "port": "2" } }
$ curl -s -X POST -d '{"gateway": {"ipaddress": "192.168.100.1"}}' http://localhost:8080/openflow/0000000000000001/gateway | python -mjson.tool { "gateway": { "ipaddress": "192.168.100.1" }, "id": "0000000000000001" }
以上で、環境準備は終了です。
◆iperfを用いたスループットの計測
LINC-Switchのパフォーマンスを測ってみました。
- iperf確認結果(MacBook Air側)
$ iperf -c 192.168.100.1 ------------------------------------------------------------ Client connecting to 192.168.100.1, TCP port 5001 TCP window size: 129 KByte (default) ------------------------------------------------------------ [ 4] local 192.168.101.1 port 62192 connected with 192.168.100.1 port 5001 [ ID] Interval Transfer Bandwidth [ 4] 0.0-10.0 sec 110 MBytes 92.0 Mbits/sec
- iperf確認結果(ThinkPad T61側)
$ iperf -c 192.168.101.1 ------------------------------------------------------------ Client connecting to 192.168.101.1, TCP port 5001 TCP window size: 23.5 KByte (default) ------------------------------------------------------------ [ 3] local 192.168.100.1 port 59915 connected with 192.168.101.1 port 5001 [ ID] Interval Transfer Bandwidth [ 3] 0.0-10.0 sec 110 MBytes 92.1 Mbits/sec
計測結果としては、前回のOpenvSwitchと、ほぼ同等のTCPスループットでした。
- ping確認結果(MacBook Air側)
$ ping 192.168.100.1 PING 192.168.100.1 (192.168.100.1): 56 data bytes 64 bytes from 192.168.100.1: icmp_seq=0 ttl=64 time=1.465 ms 64 bytes from 192.168.100.1: icmp_seq=1 ttl=64 time=1.792 ms 64 bytes from 192.168.100.1: icmp_seq=2 ttl=64 time=1.549 ms 64 bytes from 192.168.100.1: icmp_seq=3 ttl=64 time=1.577 ms 64 bytes from 192.168.100.1: icmp_seq=4 ttl=64 time=2.072 ms ^C --- 192.168.100.1 ping statistics --- 5 packets transmitted, 5 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 1.465/1.691/2.072/0.219 ms
◆実際、使ってみて ...
LINC-Switchを介して実際にインターネットにアクセスしてみました。
使い勝手としては、前回のOpenvSwitchよりも、Webブラウジングのレスポンス性が芳しくありませんでした。
Safariのブラウザからだと、通常の検索ポータルでのキーワード検索や、ustreamが利用できましたが、操作感はストレスを感じるものでした。
なお、firefoxのブラウザだと、軒並み以下のエラー画面が表示されてしまいました。
◆OpenvSwitchとのスピードテスト結果の比較
インターネット上のスピードテストを計測できるサイトを活用して、OpenvSwitchとLINC-Switchの回線速度を比較してみました。
使用したスピード計測サイトを以下となります。
BNR スピードテスト 回線速度/通信速度 測定
1. LINC-Switchの場合
昔のダイアルアップ接続の回線速度と同程度という結果でした。
やはり、LINC-Switchはユーザランドでパケット転送処理を実施しているため、回線速度の低下してしまうということでしょうか
◆終わりに
LINC-Switchを実際に使ってみて、ちょっと、実用性は低そうです。
ただ、OpenFlowコントローラの勉強用(デバック用)として活用する場合には、とても利用価値が高い製品だと思います。