OpenvSwitchとnamespaceで仮想ネットワークにVLANを構築する

■概要

今回はOpen vSwitchとnetwork namespaceの機能を使って一台のマシンの中に仮想的なVLANネットワークを構築します。
今回作る構成は下の図のような感じです。
OS : Ubuntu16.04

f:id:k-midorikawa:20161105140446j:plain


■参考

http://app.f.m-cocolog.jp/t/typecast/1766421/1776113/88010845


■Open vSwitchのインストール

Open vSwitchをインストールし、サービスを起動します。

$ sudo -i
# apt install openvswitch-switch
# systemctl start openvswitch-switch

■仮想VLANの構築

この章では、namespaceとOVSブリッジを用いて仮想的なVLANを構築し、同一VLANタグを持つインターフェース同士が通信できることを確認します。

OVSブリッジの作成

VLANインターフェースを持つovs1とovs2を作成します。

# ovs-vsctl add-br ovs1
# ovs-vsctl add-br ovs2

namespaceの作成

OVSブリッジに接続するnamespaceを作成します。

# ip netns add ns1
# ip netns add ns2
# ip netns add ns3
# ip netns add ns4

vethの作成

OVSブリッジとnamespaceを接続するveth(仮想的なLANケーブル)を作成します。
※指定されている2つの名前(ns1ovs1, ovs1ns1など)はLANケーブルの両端を表します。
※今回の命名規則は「接続元」+「接続先」となっています。

# ip link add name ns1ovs1 type veth peer name ovs1ns1
# ip link add name ns2ovs1 type veth peer name ovs1ns2
# ip link add name ns3ovs2 type veth peer name ovs2ns3
# ip link add name ns4ovs2 type veth peer name ovs2ns4

OVSブリッジ同士を接続するvethを作成します。

# ip link add name ovs1ovs2 type veth peer name ovs2ovs1

vethの接続

namespaceとOVSブリッジをvethで接続します。

namespaceにvethを接続

# ip link set ns1ovs1 netns ns1
# ip link set ns2ovs1 netns ns2
# ip link set ns3ovs2 netns ns3
# ip link set ns4ovs2 netns ns4

OVSブリッジにvethを接続
ns1,ns3を接続するポートにはVLANタグ10を、ns2,ns4を接続するポートにはVLANタグ20を割り当てます。

# ovs-vsctl add-port ovs1 ovs1ns1 tag=10
# ovs-vsctl add-port ovs1 ovs1ns2 tag=20
# ovs-vsctl add-port ovs2 ovs2ns3 tag=10
# ovs-vsctl add-port ovs2 ovs2ns4 tag=20

OVSブリッジ同士を接続

# ovs-vsctl add-port ovs1 ovs1ovs2
# ovs-vsctl add-port ovs2 ovs2ovs1

バイスをUP

OVSブリッジをUPします。

# ip link set ovs1 up
# ip link set ovs2 up

OVSブリッジ同士を接続しているvethをUPします。

# ip link set ovs1ovs2 up
# ip link set ovs2ovs1 up

OVSに接続したvethをUPします。

# ip link set ovs1ns1 up
# ip link set ovs1ns2 up
# ip link set ovs2ns3 up
# ip link set ovs2ns4 up

namespaceに接続したvethをUPします。

# ip netns exec ns1 ip link set ns1ovs1 up
# ip netns exec ns2 ip link set ns2ovs1 up
# ip netns exec ns3 ip link set ns3ovs2 up
# ip netns exec ns4 ip link set ns4ovs2 up

namespace内のループバックアドレスをUPします。

# ip netns exec ns1 ip link set lo up
# ip netns exec ns2 ip link set lo up 
# ip netns exec ns3 ip link set lo up
# ip netns exec ns4 ip link set lo up

IPアドレスの割当

namespaceに接続したvethにIPアドレスを割り当てます。

# ip netns exec ns1 ip addr add 192.168.122.10/24 dev ns1ovs1
# ip netns exec ns2 ip addr add 192.168.122.20/24 dev ns2ovs1
# ip netns exec ns3 ip addr add 192.168.122.30/24 dev ns3ovs2
# ip netns exec ns4 ip addr add 192.168.122.40/24 dev ns4ovs2

動作確認

同じVLANタグを持つインターフェース同士が通信できることを確認します。

tag=10を持つns1とns3の通信

# ip netns exec ns1 ping 192.168.122.30
# ip netns exec ns3 ping 192.168.122.10

tag=20を持つns2とns4の通信

# ip netns exec ns2 ping 192.168.122.40
# ip netns exec ns4 ping 192.168.122.20

異なるVLANタグを持つインターフェース同士が通信できないことを確認します。

ns1(tag=10)からns2,ns4(tag=20)への通信

# ip netns exec ns1 ping 192.168.122.20
# ip netns exec ns1 ping 192.168.122.40

ns2(tag=20)からns1,ns3(tag=10)への通信

# ip netns exec ns2 ping 192.168.122.10
# ip netns exec ns2 ping 192.168.122.30

■インターネットに接続

この章では、先ほど作ったnamespaceからインターネットにアクセスできるようにする設定を行います。

外部ネットワーク接続用ブリッジの作成

ホストのnic(ens3)に接続するためのブリッジを作成します。

# ip link add br-ex type bridge

ホストのnic(ens3)にbr-exを接続します。

# ip link set ens3 master br-ex

ホストのnic(ens3)に割り当てられているIPアドレスを削除します。

# ip addr del 192.168.122.6/24 dev ens3

OVSブリッジとbr-exの接続

OVSブリッジとbr-exを接続するためのvethを作成します。

# ip link add name tag10brex type veth peer name brextag10
# ip link add name tag20brex type veth peer name brextag20

OVSブリッジとbr-exを接続します。

# ip link set brextag10 master br-ex
# ip link set brextag20 master br-ex
# ovs-vsctl add-port ovs1 tag10brex tag=10
# ovs-vsctl add-port ovs1 tag20brex tag=20

バイスをUP

br-exをUPします。

# ip link set br-ex up

OVSブリッジに接続したvethをUPします。

# ip link set tag10brex up
# ip link set tag20brex up

br-exに接続したvethをUPします。

# ip link set brextag10 up
# ip link set brextag20 up

ルーティングの設定

namespace内にデフォルトゲートウェイ(192.168.122.1)を設定します。

# ip netns exec ns1 ip route add default via 192.168.122.1
# ip netns exec ns2 ip route add default via 192.168.122.1
# ip netns exec ns3 ip route add default via 192.168.122.1
# ip netns exec ns4 ip route add default via 192.168.122.1

インターネットに接続できるか確認

それぞれのnamespaceからインターネットに接続できるか確認してみます。

# ip netns exec ns1 curl -kIL www.google.com
# ip netns exec ns2 curl -kIL www.google.com
# ip netns exec ns3 curl -kIL www.google.com
# ip netns exec ns4 curl -kIL www.google.com

■後片付け

OVSブリッジを削除します。

# ovs-vsctl del-br ovs1
# ovs-vsctl del-br ovs2

ipコマンドで作った資材はリブートすると揮発します。

# reboot