0. はじめに
Open vSwitch(OVS)やip-netnsは、ネットワークの構築方法を学ぶための便利な道具としても利用できます。これらを用いて仮想ネットワークを構築する際には、以下の2点がハマりやすい点になると思います。
- ルーティング設定時にgatewayを適切に設定すること
- ip forwardを有効にすること(Linuxのデフォルト設定は無効)
本記事では、読者がネットワークの構築方法を学ぶ際の参考情報として、下記のネットワークを構築するためのスクリプトを共有します。
----------------------- ----------------------- ----------------------- -----------------------
| h00 | | h01 | | h10 | | h11 |
| | | | | | | |
| | | | | | | |
| 192.168.10.102/24 | | 192.168.10.103/24 | | 192.168.20.102/24 | | 192.168.20.103/24 |
----------------------- ----------------------- ----------------------- -----------------------
| vport_h00 | vport_h01 | vport_h10 | vport_h11
| | | |
| vport_br00 | vport_br01 | vport_br10 | vport_br11
---------------------------------------------- ----------------------------------------------
| br0 | | br1 |
---------------------------------------------- ----------------------------------------------
| vport_br02 | vport_br12
| |
| vport_n00 | vport_n10
--------------------- ----------------------
| 192.168.10.101/24 | | 192.168.20.101/24 |
| | | |
| n0 | | n1 |
| | | |
| 192.168.30.1/24 | | 192.168.30.2/24 |
--------------------- ----------------------
| vport_n01 | vport_n11
| |
| vport_br20 | vport_br21
---------------------------------------------------------------------------------
| br2 |
---------------------------------------------------------------------------------
前提条件:OSやソフトウェアのバージョン
Ubuntu 20.04
Open vSwitch 2.13.5
1. スクリプト一覧
1.1 ネットワーク構築用スクリプト
下記のスクリプトを順番に実行することで、ネットワークを構築できます。
尚、ルーティング設定用のスクリプトとip forwardを有効化するスクリプトは、4_iproute.shと5_ipfoward.shに対応します。
0_net.sh
ip netns add h00
ip netns add h01
ip netns add h10
ip netns add h11
ip netns add n0
ip netns add n1
ip l add vport_h00 type veth peer name vport_br00
ip l add vport_h01 type veth peer name vport_br01
ip l add vport_h10 type veth peer name vport_br10
ip l add vport_h11 type veth peer name vport_br11
ip l add vport_n00 type veth peer name vport_br02
ip l add vport_n01 type veth peer name vport_br20
ip l add vport_n10 type veth peer name vport_br12
ip l add vport_n11 type veth peer name vport_br21
ip l set up vport_h00
ip l set up vport_h01
ip l set up vport_h10
ip l set up vport_h11
ip l set up vport_n00
ip l set up vport_n01
ip l set up vport_n10
ip l set up vport_n11
ip l set up vport_br00
ip l set up vport_br01
ip l set up vport_br02
ip l set up vport_br10
ip l set up vport_br11
ip l set up vport_br12
ip l set up vport_br20
ip l set up vport_br21
ip l set vport_h00 netns h00
ip l set vport_h01 netns h01
ip l set vport_h10 netns h10
ip l set vport_h11 netns h11
ip l set vport_n00 netns n0
ip l set vport_n01 netns n0
ip l set vport_n10 netns n1
ip l set vport_n11 netns n1
1_ovs-br.sh
ovs-vsctl add-br br0
ovs-vsctl add-br br1
ovs-vsctl add-br br2
ovs-vsctl add-port br0 vport_br00
ovs-vsctl add-port br0 vport_br01
ovs-vsctl add-port br0 vport_br02
ovs-vsctl add-port br1 vport_br10
ovs-vsctl add-port br1 vport_br11
ovs-vsctl add-port br1 vport_br12
ovs-vsctl add-port br2 vport_br20
ovs-vsctl add-port br2 vport_br21
2_ipaddr.sh
ip netns exec h00 ip a add 192.168.10.102/24 dev vport_h00
ip netns exec h01 ip a add 192.168.10.103/24 dev vport_h01
ip netns exec h10 ip a add 192.168.20.102/24 dev vport_h10
ip netns exec h11 ip a add 192.168.20.103/24 dev vport_h11
ip netns exec n0 ip a add 192.168.10.101/24 dev vport_n00
ip netns exec n0 ip a add 192.168.30.1/24 dev vport_n01
ip netns exec n1 ip a add 192.168.20.101/24 dev vport_n10
ip netns exec n1 ip a add 192.168.30.2/24 dev vport_n11
3_linkup.sh
ip netns exec h00 ip l set up vport_h00
ip netns exec h01 ip l set up vport_h01
ip netns exec h10 ip l set up vport_h10
ip netns exec h11 ip l set up vport_h11
ip netns exec n0 ip l set up vport_n00
ip netns exec n0 ip l set up vport_n01
ip netns exec n1 ip l set up vport_n10
ip netns exec n1 ip l set up vport_n11
4_iproute.sh
ip netns exec h00 ip r add default via 192.168.10.101 dev vport_h00
ip netns exec h01 ip r add default via 192.168.10.101 dev vport_h01
ip netns exec n0 ip r add 192.168.20.0/24 via 192.168.30.2 dev vport_n01
ip netns exec h10 ip r add default via 192.168.20.101 dev vport_h10
ip netns exec h11 ip r add default via 192.168.20.101 dev vport_h11
ip netns exec n1 ip r add 192.168.10.0/24 via 192.168.30.1 dev vport_n11
5_ipfoward.sh
ip netns exec n0 sysctl -w net.ipv4.ip_forward=1
ip netns exec n1 sysctl -w net.ipv4.ip_forward=1
ip netns exec n0 sysctl -p
ip netns exec n1 sysctl -p
1.2 ネットワーク検証用スクリプト
pingを用いた疎通確認用のスクリプトです。
6_ping_test0.sh
ip netns exec h00 ping 192.168.10.103 -c 2
ip netns exec h00 ping 192.168.10.101 -c 2
ip netns exec h00 ping 192.168.30.1 -c 2
ip netns exec n0 ping 192.168.10.103 -c 2
ip netns exec h10 ping 192.168.20.103 -c 2
ip netns exec h10 ping 192.168.20.101 -c 2
ip netns exec h10 ping 192.168.30.2 -c 2
ip netns exec n1 ping 192.168.20.103 -c 2
7_ping_test1.sh
ip netns exec n0 ping 192.168.30.2 -c 2
ip netns exec n0 ping 192.168.20.101 -c 2
ip netns exec h00 ping 192.168.30.2 -c 2
ip netns exec h00 ping 192.168.20.101 -c 2
ip netns exec h00 ping 192.168.20.102 -c 2
ip netns exec h00 ping 192.168.20.103 -c 2
1.3 ネットワーク削除用スクリプト
構築したネットワークを削除するためのスクリプトです。
8_del_net.sh
ip netns del h00
ip netns del h01
ip netns del h10
ip netns del h11
ip netns del n0
ip netns del n1
ovs-vsctl del-br br0
ovs-vsctl del-br br1
ovs-vsctl del-br br2
2. 参考文献
3. おまけ
MACアドレステーブルを表示するコマンド
ovs-appctl fdb/show br0
OpenFlowに関する情報を表示するコマンド
ovs-ofctl show br0