OpenWRTとGNS3で簡単ネットワークシミュレータ②

前回、GNS3環境が作成できたので、OpenWRT使ったネットワークシミュレータ活用編です。

https://qiita.com/nsan/items/88b00c54f70bf90c63a4
# OpenWRT編
OpenWRTはWiFi アクセスポイント用に作成されたLinuxベースのルータソフトです。 他のソフトと比べるととても小さいですが、Linuxらしくパッケージを追加して機能を拡張できます。 ①で使用したOpenWRTはOSPF使用するためにFRRoutingを追加していますが、ディスク容量は20Mバイト弱です。 Linuxベースルータで有名なVyOS は全部入りの構成とは言え、427MB あります。 起動直後のメモリー使用量もVyOS の250MBに対して、OpenWRT は50MB ととても少ないです。

OpenWRTは実際の機器を使用する場合にとても安上がりになります。 エレコム WRC-1167GST2 はファームウェアの入替が必要ですが、メルカリなどで中古機器を1500円で入手可能です。 USBが無いのが欠点ですが、1Gポートが５つありメモリ256MB、フラッシュディスク32MB です。
私がアマゾンで新品を購入したのは、GL.iNet MT2500 です。 WiFiが無く1Gポートも２個ですが、メモリ１GB、フラッシュディスク8GB でUSB3.0 が使えます。 USB3.0にSSDタイプのUSBメモリを接続してLinuxサーバとして使うのに遜色ない性能でした。 GL.iNet社の各製品はOpenWRTベースで簡易なWeb-UIも付いていますが、OpenWRTが全て入っていてファームウェアの入替無しでOpenWRTを使う事ができるので、技適の懸念なくWiFi利用もできそうです。
## openwrt-23-05-2-frr.qcow2
OVAに含まれるopenwrt-23-05-2-frr.qcow2 は公式で配布されているイメージファイルをQCOW2フォーマットに変更して以下のパッケージ追加と設定変更をしています。
```
opkg update
opkg install wget-ssl
opkg install frr-zebra frr-watchfrr frr-staticd frr-vtysh frr-ospfd frr-ripd
opkg install luci-app-keepalived luci-app-tinyproxy

uci set network.lan.ipaddr='192.168.56.88'
uci commit
reboot
```
## 作成するネットワークの要件
拠点A B と本店C の３拠点のネットワークで、A B C はWAN側は同一セグメントですが、A-C 間とB-C 間のルーティングのみ配布して、A-B 間の通信は禁止する事にします。
回線部分は一本ですが、C拠点はルータ２台でLAN側VRRP(KeepAlived) とWAN側RIPv2 で冗長構成とします。

### IPアドレス
|       |LAN(Ethernet0)   | WAN(Ethernet1) |
| --- | --- | --- |
| A (WR1) | 192.168.1.2      | 192.168.10.1  |
|B (WR2) |192.168.2.2      |192.168.10.2  |
|C1(WR3) |192.168.56.11    |192.168.10.11 |
|C2(WR4) |192.168.56.12    |192.168.10.12 |
|C-VIP   |192.168.56.10
|Linux1  |192.168.1.1
|Linux2  |192.168.2.1
|Linux3  |192.168.56.20

## GNS3でネットワーク作成
新規プロジェクトでネットワークを作成します。 File - Open project でNew project タブでName: に 「OpenWRT-RIP2」と付けました。
![GNS3-project-name.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412785/9ee36a41-2bfe-58c9-54b2-bd6fb3585b97.png)
空白のプロジェクトが表示されるので、左のBrowse all devices」アイコンでデバイスを開いて、OpenWRT を右にドラッグすると各デバイスを配置できます。 
![GNS3-all-devices.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412785/48420547-ab37-19b9-e777-ac9068871f91.png)
今回使う、OpenWRTを４つ、検証用のLinuxを３つと「Ethernet switch」を２つと 192_168_56 のデバイスを配置してしまいます。
デバイス名は、配置した順に1..2 と振られます。 左側 WR3 WR4 Switch2 Linux3 が本店Ｃ で、右上が拠点Ａ、右下が拠点Ｂ になります。
![GNS3-haichi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412785/bfd62930-e2f1-a65b-82eb-e097852890f1.png)
左上のネットワークアイコン「１」はホストのWindowsも接続しているネットワークです。 右クリックして「Configure」メニューのMiscタブでName: 192.168.56 に変更しておきます。
左下の「Add a link」アイコンをクリックすると×マークが出て、結線モードになります。  192.168.56をクリックすると「br0」が表示されるのでクリック、Switch2も同様にEthernet0～8が表示されるので、Ethernet0をクリックして結線します。 同様にWR3 のEthernet0 とSwtich2のEthernet1 を結線します。

## OpenWRT Start
左下の「Add a link」アイコンをクリックして結線モードを解除して、WR3 を右クリックして「Start」します。 ここでConsoleは使いませんが、起動状況を確認するために、「Console」を選択して表示してください。
![GNS3-WR3-start.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412785/a888d9be-9116-48e2-2655-f9abd690751f.png)
10秒ほどで起動します。 Consoleで「Enter」キー押下でrootでログイン状態になると思います。 初期IPがLAN側 192.168.56.88 になっているので、Windowsからブラウザで <foo>http</foo>://192.168.56.88 にアクセスするとOpenWRT のWeb-UI がアクセスできます。 Web-UIからIPアドレスとFirewallの設定を変更します。
IPアドレスはそれぞれ先ほど決めたアドレスに変更します。 br-lan(Ethernet0)の「DHCP Server」タブで、「Ignore interface」をチェックしてDHCPをオフにする事を忘れないようにしてください。
![GNS3-luci-interfaces.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412785/308e05a2-5814-b9fd-2495-2c121a0c9e7b.png)
OpenWRTの初期設定で WAN側でNATするFirewall設定が入っているので、これを削除します。NetworkメニューのFirewall画面 General Settingsで、InputとForwardをacceptに変更します。 また、Zones設定を右側の「Delete」で削除します。 「Save & Apply」でOKです。
![GNS3-luci-firewall.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412785/697d9eb0-b8d9-f814-ae57-e76cf9292d2f.png)
WR3 も同様に設定します。 WR1 WR2 はIPアドレスが192.168.56.xx でないので同様に設定できませんが、一旦Switch2にEthernet0を接続して設定変更後に配線を変更するのが簡単と思います。 LANのIPアドレス変更を最後に行うようにご注意ください。
LANのIPアドレス変更がWeb-UIからは出来ないようです。 その場合は、Consoleのコマンドで変更してください。
```
root@OpenWrt:/# uci set network.lan.ipaddr='192.168.1.2'
root@OpenWrt:/# uci commit
root@OpenWrt:/# reboot
```
## Linux
テスト用のLinux端末で、Alpine Linux のDockerをベースに各種ツールが入っています。 /home/gns3/alpine-term にDockerfileがあります。 IPアドレスの設定を右クリック「Configure」メニューでNetwork configuration の「Edit」をクリックしてテキストファイルを編集してください。 例が有るのでauto eth0 からgateway まで５行のコメントを外して、address 192.168.56.20 gateway 192.168.56.10 として、「Save」してください。 
それぞれIPアドレスを入力して、結線をすると隣接ノード間でPingが通るようになる事を確認できると思います。
![GNS3-linux3-net.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412785/54ff265b-b93f-55b9-6fc9-120cdfab2956.png)
## VRRP
本店Ｃのルータ冗長構成のためにKeepalivedを使って仮想IP 192.168.56.10 をVRRP 設定します。 OpenWRTでWeb-UIで設定できます。 ServiceメニューのKeepalived 「IP Address」タブでVIP 192.168.56.10 と「Interfaces]タブでeth1 を設定します。 
![GNS3-keepalive-ip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412785/0501be6e-2645-607a-e566-a7d24d154359.png)
「Instance」タブで必須のVirtual Router IDやPriority など設定、「Tarcking」タブで「Interfaces]で設定したWANを指定
![GNS3-keepalive-instance.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412785/40b05fbc-5262-dc51-20c9-6535d91fe720.png)
![GNS3-keepalive-tacking.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412785/e314ff74-64c8-b1cc-e783-f8f0f02a9454.png)
WR4側も同様の設定ですが、StateをBackup でPriority 100 にする事でBackup状態にします。 Virtual Router IDは VIPのIDなので、WR3 WR4 とも10 です。
Overviewタブで、それぞれ現在の状態が確認できます。 Ethernet1をSuspendにするなどしてダウン状態にすると、172.16.56.10のMACアドレスがWR3とWR4の間で変更されるので確認できると思います。
## RIPv2
FRRouting を起動時に有効にするために以下のコマンドを入力。また、vtyshでFRRoutingに入り、RIP設定を入力します。 ここではCisco風のコマンドになります。
```
# service frr enable
# service fee start

# vtysh
OpenWrt# config terminal
OpenWrt(config)# router rip
OpenWrt(config-router)# network eth1
OpenWrt(config-router)# redistribute connected
OpenWrt(config-router)# exit
OpenWrt(config)# exit
OpenWrt# write
```
通常のルート交換はＯＫ
WR1 とWR2 でルート交換しないように、Neighborを設定する
### WR1 WR2
```
router rip
 version 2
 neighbor 192.168.10.11
 neighbor 192.168.10.12
 redistribute connected
exit
```
### WR3 WR4
```
router rip
 version 2
 neighbor 192.168.10.1
 neighbor 192.168.10.2
 redistribute connected
exit
```
RIPの場合は学習したルートを勝手に再配布しないようで、無事にWR1からＢ拠点へのルートが消えました。
```
OpenWrt1# show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,

C>* 192.168.1.0/24 is directly connected, br-lan, 00:24:51
C>* 192.168.10.0/24 is directly connected, eth1, 00:24:51
R>* 192.168.56.0/24 [120/2] via 192.168.10.11, eth1, weight 1, 00:08:07
R>* 192.168.56.10/32 [120/2] via 192.168.10.11, eth1, weight 1, 00:08:07
```
WR3 WR4 はＡ Ｂ 両方へのルートを持っています。
```
OpenWrt3# show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,

R>* 192.168.1.0/24 [120/2] via 192.168.10.1, eth1, weight 1, 00:07:51
R>* 192.168.2.0/24 [120/2] via 192.168.10.2, eth1, weight 1, 00:06:25
C>* 192.168.10.0/24 is directly connected, eth1, 00:49:23
C>* 192.168.56.0/24 is directly connected, br-lan, 00:49:23
C>* 192.168.56.10/32 is directly connected, br-lan, 00:49:23
```
RIP のルートについて再配布を制限するようにdistribute-listを設定する必要が有ると踏んでいたのですが、このケースでは再配布されないようです。