OpenvSwitchとnamespaceで仮想ネットワークにVLANを構築する
■概要
今回はOpen vSwitchとnetwork namespaceの機能を使って一台のマシンの中に仮想的なVLANネットワークを構築します。
今回作る構成は下の図のような感じです。
OS : Ubuntu16.04
■参考
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