OpenFlowを用いたネットワーク構築

SDN - OpenFlow
n 
OpenFlowで経路切替
n 
n 
n 
OpenFlowでスイッチングハブを作ってみる
接続されていないホスト同士を接続させる
Client1 と Client2 の疎通を確認してみる
これ
Client1 Client2 Client3 n 
もし時間が余ったら他の環境にいるVMともつないでみる
n 
時間が余った方は教えてください。
Okinawa Open Laboratory
1
今回利用するフローの解説
スイッチングハブはポート1から入ったパケットをポート2に
ポート2から入ったパケットはポート1に流すように設定されます。
ポート1から入ったパケットはポート2へ
# ovs-ofctl add-flow ‘br0’ priority= 101 in_port=1, actions=output:2
1
Internal1-host
2
3
Internal2-host
ポート2から入ったパケットはポート1へ
# ovs-ofctl add-flow ‘br0’ priority= 101 in_port=2, actions=output:1
Okinawa Open Laboratory
2
ip netns とは
Linux Network Namespace を使うと 1 つの Linux ホストの中に仮想的なネットワー
ク環境を複数作ることができます。
OpenStackでは内部で作成されるコンポーネントとしてNamespace(ns)が利用されま
す。ここではルータとDHCPエージェント
OpenvSwitch
LinuxBridge
br-ex
Network NameSpace
qrouter-xxx
qdhcp-xxx
br-int
インスタンス
Okinawa Open Laboratory
3
promiscとは
プロミスキャスモードとは,ネットワークカード(NIC)の動作モードの一つで,同一
ネットワーク内を流れるすべてのパケットを受信して読み込むモードのこと
仮想マシン
×
プロミスキャスモードON
物理マシン
プロミスキャスモードOFF
プロミスキャスモードONにすることによって
仮想マシンは物理インターフェースを通って外に出ることができる
Okinawa Open Laboratory
4
仮想ネットワーク作成
ファイアーウォールを無効に変更
“firewall_driver =“
の部分を記載通りに書き換える
vi /etc/neutron/plugins/ml2/ml2_conf.ini
[securitygroup]
#firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver # コメントアウト
firewall_driver = neutron.agent.firewall.NoopFirewallDriver
# 追記
サービスの再起動
# service openvswitch-switch restart
# service neutron-server restart
# service neutron-plugin-openvswitch-agent restart
# service neutron-dhcp-agent restart
# service neutron-metadata-agent restart
# service nova-compute restart
ネットワークを追加で2つ作成(OpenStack構築編で作成したインスタンス、ネットワークも利用します。)
# source ~/openstack-deploy/tools/credentials tenant --tenant handson # handsonテナントに切り替える
# neutron net-create internal2
# neutron subnet-create internal2 --name internal2-subnet 192.168.10.0/24 --no-gateway \
--allocation_pool start=192.168.10.50,end=192.168.10.100
#inetnal1と同一セグメントにする
# neutron net-create internal3
# neutron subnet-create internal3 --name internal3-subnet 192.168.100.0/24
Okinawa Open Laboratory
5
ブラウザからHorizonにログインをして確認
アドレスhttp://外部アクセス用IP/horizon
作成したネットワークの確認
左側メニューから
プロジェクト -> ネットワークトポロジー
internal2, internal3が
作成されたことが確認できます。 Okinawa Open Laboratory
6
今からやること
スイッチングハブを作成し、
別々に作成されたinternal1, internal2にいるホスト同士を接続させます。
※Internal3はスイッチングハブ
での作業のために使用います。
internal3
スイッチングハブ用の
インスタンスを作成
internal1
internal2
Internal2のネットワークおよび
そこに接続されるホストinternal2-hostを作成
internal1-host
Okinawa Open Laboratory
internal2-host
7
仮想マシンの起動
作成したネットワークを確認
# neutron net-list
インスタンス起動時に
ネットワークIDを利用します
#サンプル
internal2-hostおよびスイッチングハブ用のインスタンスを起動
# nova boot --flavor m1.tiny --image cirros-0.3.4-x86_64 --nic net-id=internal2のネットワークID \
--security-group default internal-host2
# glance image-create --name "handson-ovs" --disk-format qcow2 --container-format bare \
--is-public True --progress < ~/handson-ovs.qcow2
#スイッチングハブ用インスタンスのために利用するVMイメージを登録
# nova boot --flavor 2 --image handson-ovs --nic net-id=internal1のネットワークID --nic \
net-id=internal2のネットワークID --nic net-id=internal3のネットワークID --security-group default handson-ovs
# nova list (サーバの起動を確認します。)
ここで起動するインスタンスが
スイッチングハブの役割
Okinawa Open Laboratory
8
仮想マシンの起動確認(1)
CLIからサーバの起動確認
# nova list
#コマンドからサーバの起動を確認します。
#サンプル
StatusがACTIVE、Power StateがRunning
となっていることを確認
各サーバのIPアドレス
1. internal1-host: 192.168.10.___
2. internal2-host: 192.168.10.___
3. handson-ovs: 192.168.10.___, 192.168.10.___, 192.168.100.____
Okinawa Open Laboratory
9
仮想マシンの起動確認(2)
Horizonから確認
左側メニューから
・ネットワークの状態確認
プロジェクト -> ネットワーク
#作成したネットワークの確認
すべてアクティブになっている
Okinawa Open Laboratory
10
仮想マシンの起動確認(3)
Horizonから確認
左側メニューから
・インスタンスの状態確認をします。
プロジェクト -> インスタンス
#作成したホストの確認
Okinawa Open Laboratory
すべて稼働中/実行中になっている
11
仮想マシンの起動確認(4)
Horizonから確認
インスタンス名をクリックし、ホスト起動後の状況を確認
Okinawa Open Laboratory
12
仮想マシンの起動確認(5)
Horizonから確認
インスタンスの詳細
・インスタンスの状態確認をします。
「ログ」タブを選択
##ホストが起動するとログインプロンプトが表示されます。
ログインプロンプトが表示されていればOK
Okinawa Open Laboratory
13
Network NameSpaceの確認
今回OpenStack上で起動させたサーバは外部アクセスすることができません。
そのため、各サーバにログインするためにはNameSpaceを利用する必要があります。
ホスト内に作成されたNameSpaceは以下のコマンドで確認し、各NameSpaceからサーバへのアクセスを行います。
# ip netns list
##サンプル
DHCPエージェント用のNameSpaceの名前は以下の決まりがあります。
NameSpace名: dhcp-xxxxxx-xxxxxx-xxxx-xxxx-xxxxxxxxxxx
OpenStack上で作成された仮想ネットワークID
# neutron net-list
##サンプル
internal1-netへのアクセスには
“qdhcp-28a0c429-48b1-43e1-9ab1-4c6564b42a7a”
を使うことになります。
Okinawa Open Laboratory
14
仮想マシン間の接続
Internal-host1にログイン
# ip netns list
##qdhcp NameSpaceを確認
# ip netns exec internal1側のNameSpace ifconfig
# ip netns exec internal1側のNameSpace ping internal-host1のIP
# ip netns exec internal1側のNameSpace ssh internal-host1のIP -l cirros
PASSWORD:
Hostname:cirros/password:cubswin:)
Internal-host1からinternal-host2に疎通確認
$ ping internal2-hostのIP
internal1-hostとinternal2-hostは
疎通がとれません。
internal1
internal1-host
Okinawa Open Laboratory
×
internal2
internal2-host
15
仮想スイッチングハブの作成
handson-ovsにログイン後、ブリッジの追加およびインターフェースをブリッジに追加
handson-ovsにログインします。
password:handson
# ip netns list
# ip netns exec internal3側のNameSpace ssh handson-ovsのinternal3側のipアドレス -l handson
##ここからはhandson-ovsの操作になります。
$ sudo -i
# ifconfig
# ovs-vsctl add-br br0
##ブリッジの作成
# ovs-vsctl add-port br0 internal1側のインターフェース ##ブリッジにinternl1用のインターフェースを追加
# ovs-vsctl add-port br0 internal2側のインターフェース ##ブリッジにinternl2用のインターフェースを追加
# ovs-ofctl show br0
##ブリッジに接続されているインターフェースの確認
##サンプル
ここではeth1,eth2が
追加された
# ip link set up promisc on internal1側のインターフェース
# ip link set up promisc on internal2側のインターフェース
# ovs-ofctl del-flows br0
Okinawa Open Laboratory
Check!!
# ovs-ofctl dump-flows br0
↑初期フローを確認してみる
##フローの削除
仮想スイッチングハブの作成
Intenal1-hostとinternal2-hostが接続するためのフロー投入
# ovs-ofctl dump-flows br0
##フローが登録されていないことを確認
In_portとoutputには
# ovs-ofctl add-flow 'br0' priority=101,in_port=1,actions=output:2
“ovsofctl show br0”で確認した
##ポート1に入ってきたパケットはすべてポート2に流す
eth0,eth1のポート番号が入ります。
# ovs-ofctl add-flow 'br0' priority=101,in_port=2,actions=output:1
例:1(eth0)と記載された場合は「1」の箇所
##ポート2に入ってきたパケットはすべてポート1に流す
# ovs-ofctl dump-flows br0
##上記2コマンドで投入したフローが登録されていることを確認
##サンプル
# exit
$ exit
Okinawa Open Laboratory
sshでログインしたhandson-ovsから
から抜けます
仮想マシン間の接続を再確認
Internal-host1にログイン
# ip netns list
##qdhcp NameSpaceを確認
# ip netns exec internal1側のNameSpace ifconfig
# ip netns exec internal1側のNameSpace ping internal1-hostのIP
# ip netns exec internal1側のNameSpace ssh internal1-hostのIP -l cirros
PASSWORD: cubswin:)
Hostname:cirros/password:cubswin:)
Internal-host1からinternal-host2に疎通確認
(フローを登録したことにより疎通が確認できます。)
$ ping internal2-hostのIP
スイッチングハブにフローを指定することにより
internal1-hostとinternal2-hostが
疎通とれるようになりました!
internal1
internal1-host
Okinawa Open Laboratory
internal2
internal2-host
18
お疲れさまでした ;p
Openflow編完了です。
Okinawa Open Laboratory
19