SONiC VS 仮想スイッチを使ってみよう [Broadcom]

## SONiC について
SONiC（Software for Open Networking in the Cloud）は、LinuxベースのNOSです。2016年にMicrosoftによって開発され、当初はAzureクラウドデータセンター向けに作成されましたが、その後、MS社はソースコードをオープンし、業界での人気と採用が広がっているそうです。
ググってみたら、"Enterprise SONiC By XXX" は 勝手に使えなく、MS 社のトレードマークだそうです。

https://github.com/sonic-net/SONiC/blob/master/Enterprise%20SONiC%20Distribution%20trademark%20license%20-%20final.pdf

Enterprise SONiC By XXX なら、日本では以下 2 社の利用実績もあるって 近年の JANOG の講演会から聞きました。
- Enterprise SONiC By Broadcom 
[SONiCをLINEのClosネットワークに導入した話](https://speakerdeck.com/line_developers/a-story-to-adopt-sonic-in-lines-clos-network?slide=47)
- Enterprise SONiC Distribution by Edgecore 
[SONiC ZTPでデータセンターネットワークを作った話](https://www.janog.gr.jp/meeting/janog52/wp-content/uploads/2023/06/janog52-sonicztp_pre.pdf)

## 目標
- GNS3 に Broadcom VS をインポート
- VS Interface の確認
    - mgmt port
    - front port
- ping 疎通
    - Vlan config
    - IP interface config
    - ARP table

## 環境と事前準備
- Broadcom SONiC Virtual Switch Image ダウンロード先
https://github.com/Broadcom/sonic-VirtualSwitch/releases/tag/3.1.2

- ESXi VMware環境
![esxi.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307184/fc622739-4a1d-690c-d4cd-9e7664956efc.png)
    - ゲスト OS：Ubuntu Linux (64 ビット)
    - 互換性：ESXi 6.7 仮想マシン


## GNS3 に Broadcom VS をインポート
1. sonic-vs-3.1.2.gns3a を事前に何処かでダウンロード
1. GNS3を開き、「file」->「Import appliance」->「sonic-vs-3.1.2.gns3a」を選択し、デフォルトの「Install the appliance on your local computer」を確認し、「next」をクリック
![esxi-2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307184/403a0d56-d571-3178-9019-dfa4a90e44a1.png)
1. デフォルトの「qemu-system-x86_64」を確認し、「next」をクリック
![esxi-3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307184/7691eac5-2ec5-f9d3-1924-965a1b5ea91e.png)
1. Enterprise SONiC Distribution by Broadcom version 3.1.2 のステータスはReady to install になってるかどうかを確認
もし missing file になっている場合、事前に github 上ダウンロードした3.1.2 版のイメージを import する必要
Nextボタンを押すと、「The template available in the router category」の完了画面は表示する
![esxi-4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307184/d51b3573-c174-b190-90b3-796cc21048f8.png)
1. インポート完了！
![esxi_vs-5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307184/b8a59d39-9b3b-73a1-bdd3-d78cc680bf66.png)

## VS Interface の確認
[GNS3でSONiCを使う](https://qiita.com/masru0714/items/1ef92db005a372ae5ea5)の記事を参考し、インターフェースについて、Community版の SONiC VS ならいくつかの罠がありそうで、まず VS 上のインターフェースを確認しましょう。
### Interface

#### Broadcom SONiC VS

デフォルトの Interface status を `show interface status` コマンドで確認してみると、、、
```
admin@brSONiC-1:~$ show interface statu
  Interface            Lanes    Speed    MTU    Alias    Vlan    Oper    Admin    Type    Asym PFC
-----------  ---------------  -------  -----  -------  ------  ------  -------  ------  ----------
  Ethernet0               49      25G   9100   Eth1/1  routed    down     down     N/A         N/A
  Ethernet1               50      25G   9100   Eth1/2  routed    down     down     N/A         N/A
  Ethernet2               51      25G   9100   Eth1/3  routed    down     down     N/A         N/A
  Ethernet3               52      25G   9100   Eth1/4  routed    down     down     N/A         N/A
  Ethernet4               57      25G   9100   Eth1/5  routed    down     down     N/A         N/A
  Ethernet5               58      25G   9100   Eth1/6  routed    down     down     N/A         N/A
  Ethernet6               59      25G   9100   Eth1/7  routed    down     down     N/A         N/A
  Ethernet7               60      25G   9100   Eth1/8  routed    down     down     N/A         N/A
  Ethernet8               61      25G   9100   Eth1/9  routed    down     down     N/A         N/A
  Ethernet9               62      25G   9100  Eth1/10  routed    down     down     N/A         N/A
 Ethernet10               63      25G   9100  Eth1/11  routed    down     down     N/A         N/A
 Ethernet11               64      25G   9100  Eth1/12  routed    down     down     N/A         N/A
 Ethernet12               77      25G   9100  Eth1/13  routed    down     down     N/A         N/A
 Ethernet13               78      25G   9100  Eth1/14  routed    down     down     N/A         N/A
 Ethernet14               79      25G   9100  Eth1/15  routed    down     down     N/A         N/A
 Ethernet15               80      25G   9100  Eth1/16  routed    down     down     N/A         N/A
 Ethernet16               85      25G   9100  Eth1/17  routed    down     down     N/A         N/A
 Ethernet17               86      25G   9100  Eth1/18  routed    down     down     N/A         N/A
 Ethernet18               87      25G   9100  Eth1/19  routed    down     down     N/A         N/A
 Ethernet19               88      25G   9100  Eth1/20  routed    down     down     N/A         N/A
 Ethernet20               93      25G   9100  Eth1/21  routed    down     down     N/A         N/A
 Ethernet21               94      25G   9100  Eth1/22  routed    down     down     N/A         N/A
 Ethernet22               95      25G   9100  Eth1/23  routed    down     down     N/A         N/A
 Ethernet23               96      25G   9100  Eth1/24  routed    down     down     N/A         N/A
 Ethernet24               13      25G   9100  Eth1/25  routed    down     down     N/A         N/A
 Ethernet25               14      25G   9100  Eth1/26  routed    down     down     N/A         N/A
 Ethernet26               15      25G   9100  Eth1/27  routed    down     down     N/A         N/A
 Ethernet27               16      25G   9100  Eth1/28  routed    down     down     N/A         N/A
 Ethernet28               21      25G   9100  Eth1/29  routed    down     down     N/A         N/A
 Ethernet29               22      25G   9100  Eth1/30  routed    down     down     N/A         N/A
 Ethernet30               23      25G   9100  Eth1/31  routed    down     down     N/A         N/A
 Ethernet31               24      25G   9100  Eth1/32  routed    down     down     N/A         N/A
 Ethernet32               29      25G   9100  Eth1/33  routed    down     down     N/A         N/A
 Ethernet33               30      25G   9100  Eth1/34  routed    down     down     N/A         N/A
 Ethernet34               31      25G   9100  Eth1/35  routed    down     down     N/A         N/A
 Ethernet35               32      25G   9100  Eth1/36  routed    down     down     N/A         N/A
 Ethernet36               97      25G   9100  Eth1/37  routed    down     down     N/A         N/A
 Ethernet37               98      25G   9100  Eth1/38  routed    down     down     N/A         N/A
 Ethernet38               99      25G   9100  Eth1/39  routed    down     down     N/A         N/A
 Ethernet39              100      25G   9100  Eth1/40  routed    down     down     N/A         N/A
 Ethernet40              105      25G   9100  Eth1/41  routed    down     down     N/A         N/A
 Ethernet41              106      25G   9100  Eth1/42  routed    down     down     N/A         N/A
 Ethernet42              107      25G   9100  Eth1/43  routed    down     down     N/A         N/A
 Ethernet43              108      25G   9100  Eth1/44  routed    down     down     N/A         N/A
 Ethernet44              113      25G   9100  Eth1/45  routed    down     down     N/A         N/A
 Ethernet45              114      25G   9100  Eth1/46  routed    down     down     N/A         N/A
 Ethernet46              115      25G   9100  Eth1/47  routed    down     down     N/A         N/A
 Ethernet47              116      25G   9100  Eth1/48  routed    down     down     N/A         N/A
 Ethernet48  121,122,123,124     100G   9100  Eth1/49  routed    down     down     N/A         N/A
 Ethernet52  125,126,127,128     100G   9100  Eth1/50  routed    down     down     N/A         N/A
 Ethernet56      69,70,71,72     100G   9100  Eth1/51  routed    down     down     N/A         N/A
 Ethernet60      65,66,67,68     100G   9100  Eth1/52  routed    down     down     N/A         N/A
 Ethernet64          1,2,3,4     100G   9100  Eth1/53  routed    down     down     N/A         N/A
 Ethernet68      33,34,35,36     100G   9100  Eth1/54  routed    down     down     N/A         N/A
 Ethernet72          5,6,7,8     100G   9100  Eth1/55  routed    down     down     N/A         N/A
 Ethernet76      41,42,43,44     100G   9100  Eth1/56  routed    down     down     N/A         N/A
```
なんと、トータル 56 ポートがあります。多分この VS は downlink 25Gx48 / uplink 100Gx8 のスイッチだと想定しているでしょう。
だが、GNS3上の操作は eth0 + Ethernet0~8 、トータル 10 ポートしかありません。

|GNS3上のポート |SONiC仮想マシン内でのポート|
|--- |--- |
|eth0|eth0|
|Ethernet0|Ethernet0|
|Ethernet1|Ethernet1|
|Ethernet2|Ethernet2|
|...|...|
|Ethernet8|Ethernet8|

Broadcom SONiC VS のポート数は少ないですが、Community SONiC VS のような GNS3 と VS の名称不一致の現象がないですね。Community 版より使いやすいでしょう。

## ping 疎通を検証！
以下のようにトポロジーを作図します。
![esxi-topo-7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307184/4175172d-e814-e15a-853d-612c56aefe4d.png)
以下のコンフィグを想定
| スイッチ名    | VLAN ID | IPアドレス       | ポート      | ポートのタグ付け |
|--------------|---------|-----------------|------------|-----------------|
| fanout       | 1       | Vlan1: 192.168.1.1/24  | Ethernet0, Ethernet1 | タグなし         |
| brSONiC-1    | 10      | Vlan10: 172.16.10.1/24  | Ethernet0   | タグ付き         |
| brSONiC-1    | -      | mgmt: 192.168.1.10/24  | eth0   | -         |
| brSONiC-2    | 10      | Vlan10: 172.16.10.2/24  | Ethernet0   | タグ付き         |
| brSONiC-2    | -      | mgmt: 192.168.1.11/24  | eth0   | -         |

また、default hostname は `sonic` のため、事前に以下のコマンドでそれぞれの hostname を変更しときます。
```
sudo config hostname ${new_hostname}
```
### fanout
#### config
```
admin@fanout:~$ sudo config interface startup Ethernet0
admin@fanout:~$ sudo config interface startup Ethernet1
admin@fanout:~$ sudo config vlan add 1
admin@fanout:~$ sudo config vlan member add 1 -u Ethernet0
admin@fanout:~$ sudo config vlan member add 1 -u Ethernet1
admin@fanout:~$ sudo config interface ip add Vlan1 192.168.1.1/24
```
#### interface status
```
admin@fanout:~$ show interface status |head -n 5
  Interface            Lanes    Speed    MTU    Alias    Vlan    Oper    Admin    Type    Asym PFC
-----------  ---------------  -------  -----  -------  ------  ------  -------  ------  ----------
  Ethernet0               49      25G   9100   Eth1/1   trunk      up       up     N/A         N/A
  Ethernet1               50      25G   9100   Eth1/2   trunk      up       up     N/A         N/A
  Ethernet2               51      25G   9100   Eth1/3  routed    down     down     N/A         N/A
```
#### ip interface
```
admin@fanout:~$ show ip interfaces 
Interface    IPv4 address/mask    Master    Admin/Oper    BGP Neighbor    Neighbor IP    Flags
-----------  -------------------  --------  ------------  --------------  -------------  -------
Vlan1        192.168.1.1/24                 up/up         N/A             N/A
docker0      240.127.1.1/24                 up/down       N/A             N/A
lo           127.0.0.1/8   
```

#### Vlan brief
```
admin@fanout:~$ show vlan brief 
+-----------+----------------+-----------+----------------+-----------------------+
|   VLAN ID | IP Address     | Ports     | Port Tagging   | DHCP Helper Address   |
+===========+================+===========+================+=======================+
|         1 | 192.168.1.1/24 | Ethernet0 | untagged       |                       |
|           |                | Ethernet1 | untagged       |                       |
+-----------+----------------+-----------+----------------+-----------------------+
```

### brSONiC-1
#### config
```
admin@fanout:~$ sudo config interface startup Ethernet0
admin@fanout:~$ sudo config vlan add 10
admin@fanout:~$ sudo config vlan member add 10 Ethernet0
admin@fanout:~$ sudo config interface ip add Vlan10 172.16.10.1/24
admin@fanout:~$ sudo config interface ip add eth0 192.168.1.10/24
```
#### Interface status
```
admin@brSONiC-1:~$ show interface status |head -n 5
  Interface            Lanes    Speed    MTU    Alias    Vlan    Oper    Admin    Type    Asym PFC
-----------  ---------------  -------  -----  -------  ------  ------  -------  ------  ----------
  Ethernet0               49      25G   9100   Eth1/1   trunk      up       up     N/A         N/A
  Ethernet1               50      25G   9100   Eth1/2  routed    down     down     N/A         N/A
  Ethernet2               51      25G   9100   Eth1/3  routed    down     down     N/A         N/A
```
#### ip interface
```
admin@brSONiC-1:~$ show ip interfaces 
Interface    IPv4 address/mask    Master    Admin/Oper    BGP Neighbor    Neighbor IP    Flags
-----------  -------------------  --------  ------------  --------------  -------------  -------
Vlan10       172.16.10.1/24                 up/up         N/A             N/A
docker0      240.127.1.1/24                 up/down       N/A             N/A
eth0         192.168.1.10/24                up/up         N/A             N/A
lo           127.0.0.1/8   
```

#### Vlan brief
```
admin@brSONiC-1:~$ show vlan brief 
+-----------+----------------+-----------+----------------+-----------------------+
|   VLAN ID | IP Address     | Ports     | Port Tagging   | DHCP Helper Address   |
+===========+================+===========+================+=======================+
|        10 | 172.16.10.1/24 | Ethernet0 | tagged         |                       |
+-----------+----------------+-----------+----------------+-----------------------+
```

### brSONiC-2
#### config
```
admin@fanout:~$ sudo config interface startup Ethernet0
admin@fanout:~$ sudo config vlan add 10
admin@fanout:~$ sudo config vlan member add 10 Ethernet0
admin@fanout:~$ sudo config interface ip add Vlan10 172.16.10.2/24
admin@fanout:~$ sudo config interface ip add eth0 192.168.1.11/24
```
#### Interface status
```
admin@brSONiC-2:~$ show interface status |head -n 5
  Interface            Lanes    Speed    MTU    Alias    Vlan    Oper    Admin    Type    Asym PFC
-----------  ---------------  -------  -----  -------  ------  ------  -------  ------  ----------
  Ethernet0               49      25G   9100   Eth1/1   trunk      up       up     N/A         N/A
  Ethernet1               50      25G   9100   Eth1/2  routed    down     down     N/A         N/A
  Ethernet2               51      25G   9100   Eth1/3  routed    down     down     N/A         N/A
```
#### ip interface
```
admin@brSONiC-2:~$ show ip interfaces 
Interface    IPv4 address/mask    Master    Admin/Oper    BGP Neighbor    Neighbor IP    Flags
-----------  -------------------  --------  ------------  --------------  -------------  -------
Vlan10       172.16.10.2/24                 up/up         N/A             N/A
docker0      240.127.1.1/24                 up/down       N/A             N/A
eth0         192.168.1.11/24                up/up         N/A             N/A
lo           127.0.0.1/8   
```

#### Vlan brief
```
admin@brSONiC-2:~$ show vlan brief 
+-----------+----------------+-----------+----------------+-----------------------+
|   VLAN ID | IP Address     | Ports     | Port Tagging   | DHCP Helper Address   |
+===========+================+===========+================+=======================+
|        10 | 172.16.10.2/24 | Ethernet0 | tagged         |                       |
+-----------+----------------+-----------+----------------+-----------------------+
```

### 検証結果
お互いに ping させて、`show arp` コマンドで確認すると、ARP 学習できましたね。
![esxi-arp-8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307184/65af5414-9a86-b173-293b-ff930952bfd4.png)


## 最後に
以上で、今日の目的も全部達成しましたね。
どのように SONiC VS を利用するのかすでに多くの記事がありますが、実際に動けるか試した記事はまだまだ少ないです。今後、GNS3を使用して、以下の機能を試し記事にしてみようと考えています。

L2機能：
- LACP

L3機能：
- Static route
- BGP
- OSPF

セキュリティ / システム / 管理機能：
- CACL
- AAA

システム / 管理 SNMP サポート機能：
- Syslog
- NTP
- DHCPリレー
- ログファイル
- 管理フレームワーク

...など

長く書いてしまいましたが、ここまで参考していただいてありがとうございます。
初めて Qiita での投稿で、今後ともよろしくお願いします！

## 参考
[How to run vSONiC on GNS3](https://youtu.be/Hl1-aPKl0PU?si=OuibrgrNYWmVEmz-)
[SONiC github](https://github.com/sonic-net)
[Setting up SONiC on GNS3](https://pine-networks.com/blog/setting-up-sonic-on-gns3/)
[SONiC CLI について](https://support.edge-core.com/hc/en-us/categories/360002134713-Edgecore-SONiC)