【初心者向け】FRRで OSPFやBGPのシミュレーションをするための準備

## クイックガイド
1. [FRR のインストール](https://deb.frrouting.org/)
1. BGPd などの有効化
1. I/F の設定

## はじめに
この記事は前回の続きです。前回はこちら。

https://qiita.com/hana-chan/items/36c45fe19771ad4c0b87

BGPやOSPFを触ってみたい！　というNW初心者の方には、シミュレーターを使って文字通りガチャガチャやるのをオススメしています。

だってシミュレーターは壊しても間違っても全く問題無し！
BGP 運用をやっていて少しでも間違うと世界に晒されることもあるので、毎回ドキドキです:innocent:

シミュレーターは [GNS3](https://www.gns3.com) が有名ですが、今回は FRR を使いたいと思います！

## FRRとは？
[FRRouting](https://frrouting.org/) とは、Linuxなどで稼働するルーティングプロトコルスイート（≒セット）であり、オープンソースで提供されているものです。
要するに、OSPF とか BGP がフリーで手っ取り早く試せます。

同じくオープンソースなものとして [Vyos](https://vyos.io/) があります。
個人的には Vyos もオススメなのですが、残念ながら Vyos は arm アーキテクチャ、つまり Apple silicon な M1, M2, M3,... チップでは動かないのです...[^KEY1]
（頑張れば動くらしい）

[^KEY1]: https://support.vyos.io/support/solutions/articles/103000096284-platform-support

そこでApple Silicon な MacBook に FRR を導入し、OSPFやBGP を動かすまでをやってみたいと思います。今回はその準備です。

## Virtual Box のインストール　〜　Ubuntu VMを複数立ち上げる

長くなりすぎたので、前記事に書いています。
よかったらどうぞ。

https://qiita.com/hana-chan/items/36c45fe19771ad4c0b87

## FRR セットアップ

作成したUbuntu（2台）にSSHで接続しておきます。
1台目は`Ubuntu1`とします。

### インストール

[公式サイト](https://deb.frrouting.org/)の記載の通り、インストールしていきましょう。
```bash: Ubuntu1
curl -s https://deb.frrouting.org/frr/keys.gpg | sudo tee /usr/share/keyrings/frrouting.gpg > /dev/null
FRRVER="frr-stable"
echo deb '[signed-by=/usr/share/keyrings/frrouting.gpg]' https://deb.frrouting.org/frr \
     $(lsb_release -s -c) $FRRVER | sudo tee -a /etc/apt/sources.list.d/frr.list

sudo apt update && sudo apt install -y frr frr-pythontools
```

### セットアップ

```bash: Ubuntu1
sudo vim /etc/frr/daemons
```
を実行し、有効化するプロトコルを指定します。

```bash: /etc/frr/daemons
bgpd=yes  # bgp を有効化するならyesに
ospfd=yes  # ospf を有効化するならyesに
ospf6d=no
ripd=no
ripngd=no
isisd=no
pimd=no
pim6d=no
ldpd=no
nhrpd=no
eigrpd=no
babeld=no
sharpd=no
pbrd=no
bfdd=no
fabricd=no
vrrpd=no
pathd=no

vtysh_enable=yes  # yes になっていることを確認
zebra_options="  -A 127.0.0.1 -s 90000000"
mgmtd_options="  -A 127.0.0.1"
bgpd_options="   -A 127.0.0.1"
ospfd_options="  -A 127.0.0.1"
```

コメントの通り、`no -> yes` に変更すると有効化することができます。
結構多くのプロトコルに対応しているんですね！

```bash:Ubuntu1 反映
systemctl enable frr # 自動起動を有効化
sudo systemctl restart frr
sudo systemctl status frr  # ステータス確認。「q」で抜ける
```
Status を確認すると、BGPなどがちゃんと有効化されたようです！
```bash: Ubuntu1（status ログ）
[QDG3Y-BY5TN] bgpd state -> up : connect succeeded
[QDG3Y-BY5TN] ospfd state -> up : connect succeeded
```

## I/F 準備

![image001](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613783/0c288e54-1a6c-ac96-ff67-e7a417a91613.png)

ここでは、図のような簡単な構成にすることをゴールにします。

### インターフェースの設定
このあとのプロトコルを設定するために、インターフェースを上げてアドレスを付与します。
まずは `ip addr` コマンドを実行してインターフェースを確認します。
```bash:ip addr（一部省略）
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo

2: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:**:**:*** brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 metric 100 brd 10.0.2.255 scope global dynamic enp0s8
   
3: enp0s9: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
    link/ether 08:00:27:**:**:** brd ff:ff:ff:ff:ff:ff
```

ここでは、
- lo はループバックインターフェース
- enp0s8 は前回 Virtualbox で設定したNAT
- enp0s9 は前回 Virtualbox で設定した内部ネットワーク

です。NATは `apt update` などインターネットに出るために利用しています。
内部ネットワークは、ゲストVM同士だけが通信できる特別なネットワークです。ホストとは隔絶されています。

ループバックと内部ネットワークのインターフェース（I/F）にアドレスを設定し、上げます。
netplan を使います。

:::note info
以下、`enp0s9`の名前が違う時は、手元の名前に変えてください。
:::


```bash: ubuntu1
sudo vim /etc/netplan/99-test.yaml
```

`99-test`という部分は適当な名前なので変えても構いません。
新しいファイルなので、下記を記載してください。


```ubuntu1: /etc/netplan/99-test.yaml
network:
  ethernets:
    enp0s9:
      addresses:
        - 172.16.0.1/24
    lo:
      addresses:
        - 10.0.0.100/32
  version: 2
```
これで各インターフェースにIPアドレスを設定することができます。
なお、再起動しても維持されます。

netplanは最初のうちは分かりづらいですが、公式ドキュメントのサンプルを眺めておけば、雰囲気は掴めると思います。
他にも設定できるので見てみてください。

https://netplan.readthedocs.io/en/stable/examples/#how-to-configure-a-static-ip-address-on-an-interface

終わったら反映して確認します。
```bash:ubuntu1
sudo chmod 500 /etc/netplan/99-test.yaml
sudo netplan apply  # 反映
```

```bash:ip addr（一部省略）
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
    inet 10.0.0.100/32 scope global lo
  
2: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    inet 10.0.2.15/24 metric 100 brd 10.0.2.255 scope global dynamic enp0s8

3: enp0s9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    inet 172.16.0.1/24 scope global enp0s9
```

アドレスがついて、`State UP` になっていることがわかります。
もう1台の方も同様にアドレスを変えて設定しておきます。

```bash:ubuntu2
sudo vim /etc/netplan/99-test.yaml
```
```ubuntu2: /etc/netplan/99-test.yaml
network:
  ethernets:
    enp0s9:
      addresses:
        - 172.16.0.2/24
    lo:
      addresses:
        - 10.0.0.200/32
  version: 2
```
```bash:ubuntu2
sudo chmod 500 /etc/netplan/99-test.yaml
sudo netplan apply  # 反映
```

### 設定検証
できたら、Ubuntu1 に戻りpingを送ってみます。

```bash:ubuntu1
ping 172.16.0.1 # 自分自身

PING 172.16.0.1 (172.16.0.1) 56(84) bytes of data.
64 bytes from 172.16.0.1: icmp_seq=1 ttl=64 time=0.105 ms
^C
```
↑ ここでは自分のI/Fに正しくアドレスが設定されていることがわかります。

```bash:ubuntu1
ping 172.16.0.2 # ubuntu2あて
PING 172.16.0.2 (172.16.0.2) 56(84) bytes of data.
64 bytes from 172.16.0.2: icmp_seq=1 ttl=64 time=3.44 ms
64 bytes from 172.16.0.2: icmp_seq=2 ttl=64 time=1.13 ms
^C
```
↑ ここではUbuntu1 -> Ubuntu2 へpingが正しくやり取りされていることがわかります。

![image001](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613783/0c288e54-1a6c-ac96-ff67-e7a417a91613.png)

図のようにつながった Ubuntu1 と 2 が正しく通信できることがわかったので、いよいよBGPなどを設定していきます。

:::note info
もしpingができなかったときは以下を確認してみてください。
1. 2台とも IP アドレスが正しく設定されていること
1. 2台とも I/F が Up していること
1. Virtualbox の設定を確認し、2台とも
    1. アダプター2 有効にチェックが入っている
    1. `内部ネットワーク`になっていること
    1. ネットワークの名前の値が Ubuntu1 と 2 で同じであること
:::

## 転送設定

最後に、フォワーディング設定を有効化しておきます。
`sudo vim /etc/sysctl.conf` でファイルを編集します。

以下の2行の冒頭にある # を外せばOKです。
```diff: /etc/sysctl.conf
- #net.ipv4.ip_forward=1
- #net.ipv6.conf.all.forwarding=1
+ net.ipv4.ip_forward=1
+ net.ipv6.conf.all.forwarding=1
```
完了したら、下記を実行して反映します。
```
sudo sysctl -p
```
2台とも終われば完了です。

次回はこちら：

https://qiita.com/hana-chan/items/6e233b1e369163488c98