仮想ネットワークを構築するためのスクリプト

# 0. はじめに
[Open vSwitch(OVS)](https://www.openvswitch.org/)や[ip-netns](https://man7.org/linux/man-pages/man8/ip-netns.8.html)は、ネットワークの構築方法を学ぶための便利な道具としても利用できます。これらを用いて仮想ネットワークを構築する際には、以下の2点がハマりやすい点になると思います。
- ルーティング設定時にgatewayを適切に設定すること
- [ip forwardを有効にすること](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/load_balancer_administration/s1-lvs-forwarding-vsa)（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. 参考文献
https://qiita.com/hana_shin/items/ab078b5552f5df029030

# 3. おまけ
### MACアドレステーブルを表示するコマンド
```
ovs-appctl fdb/show br0
```
### OpenFlowに関する情報を表示するコマンド
```
ovs-ofctl show br0
```