OpenFlowとは、ソフトウエアによってネットワークの構成を行うための技術。 Software Definitions Network(SDN)の技術要素の1つである。 Open Network Foundationによって標準仕様の策定が行われている。
従来のネットワーク機器ではそれぞれの機器が個々に経路制御していたが、 OpenFlowでは経路制御機能を「OpenFlowコントローラ」として分離し、 OpenFlowの規格に準拠(OpenFlowプロトコルでコントローラと対話できる必要がある)した「OpenFlowスイッチ」群を一括管理することができる。
OpenFlowコントローラはソフトウエアで実装され、OpenFlowスイッチはハードウエア(ネットワーク機器)で実現されるが、 ソフトウエアで実装されたスイッチとして、Open vSwitchなどがある。
<参考>
- 5分で絶対に分かるOpenFlow - @IT
- ネットワーク管理を大きく変えるOpenFlowとは (1) - Teck-Sketch
- ネットワーク管理を大きく変えるOpenFlowとは (2) - Teck-Sketch
OSSの仮想スイッチ。XenServer,KVM, VirtualBoxなどの仮想化プラットフォームでも使用されている。 VM(ゲストOS)のネットワークを構成するために使用されるため、ハイパーバイザーの横に位置することが多いが、 Linux OS上で単体で稼動させることも可能。 また、最近ではOpenFlowに対応したハードウエア(ネットワーク機器)に搭載されていることもある。
Key-Valueストア(KVS)を構築することができるソフトウェアの一つ
- Redisの使い方 - 技術の犬小屋
- GRE ( Generic Routing Encapsulation ) とは
- VPN(GREトンネルとルーティングプロトコル 1) CCNP実機で学ぶ
- [NT]VPN トンネル - GRE プロトコル 47 パケットの説明と使い方
- OpenvSwitchにGREトンネルを設定 - 猫型エンジニアのブログ
EC2のインスタンスを選択し、[アクション]-[ネットワーキング]-[送信元/送信先の変更チェック]を選択する。
- EC2の「ネットワークインタフェース」から「ネットワークインタフェースの作成」をする
- 既に割りあたっているeth0 と同じサブネットを選択する
- セキュリティグループは作成済みの中から適切なものを選択
- 作成したeniの設定
- [アクション]-[ネットワーキング]-[送信元/送信先の変更チェック]を選択し、送信元/送信先チェックを無効にする
- 作成されたeniを選択し、「アタッチ」する
- アタッチ先のEC2インスタンスにSSHログイン
- eth1が追加されていることを確認
$ ifconfig -a
- eth1の設定を追加し、upする
$ cat > /etc/sysconfig/network-scripts/ifcfg-eth1 <<EOF
DEVICE=eth1
ONBOOT=yes
BOOTPROTO=dhcp
TYPE=Ethernet
DEFROUTE=no
EOF
ifup eth1
<<参考>>
- EC2に複数のENIをアタッチする手順と制約(Public-ip,DNSが割当てられなくなる) - Qiita
- AWS EC2 で Ping応答を得られるようにする設定
- VPC で Elastic Network Interface を使用する - Amazon.com
- PINGで疎通確認を行うため、ICMPを許可しておく。
- GRE プロトコルの47を許可しておく。
- カスタムプロトコル: 47 : すべて
- SSH : TCP : 22
- すべてのICMP : すべて : 該当なし
- vna
- vnmgr
- webapi
インストールガイドに従い、以下の順にコマンドを実行していく
$ curl -o /etc/yum.repos.d/openvnet.repo -R https://raw.githubusercontent.com/axsh/openvnet/master/deployment/yum_repositories/stable/openvnet.repo
$ curl -o /etc/yum.repos.d/openvnet-third-party.repo -R https://raw.githubusercontent.com/axsh/openvnet/master/deployment/yum_repositories/stable/openvnet-third-party.repo
$ yum install -y epel-release
$ yum install -y openvnet
inetary=($(ifconfig eth1 | grep 'inet addr'))
ipaddress=$(echo ${inetary[1]} | awk -F '[: ]' '{print $2}')
netmask=$(echo ${inetary[3]} | awk -F '[: ]' '{print $2}')
infoary=($(ifconfig eth1 | grep 'HWaddr'))
macaddress=${infoary[4]}
cat > /etc/sysconfig/network-scripts/ifcfg-eth1 <<EOF
DEVICE=eth1
DEVICETYPE=ovs
TYPE=OVSPort
OVS_BRIDGE=br0
BOOTPROTO=none
ONBOOT=yes
HOTPLUG=no
EOF
cat > /etc/sysconfig/network-scripts/ifcfg-br0 <<EOF
DEVICE=br0
DEVICETYPE=ovs
TYPE=OVSBridge
ONBOOT=yes
BOOTPROTO=static
IPADDR=${ipaddress}
NETMASK=${netmask}
HOTPLUG=no
OVS_EXTRA="
set bridge \${DEVICE} protocols=OpenFlow10,OpenFlow12,OpenFlow13 --
set bridge \${DEVICE} other_config:disable-in-band=true --
set bridge \${DEVICE} other-config:datapath-id=0000$(echo ${macaddress} | tr -d ':') --
set bridge \${DEVICE} other-config:hwaddr=${macaddress} --
set-fail-mode \${DEVICE} standalone --
set-controller \${DEVICE} tcp:127.0.0.1:6633
"
EOF
service openvswitch start
ifup br0 eth1
service network restart
sv1,sv2側のGRETapを作成するシェルスクリプト
#! /bin/sh
# Usage:
# create_gretap NAME REMOTE_ADDR LOCAL_ADDR VIRTUAL_ADDR
name=${1}
remote_addr=${2}
local_addr=${3}
virtual_addr=${4}
ip link add ${name} type gretap remote ${remote_addr} local ${local_addr}
ip addr add ${virtual_addr} dev ${name}
ip link set ${name} up
ip link set ${name} mtu 1450
ifconfig ${name}
sv1,sv2にログインして実行する。
sv0にログインし、OVS側のGREポートをovs-vsctl
コマンドを使用して作成する
$ ovs-vsctl add-port br0 ${name} -- \
set interface ${name} \
type=gre \
options:local=${local_addr} \
options:remote_ip=${remote_addr} \
options:pmtud=true
$ sed -i -E 's/bind [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/bind 0.0.0.0/g' /etc/redis.conf
$ service redis start
# Launch mysql server.
service mysqld start
# To automatically launch the mysql server at boot, execute the following command.
chkconfig mysqld on
# Set PATH environment variable as following since the OpenVNet uses its own ruby binary.
PATH=/opt/axsh/openvnet/ruby/bin:${PATH}
# Create database
cd /opt/axsh/openvnet/vnet
bundle exec rake db:create
bundle exec rake db:init
# Start vnmgr and webapi.
initctl start vnet-vnmgr
initctl start vnet-webapi
# Datapath
datapath_id=$(echo $(cat /etc/sysconfig/network-scripts/ifcfg-br0 | grep datapath-id= | awk -F '[:=-]' '{print $5}'))
name=${1}
node_id=${2}
network_addr=${3}
if [ "${name}" == "" ]; then
name="test1"
fi
if [ "${node_id}" == "" ]; then
node_id="vna"
fi
if [ "${network_addr}" == "" ]; then
network_addr="10.0.0.0"
fi
vnctl datapaths add --uuid dp-${name} --display-name ${name} --dpid ${datapath_id} --node-id ${node_id}
# Network
vnctl networks add --uuid nw-${name} --display-name ${name}-net --ipv4-network ${network_addr} --ipv4-prefix 24 --network-mode virtual
# Interface
#
vnctl interfaces add --uuid if-inst1 \
--mode vif --owner-datapath-uuid dp-${name} \
--mac-address EE:99:D5:67:FD:52 \
--network-uuid nw-${name} \
--ipv4-address 10.0.0.1 \
--port-name tap1
vnctl interfaces add --uuid if-inst2 \
--mode vif --owner-datapath-uuid dp-${name} \
--mac-address 2A:27:6E:63:5E:E5 \
--network-uuid nw-${name} \
--ipv4-address 10.0.0.2 \
--port-name tap2
initctl start vnet-vnmgr
initctl start vnet-webapi
initctl start vnet-vna
-
これだとeth1にきたGREのパケットがdropされてしまい、疎通が取れなくなる。
- => br0 にIPを振らない、eth1をつながない
- => eth1をGRE専用にする(いったん)
-
P2Vどうしよう・・・