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

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

OpenFlow簡易ルータの実践活用(2) 〜LINC-Switch導入編〜

前回は、OpenvSwitch (2.0.0)で構築したOpenFlowスイッチとOpenFlow簡易ルータを、自宅ネットワークに導入してみました。
今回は、OpenFlowスイッチとして、LINC-Switchを採用して、前回と同様に自宅ネットワークに導入してみたいと思います。

◆導入形態

導入形態は、前回とまったく同様の構成になります。
OpenFlow簡易ルータの実践活用(1) 〜OpenvSwitch導入編〜 - SDN開発エンジニアを目指した活動ブログ

f:id:ttsubo:20140308074413j:plain

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のパフォーマンスを測ってみました。

f:id:ttsubo:20140302154957j:plain

$ 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 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

MacBookThinkPad間でのRTTは、概ね、1.5ms程度でした。

◆実際、使ってみて ...

LINC-Switchを介して実際にインターネットにアクセスしてみました。
使い勝手としては、前回のOpenvSwitchよりも、Webブラウジングのレスポンス性が芳しくありませんでした。
Safariのブラウザからだと、通常の検索ポータルでのキーワード検索や、ustreamが利用できましたが、操作感はストレスを感じるものでした。
なお、firefoxのブラウザだと、軒並み以下のエラー画面が表示されてしまいました。
f:id:ttsubo:20140308004200j:plain

◆OpenvSwitchとのスピードテスト結果の比較

インターネット上のスピードテストを計測できるサイトを活用して、OpenvSwitchとLINC-Switchの回線速度を比較してみました。
使用したスピード計測サイトを以下となります。
BNR スピードテスト 回線速度/通信速度 測定

1. LINC-Switchの場合

昔のダイアルアップ接続の回線速度と同程度という結果でした。
やはり、LINC-Switchはユーザランドでパケット転送処理を実施しているため、回線速度の低下してしまうということでしょうか
f:id:ttsubo:20140308004215j:plain

2. OpenvSwitchの場合

前回のWebブラウジングでの操作感と同様に、想定どおりの回線速度が確認できました。
OpenvSwitchはカーネルモジュールでパケット転送処理を実施しているため、スループット劣化していないようです。
f:id:ttsubo:20140308004228j:plain

◆終わりに

LINC-Switchを実際に使ってみて、ちょっと、実用性は低そうです。
ただ、OpenFlowコントローラの勉強用(デバック用)として活用する場合には、とても利用価値が高い製品だと思います。