一台のLinuxホスト上で、VLAN単位で、openvswitchベースのVLANと、Linux標準のVLANの二つを使い分ける方法について記載します。
自分の勉強用環境のために作ったものです。
環境(使用したソフトウェア)
- CentOS: 7.3
- openvswitch: 2.6.1
やりたいこと
- 物理ポートが1つしかないサーバで、openswitchを使って、複数のVLANをKVMの通信に利用したい
- VLANタグなしの通信 ⇒ 仮想マシンホスト自体の管理接続用
- VLANタグ(ID=100)の通信 ⇒ NASとの接続用
- VLANタグ(ID=1000, 1001)の通信 ⇒ 仮想マシン(KVM Guest)が利用。ホストはその通信はスルーするだけ
- 仮想マシンのネットワーク管理に、openvswitchを使用
- 管理接続用とNASとの接続用の通信については、openvswitchでは制御しない
イメージは、次のような感じです。
ホストのNICは「ens1」、openvswitchで作成する仮想スイッチは「ovsbr0」という名前にしています。
ovsbr0は、シンプルな仮想L2SWです。VMWare ESXi(無償版)でいうところの「仮想スイッチ」に該当するかと思います。
メリット
openvswtichを使用したい通信とopenvswitchが動かない場合でも使いたい通信を分離したため、(セキュリティではなく、オペレーションの面で)安全性が高い。
デメリット
openvswitchに通したいVLANを増やす度、eno1.Xというサブインタフェースを作らなければなりません。そのため、大量のVLANを使うような環境には向いていません。仮に物理インタフェース自体をopenvswitchに紐づけた場合、タグ付きVLANを一括でopenvswitchの仮想スイッチで捌くことが可能です。そのほうが便利で、また一般的かと思われます。
参考にしたサイト
- https://github.com/openvswitch/ovs/blob/master/rhel/README.RHEL.rst
- http://openvswitch.org/support/dist-docs/ovs-vsctl.8.html
設定
まずeno1(タグなし)インターフェスの設定。
openvswitchに接続せず、タグVLANも使用しない、標準的な設定です。
# cat /etc/sysconfig/network-scripts/ifcfg-eno1
DEVICE=eno1
TYPE=Ethernet
BOOTPROTO=static
IPV6INIT=no
ONBOOT=yes
HWADDR=XX:XX:XX:XX:XX:XX
IPADDR=192.168.0.1
NETMASK=255.255.255.0
GATEWAY=192.168.0.xxx
IPV6INIT=no
つぎに、タグVLAN(VLANID=100)を受けるサブインタフェースの設定。
このインタフェースは、openvswitchには繋ぎません。
# cat /etc/sysconfig/network-scripts/ifcfg-eno1.100
DEVICE=eno1.100
VLAN=yes
ONBOOT=yes
IPADDR=192.168.100.1
NETMASK=255.255.255.0
IPV6INIT=no
openvswitchについては、まず仮想スイッチ自体を作成します。
# cat /etc/sysconfig/network-scripts/ifcfg-ovsbr0
DEVICE=ovsbr0
NAME=ovsbr0
DEVICETYPE=ovs
TYPE=OVSBridge
BOOTPROTO=none
ONBOOT=yes
IPV6INIT=no
仮想スイッチに、接続するサブインタフェースを、VLANごとに作成します。
以下はVLANID=1000のサブインタフェースの例ですが、DEVICEで「インタフェース名.VLANID」を指定し、OVS_OPTIONSに、ポートのVLAN IDを指定する以外、他のVLANでも同様です。
# cat /etc/sysconfig/network-scripts/ifcfg-eno1.1000
DEVICE=eno1.1000
VLAN=yes
DEVICETYPE=ovs
TYPE=OVSPort
ONBOOT=yes
OVS_BRIDGE=ovsbr0
OVS_OPTIONS="tag=1000"
IPV6INIT=no
ホスト内部とホスト外部のVLAN IDについて
この部分の厳密な内容については未確認です。
今回のような設定の場合、サブインタフェース「eno1.XXXX」は、openvswitchから見た場合、アクセスポート的な扱い(eno1と同じ)となっています。これは、VLANタグを外すのは、Linux kernelの(openvswitchではない)ネットワーク機能となるため、openvswitch(ovsbr0)へは、VLANタグのつかない形のパケットが転送されていると考えられます。
試しに設定ファイル内の「tag=1000」を「tag=10」に変更し、仮想マシンをopenvswitch内のvlan10に接続した場合も、外部のvlan1000と通信が出来ました。
今回の環境を構築する上では、VLANIDをホスト外とホスト内で異なるものにする必要はありませんが、この構成の仕組みとしては、VLANIDが内外で一致する必要はありません。
以上です。