🗂

Open vSwitchとVyosでネットワークのお勉強

2023/10/21に公開

久々にルータを触りたくなって、Open vSwitchとVyosを触ってみました。
簡単に以下の図のような構成を用意し、スタティックルートの設定あたりをやりつつ、昔の記憶を掘り起こしたいと思います。

Open vSwitchとは

IT mediaより
Open vSwitch(Open Virtual Switch、通称「OVS」)は、ソフトウェア定義型ネットワーク(SDN)を実現する仮想スイッチです。
複数の物理サーバやハイパーバイザ型の仮想マシン、コンテナ間のトラフィックを細かく制御でき、大規模な仮想化基盤およびクラウド基盤にも対応できるよう設計されています。
2009年のリリース以降、現在までコミュニティーによる開発が精力的に続けられ、Apache 2.0ライセンスのオープンソース・ソフトウェアとして無償利用できます。
移植性の高いC言語で記述され、Linux以外に、FreeBSDやNetBSDなどのBSD系のOSでも動作します。

採用範囲は、一般的なLinux OSやハイパーバイザ型の仮想化基盤ソフトウェア、オープンソースベースのクラウド基盤ソフトウェア上で稼働するソフトウェア・スイッチなど幅広く、特にOpenStackでは、テナント(OpenStackの世界では「プロジェクト」と呼ばれます)内の仮想マシン(インスタンス)が所属する仮想的なプライベート・ネットワーク上で通信を行うための仮想スイッチを実現するために利用されています。
通常のLinux OS上にインストールすれば、簡単に仮想スイッチを実現できます。

Vyosとは

VyOS(ヴィワイオーエス/ヴィーオス)とは、​オープンソースのネットワークオペレーティングシステムです。
主にソフトウェアルータとして利用されています。
VyOSは、「ルーティング機能」「ファイアウォール機能」「VPN機能」などを提供するプラットフォームで、多くの仮想マシンハイパーバイザで動作します。
VyOSは、ソフトウェアルータ「Vyatta(Core 6.6 R1)」のフォークプロダクトです。

今回作るネットワーク図

環境のお話

OCIの無料インスタンスを使っています。
無料インスタンスってメモリ1GBくらいですけど、それでも十分に動くのVyosってすごいね〜
OSはUbuntu20.04です。

Open vSwitchのインストール

sudo apt update -y
sudo apt install -y openvswitch-switch
Open vSwitchの起動確認
systemctl status ovs-vswitchd
● ovs-vswitchd.service - Open vSwitch Forwarding Unit
     Loaded: loaded (/lib/systemd/system/ovs-vswitchd.service; static; vendor preset: enabled)
     Active: active (running) since Fri 2023-10-20 23:19:45 UTC; 27s ago
   Main PID: 2089 (ovs-vswitchd)
      Tasks: 1 (limit: 1068)
     Memory: 2.7M
     CGroup: /system.slice/ovs-vswitchd.service
             └─2089 ovs-vswitchd unix:/var/run/openvswitch/db.sock -vconsole:emer -vsyslog:err -vfile:info --mlockall --no-chdir --log-file=/var/log/openvswitch/ovs-vswitchd.log --pidfile=/var/run/openvswitch/ovs-vswitchd.pid --d
etach

Oct 20 23:19:45 openvswitch systemd[1]: Starting Open vSwitch Forwarding Unit...
Oct 20 23:19:45 openvswitch ovs-ctl[2076]:  * Inserting openvswitch module
Oct 20 23:19:45 openvswitch ovs-ctl[2047]:  * Starting ovs-vswitchd
Oct 20 23:19:45 openvswitch ovs-ctl[2047]:  * Enabling remote OVSDB managers
Oct 20 23:19:45 openvswitch systemd[1]: Started Open vSwitch Forwarding Unit.
ubuntu@openvswitch:~$

Dockerのインストール

sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

router4台の構築

sudo docker run -d --name router1 --net=none --privileged -v /lib/modules:/lib/modules 2stacks/vyos:1.2.0-rc11 /sbin/init
sudo docker run -d --name router2 --net=none --privileged -v /lib/modules:/lib/modules 2stacks/vyos:1.2.0-rc11 /sbin/init
sudo docker run -d --name router3 --net=none --privileged -v /lib/modules:/lib/modules 2stacks/vyos:1.2.0-rc11 /sbin/init
sudo docker run -d --name router4 --net=none --privileged -v /lib/modules:/lib/modules 2stacks/vyos:1.2.0-rc11 /sbin/init

switch4台の構築

sudo ovs-vsctl add-br switch1
sudo ovs-vsctl add-br switch2
sudo ovs-vsctl add-br switch3
sudo ovs-vsctl add-br switch4

routerとswitchを接続

sudo ovs-docker add-port switch1 eth0 router1 --ipaddress=10.0.1.1/24
sudo ovs-docker add-port switch1 eth0 router2 --ipaddress=10.0.1.2/24
sudo ovs-docker add-port switch2 eth1 router1 --ipaddress=10.0.2.1/24
sudo ovs-docker add-port switch2 eth0 router3 --ipaddress=10.0.2.2/24
sudo ovs-docker add-port switch3 eth1 router2 --ipaddress=10.0.3.1/24
sudo ovs-docker add-port switch3 eth0 router4 --ipaddress=10.0.3.2/24
sudo ovs-docker add-port switch4 eth1 router3 --ipaddress=10.0.4.1/24
sudo ovs-docker add-port switch4 eth1 router4 --ipaddress=10.0.4.2/24

この段階でのPing疎通確認

router1 -> router2へのPing OK

sudo docker exec -it router1 ping -c 2 10.0.1.2
PING 10.0.1.2 (10.0.1.2) 56(84) bytes of data.
64 bytes from 10.0.1.2: icmp_req=1 ttl=64 time=0.540 ms
64 bytes from 10.0.1.2: icmp_req=2 ttl=64 time=0.057 ms

--- 10.0.1.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1025ms
rtt min/avg/max/mdev = 0.057/0.298/0.540/0.242 ms
ubuntu@openvswitch:~$

router1 -> router4へのPing NG

sudo docker exec -it router1 ping -c 2 10.0.3.2
connect: Network is unreachable
ubuntu@openvswitch:~$

router1の経路情報の確認

router1コンテナにアクセスし、現在のルーティング情報を確認してみます。
以下の通り、「C>*」のインタフェース同士が直接繋がっている経路しか見えていません。

sudo docker exec -it router1 /bin/vbash
vbash-4.1# su - minion
minion@067b651833a9# run show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
       F - PBR, f - OpenFabric,
       > - selected route, * - FIB route

K>* 0.0.0.0/0 [0/0] via 172.17.0.1, eth0, 00:13:57
C>* 10.0.1.0/24 is directly connected, eth0, 00:11:53
C>* 10.0.2.0/24 is directly connected, eth1, 00:11:53
C>* 172.17.0.0/16 is directly connected, eth0, 00:13:57

router1でスタティックルートの設定

minion@067b651833a9# set protocols static route 10.0.3.0/24 next-hop 10.0.1.2
[edit]
minion@067b651833a9#
経路の再確認
minion@067b651833a9# run show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
       F - PBR, f - OpenFabric,
       > - selected route, * - FIB route

K>* 0.0.0.0/0 [0/0] via 172.17.0.1, eth0, 00:13:57
C>* 10.0.1.0/24 is directly connected, eth0, 00:11:53
C>* 10.0.2.0/24 is directly connected, eth1, 00:11:53
S>* 10.0.3.0/24 [1/0] via 10.0.1.2, eth0, 00:03:10  ★追加されている(「S>*」はStaticのS)
C>* 172.17.0.0/16 is directly connected, eth0, 00:13:57
[edit]
minion@067b651833a9#

router1からrouter2のeth1へPingの確認を行います

疎通OK

ubuntu@openvswitch-136444:~$ sudo docker exec -it router1 ping -c 2 10.0.3.1
PING 10.0.3.1 (10.0.3.1) 56(84) bytes of data.
64 bytes from 10.0.3.1: icmp_seq=1 ttl=64 time=0.551 ms
64 bytes from 10.0.3.1: icmp_seq=2 ttl=64 time=0.074 ms

--- 10.0.3.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.074/0.312/0.551/0.239 ms
ubuntu@openvswitch-136444:~$

さらにrouter1からrouter4へPingの確認を行います

疎通NG

ubuntu@openvswitch-136444:~$ sudo docker exec -it router1 ping -c 2 10.0.3.2
PING 10.0.3.2 (10.0.3.2) 56(84) bytes of data.

--- 10.0.3.2 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1025ms

ubuntu@openvswitch-136444:~$

rotuer4の経路情報を確認してみる

以下の通り、router1への経路を持っていません。

ubuntu@openvswitch-136444:~$ sudo docker exec -it router4 /bin/vbash
vbash-4.1# su - minion
minion@791c2a33324a:~$ show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
       F - PBR, f - OpenFabric,
       > - selected route, * - FIB route

C>* 10.0.3.0/24 is directly connected, eth0, 00:05:03
C>* 10.0.4.0/24 is directly connected, eth1, 00:05:02
minion@791c2a33324a:~$

なので、router4でrouter1への経路を追加してあげます。

minion@791c2a33324a# set protocols static route 10.0.1.0/24 next-hop 10.0.3.1
[edit]
minion@791c2a33324a# commit
[edit]
minion@791c2a33324a# exit
Warning: configuration changes have not been saved.
exit
minion@791c2a33324a:~$ show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
       F - PBR, f - OpenFabric,
       > - selected route, * - FIB route

S>* 10.0.1.0/24 [1/0] via 10.0.3.1, eth0, 00:00:09  ★追加された経路
C>* 10.0.3.0/24 is directly connected, eth0, 00:08:35
C>* 10.0.4.0/24 is directly connected, eth1, 00:08:34
minion@791c2a33324a:~$

router1からrouter4へPingの確認を行います

疎通OK

ubuntu@openvswitch-136444:~$ sudo docker exec -it router1 ping -c 2 10.0.3.2
PING 10.0.3.2 (10.0.3.2) 56(84) bytes of data.
64 bytes from 10.0.3.2: icmp_seq=1 ttl=63 time=0.285 ms
64 bytes from 10.0.3.2: icmp_seq=2 ttl=63 time=0.088 ms

--- 10.0.3.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1020ms
rtt min/avg/max/mdev = 0.088/0.186/0.285/0.099 ms
ubuntu@openvswitch-136444:~$

まとめ

昔はCiscoの物理ルータとスイッチを家で動かしていましたが、最近はコンテナをルータ化して気軽にネットワークの勉強ができるようになっていい時代になりましたね。
今回は簡単なスタティックルートの動きを見ましたが、実際1個1個のルータにスタティックルートを追加していくのは非現実的で運用も大変なのでそんな時のためのダイナミックルーティングがあります。
次回はその辺りの設定もやりたいですね。

Discussion