SONiC からみる MAC Table と Routing Table

### はじめに
SONiC VS の導入について、"[SONiC VS 仮想スイッチを使ってみよう](https://qiita.com/cyo-chang/items/f007fa93fcff0b2897aa)" に参考していただければと思います。

少し私の背景を話しますが、2年前、大学の先輩にネットワーク業界へさそわれて、今の会社に転職しました。プログラミングの経験がありますが、L2/L3の背景知識もなくスイッチさえ操作したこともない状態で、突然 SONiC のテストケースの実装に参加しなければならなくて、少し苦労しました。ネット上で SONiCの記事も少なく、自らメモしなきゃというモチベーションで、SONiC やネットワーキングの基礎に関する記事を書き始めました。

SONiC VSの操作をする前に、雑談ベースで少しオープンネットワーキングの背景も紹介させていただきますね。

### SONiC と Disaggregated / OpenNetworking
[Is Open / Disaggregated Networking for everyone?](https://pine-networks.com/blog/is-open-disaggregated-networking-for-everyone/)という記事は、Disaggregated / OpenNetworking をとても理解しやすくしてくれています。
> Open/disaggregated networking refers to the separation of hardware and software layers in a networking device, enabling network operators to choose hardware platforms and operating systems independently, without restriction to a single vendor.

つまり、企業/ネットワーク事業者が単一のベンダーに制限されることなく、ハードウェア・プラットフォームや NOS を独自に選択できるようにすることを指します。

SONiC のサポート HW 一覧から見ると、すでに20社以上のベーダは SONiC をサポートしていますね。
https://sonic-net.github.io/SONiC/Supported-Devices-and-Platforms.html

さて、今日の本題に入りましょう。

## 今回の目標
SONiCはデータセンターの L3 環境向けに設計された NOS です。そのため、搭載された HW は基本的にL3スイッチとして機能し、MACテーブルやルーティングテーブルなどの情報は SONiC 上で容易に確認できるはずですね。今日は VS 上で試します。

- Spine 1 台、Leaf 2 台の構造で、2 個の Broadcast domain を作成
- 同じ BD 内のホスト同士の ping 疎通
- 違う BD 内のホスト同士の ping 疎通
- それぞれの MAC Table と Routing Table を確認

## Topology
![fdb-qiita-2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307184/aec51664-b1c8-5a8e-b3f7-224c11e3375f.png)
## Config
```
# Spine01
sudo config interface starup Ethernet0
sudo config interface starup Ethernet1
sudo config vlan add 10
sudo config vlan add 30
sudo config vlan member add 10 Ethernet0
sudo config vlan member add 30 Ethernet1
sudo config interface ip add Vlan10 192.168.10.254/24
sudo config interface ip add Vlan30 172.30.10.254/24

# Leaf01
sudo config interface starup Ethernet0
sudo config interface starup Ethernet4
sudo config interface starup Ethernet5
sudo config vlan add 10
sudo config vlan member add 10 Ethernet0
sudo config vlan member add -u 10 Ethernet4
sudo config vlan member add -u 10 Ethernet5
sudo config interface ip add Vlan10 192.168.10.100/24

# Leaf02
sudo config interface starup Ethernet1
sudo config interface starup Ethernet4
sudo config interface starup Ethernet5
sudo config vlan add 30
sudo config vlan member add 30 Ethernet1
sudo config vlan member add -u 30 Ethernet4
sudo config vlan member add -u 30 Ethernet5
sudo config interface ip add Vlan30 172.30.10.100/24

# PC1
ip 192.168.10.1/24 192.168.10.254

# PC2
ip 192.168.10.2/24 192.168.10.254

# PC3
ip 172.30.10.1/24 172.30.10.254

# PC4
ip 172.30.10.2/24 172.30.10.254
```
### 検証内容
以下の Ping を行います。
- 同じ BD 内のホスト同士の ping 疎通
    - PC1（192.168.10.1）からPC2（192.168.10.2）への間
- 違う BD 内のホスト同士の ping 疎通
    - PC1（192.168.10.1）からPC3（172.30.10.2）への間
    - PC1（192.168.10.1）からPC4（172.30.10.4）への間

## 検証結果

無事に PC 間の ping 疎通をできました！
![fdb-mac-topo-qiita-5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307184/2929230c-dadd-298f-c04b-b5d161fc9506.png)

### MAC table
`show mac` コマンドで、MAC table の内容を確認できます。PC の MAC は、Leaf と Spine の対応のポートに学習されているのを確認しました。
![mac-topo-qiita-6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307184/d9275f03-6639-5aa2-d877-7287ec6692c8.png)

### Routing Table
`sudo config interface ip add ${interface_name} ${ip_address}`のコマンドを叩いたら、直接接続されたネットワークセグメントへのルーティングエントリを生成できます。
今回のSpine01はルーターの機能をして、`172.30.10.0/24`と`192.168.10.0/24`のセグメントが Vlan30 と Vlan10 に接続させています。PC1 はパケットを PC3 に送信した際に、Spine01 はルーティンしてあげます。

![fdb-topo-qiita-3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307184/14f8ffb4-0b7e-87f8-996f-ebf113728f53.png)

ちなみに、SONiC routing 周辺の CLI は、FRR の CLI と一緒です。FRR CLI は Cisco like なので、ほとんどのネットワークオペレーターにとって、すぐ学習できるでしょう。今度FRR も紹介したいと思います。

以上、ここまでご参考いただいてありがとうございます！

## 参考
[Is Open / Disaggregated Networking for everyone?](https://pine-networks.com/blog/is-open-disaggregated-networking-for-everyone/)
[SONiC VS 仮想スイッチを使ってみよう](https://qiita.com/cyo-chang/items/f007fa93fcff0b2897aa)