GNS3上でSONiCを動かしてClosNWを組んでみた

# はじめに
ClosNWについて夏休みに触る機会があって自分でも組んでみたいと思い、今回は仮想環境上でClosNWを構築しようと思いました。
GNS3で一般的に使われるc3725やc7200もBGPを喋るので、このノードをボコボコ立ててやろうと思ったのですが、ポートが足りずどうしようか迷っていました。
そこで、色々調べてたらGNS3上でkvmを有効にして、qemuでLinuxをエミュレートさせれば、SONiCを動かせるとの記事を見つけたので、それを参考に今回は3layer/2rack構成のClosNWを組むことにしました。
本当は、3rack構成にしたかったのですが、リソースに限界があったため、妥協して2rack構成にすることにしました。。。
今回、Qiitaの記事を書くのもはじめてで、NW周りもまだ未熟な部分ばかりだと思うので、間違っているところもあるかもしれないです。。。あくまで参考程度で見ていただければ幸いです。

# 構成

![トポロジ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1658917/206eb898-861a-5b9a-ca84-93304ef566eb.png)


# 環境
* OS：Windows 11 Pro(CPU:i5-12600k, RAM:48G)
* GNS3：ver. 2.2.33.1
* VMware WorkStation：ver. 16.2.4
  * GNS3-server：ver. 2.2.33.1
    (CPU:6core, RAM:32G)
  * SONiC： SONiC.master.147284-c53972b34
  
# SONiCのイメージ取得
GNS3の環境構築は、ググれば色々出てくるので、省略します。mac・windows両方で環境構築しましたが、windowsでやろうとしたほうが、個人的にやりやすいと思います。<br>
イメージURL：[Artifact sonic-buildimage.vs](https://sonic-build.azurewebsites.net/ui/sonic/pipelines/142/builds/147284/artifacts/279912?branchName=master&artifactName=sonic-buildimage.vs)

上記ページから`target/sonic-vs.img.gz`（下から4番目?くらい）を取ってきます。

取ってきたら、`.gns3a`ファイルに変換します。

![gns-gui](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1658917/bfa6f6e7-ff29-499f-4fa6-efee97594e41.png)


```text:GNS3-GUIでの手順
Browse Router -> New Template -> Import an appliance file(.gns3a extension)
```


gns3-gui上で`.gns3a`をテンプレートとしてインポート。

インポートする際の構成は以下の通り。

![sonic-version](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1658917/2a7fc55b-3fc4-088a-262e-e384b780a565.png)


インポートできたら、後はドラッグアンドドロップでノードを自由に配置、結線。

### 補足
`.gns3a`に変換しなくても、解凍したimgをgns3内のqemuで読み込ませても、動作します。（結局、applianceファイルを読み込んだときに、imgを読み込んでQemu VMを作成する形なので。）<br>
ただし、デフォルトの設定で進めていくと、ramが256mで設定されるので、2,048mとかに変更しないとramが少なすぎて動作しないので気をつけてください。(やらかしてめっちゃ重いやんけってなってました、、、)
```text:GNS3-GUIでの手順
Edit -> Preference -> Qemu VMs -> New
```


# ClosNWの構築
いよいよここから、Closの構築ですが、VMWareにRAMを32G与えています。単純にノード一台あたりに2G-RAM与えていて、ノードを10台起動させるので、20G-RAMくらい必要になってきます。
1G-RAMでも試してみましたが、再起動を繰り返すようになるため、最低でも2G-RAMは必要なのかなあって感じでした。<br>

## アドレス・AS番号の決定
今回は3layer/2rack構成のため、ノード10台でそれぞれのP2P-Address、Loopback-Address、AS番号を決める必要があります。<br>

* P2P：10.0.8.0/24
* Loopback：10.0.9.0/24
* AS-num：65000/65100/65110/65200/65210
* PC[1~4]：192.168.10.0/24 ~ 192.168.40.0/24

上位層から/30ずつ区切って、それぞれにP2Pを与えました。Loopbackも同じく、/32ずつ区切って与えています。<br>
AS番号は
* External-Layer：65000[Ex1,2]
* Spine-Layer：65100[Sp1,2]・65200[Sp3,4]
* Leaf-Layer：65110[Lf1,2]・65210[Lf3,4]

のように決定し、Spine/Leafはrackごとで異なる番号を割り当てています。

## P2Pの設定
定義したアドレスを起動させたノードに、設定していきます。<br>
例：Ethernet4(GNS3:Ethernet1)に対してアドレスを設定<br>
```
config interface ip add Ethernet4 10.0.8.1 10.0.8.1 
```
ここで注意する点として、SONiC側のinterfaceとGNS3側のinterfaceの名前が異なることです。
| GNS3 | SONiC |
| :----: | :----: |
|Ethernet0|Ethernet0|
|Ethernet1|Ethernet4|
|Ethernet2|Ethernet8|
|   ︙  |  ︙   |

基本的に、4の倍数ごとに値が増えていってるだけなので、慣れれば問題ありません。
ちなみにこれは、25Gのポートを4つアグリゲーションして、100Gのポートにしているから、らしいです。

各ノードのinterfaceにアドレスの設定が完了したら、saveして設定を反映させます。
```sh
sudo config save
```

確認コマンドを使って、P2Pが正しく設定されているかを確認します。
```sh
show ip interfaces
```
対向のノード両方にアドレス設定が完了したら、一応pingで疎通確認しておくと良いと思います。

## Loopbackの設定（config_db）
P2Pの設定も途中でコマンド打つことが面倒になってきたため、config_dbに直書きしてました。

SONiCのconfigファイルは`/etc/sonic/config_db.json`に書かれていて、起動時にこのconfigファイルを読み込みます。余談ですが、`config ~`コマンド設定後の`sudo config save`での設定項目の保存では、このconfig_dbに設定を保存している状態になります。

では、早速編集していきます。
初期状態では、余計なIP、BGPの設定が投入されているため、消しておくほうが良いと思います。
```json:config_db.json
"INTERFACE": {
        "Ethernet0": {},
        "Ethernet0|192.168.50.2/24": {},
        "Ethernet4": {},
        "Ethernet4|10.0.8.1/30": {},
        "Ethernet8": {},
        "Ethernet8|10.0.8.5/30": {},
        "Ethernet12": {},
        "Ethernet12|10.0.8.9/30": {},
        "Ethernet16": {},
        "Ethernet16|10.0.8.13/30": {},
        "Ethernet20": {},
        "Ethernet24": {},
        "Ethernet28": {},
        "Ethernet32": {}
    }
```
今回使用しないinterface(e36以降)は消してしまっても、問題なく動きます。ただし、使用するinterfaceで、`"Ethernet0": {}`の部分を消してしまうと、interface自体が消えてしまうっぽいので、注意。

Loopbackはこんな感じ
```json:config_db.json
 "LOOPBACK_INTERFACE": {
        "Loopback0": {},
        "Loopback0|10.0.9.1/32": {}
    }
```
BGPでは、Loopbackが一意になっていないと、正しくneighbor関係が確立されないため、この設定は忘れずにしておくべきです。（自分はここでやらかしました、、、）

一通り設定を投入できたら、以下コマンドで設定を反映させます。
```
sudo config reload -y
```
reloadされるので、復帰したら一応コマンドで設定が反映されているかを確認しておきます。
```text:show ip interfaces
Interface    Master    IPv4 address/mask    Admin/Oper    BGP Neighbor    Neighbor IP
-----------  --------  -------------------  ------------  --------------  -------------
Ethernet0              192.168.50.2/24      up/up         N/A             N/A
Ethernet4              10.0.8.1/30          up/up         N/A             N/A
Ethernet8              10.0.8.5/30          up/up         N/A             N/A
Ethernet12             10.0.8.9/30          up/up         N/A             N/A
Ethernet16             10.0.8.13/30         up/up         N/A             N/A
Loopback0              10.0.9.1/32          up/up         N/A             N/A
```
想定通りアドレスが設定されました。

## BGP-neighborの設定(config_db)
BGP-neighborの設定投入にもconfig_dbを書き換えます。
BGP-neighborの設定情報は、`BGP_NEIGHBOR`オブジェクト内に記述されているため、ここを書き換えます。
```json:config_db.json
"BGP_NEIGHBOR": {
        "10.0.8.2": { //neighbor-P2P_address
            "asn": "65100", //neighbor-ASnum
            "holdtime": "180", //default
            "keepalive": "60", //default
            "local_addr": "10.0.8.1", //local-P2P_address
            "name": "Ex1-Sp1", 
            "nhopself": "0", //default
            "rrclient": "0" //default
        },
        "10.0.8.6": {
            "asn": "65100",
            "holdtime": "180",
            "keepalive": "60",
            "local_addr": "10.0.8.5",
            "name": "Ex1-Sp2",
            "nhopself": "0",
            "rrclient": "0"
        },
        "10.0.8.10": {
            "asn": "65200",
            "holdtime": "180",
            "keepalive": "60",
            "local_addr": "10.0.8.9",
            "name": "Ex1-Sp3",
            "nhopself": "0",
            "rrclient": "0"
        },
        "10.0.8.14": {
            "asn": "65200",
            "holdtime": "180",
            "keepalive": "60",
            "local_addr": "10.0.8.13",
            "name": "Ex1-Sp4",
            "nhopself": "0",
            "rrclient": "0"
        }
}
```
ここで記述するaddressは隣接ノードのp2p_address、AS番号は隣接ノードのASnumです。
自ノードのaddressは`local_addr`タグに記述します。

それから、自ノードのAS番号も書き換えておきます。
`DEVICE_METADATA`オブジェクト内の`bgp_asn`を定義したAS番号に書き換えればOKです。
```json:config_db.json
"DEVICE_METADATA": {
        "localhost": {
            "bgp_asn": "65000",
            "buffer_model": "traditional",
            "default_bgp_status": "up",
            "default_pfcwd_status": "disable",
            "hostname": "SONiC-ExSW1",
            "hwsku": "Force10-S6000",
            "mac": "0c:0d:c3:c2:00:00",
            "platform": "x86_64-kvm_x86_64-r0",
            "type": "LeafRouter"
        }
}
```
設定を投入できたら、`sudo config reload -y`でconfigを反映させます。

reload後に、一応`show ip interfaces`辺りを実行して、状態を確認しておきます。
```text:show ip interfaces
Interface    Master    IPv4 address/mask    Admin/Oper    BGP Neighbor    Neighbor IP
-----------  --------  -------------------  ------------  --------------  -------------
Ethernet0              192.168.50.2/24      up/up         N/A             N/A
Ethernet4              10.0.8.1/30          up/up         Ex1-Sp1         10.0.8.2
Ethernet8              10.0.8.5/30          up/up         Ex1-Sp2         10.0.8.6
Ethernet12             10.0.8.9/30          up/up         Ex1-Sp3         10.0.8.10
Ethernet16             10.0.8.13/30         up/up         Ex1-Sp4         10.0.8.14
Loopback0              10.0.9.1/32          up/up         N/A             N/A
```
上手く反映できてたら、bgp neighbor情報が出るはずです。
その他にも、`show ip bgp summary`、`show ip bgp neighbors`、`show ip bgp network`などで、確認しておくのも良いと思います。

## BGP-network設定(vtysh)
neighborを確立できれば、後はnetworkコマンドを入力してやれば、各経路を広報してくれるようになります。
networkの設定を`config_db`でどうするかがドキュメントを見てもよく分からなかったので、vtyshでやっています。
```text:vtysh
SONiC-ExSW1# conf t
SONiC-ExSW1(config)# router bgp 65000
SONiC-ExSW1(config-router)# network 10.0.8.0/30
SONiC-ExSW1(config-router)# network 10.0.8.4/30
SONiC-ExSW1(config-router)# network 10.0.8.8/30
SONiC-ExSW1(config-router)# network 10.0.8.12/30
```
各ノードに設定して、`show ip route`でルーティングテーブルを確認してやれば、経路が広報されていることを確認できます。

```
admin@SONiC-SpSW1:~$ show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR,
f - OpenFabric,
> - selected route, * - FIB route, q - queued, r - rejected, b - backup
t - trapped, o - offload failure

B   10.0.8.0/30 [20/0] via 10.0.8.1 inactive, weight 1, 00:00:20
C>* 10.0.8.0/30 is directly connected, Ethernet0, 00:58:55
B>* 10.0.8.4/30 [20/0] via 10.0.8.1, Ethernet0, weight 1, 00:00:15
B>* 10.0.8.8/30 [20/0] via 10.0.8.1, Ethernet0, weight 1, 00:00:11
B>* 10.0.8.12/30 [20/0] via 10.0.8.1, Ethernet0, weight 1, 00:00:07
C>* 10.0.8.16/30 is directly connected, Ethernet4, 00:58:53
C>* 10.0.8.32/30 is directly connected, Ethernet28, 00:58:54
C>* 10.0.8.36/30 is directly connected, Ethernet32, 00:58:53
B>* 10.0.9.1/32 [20/0] via 10.0.8.1, Ethernet0, weight 1, 00:58:00
C>* 10.0.9.3/32 is directly connected, Loopback0, 00:58:54
B>* 10.0.9.7/32 [20/0] via 10.0.8.34, Ethernet28, weight 1, 00:58:34
```
最終的なルーティングテーブルは[show ip route](https://qiita.com/maru-mo/items/08d14f66aef32d334942#show-ip-route)の方に載せています。
後は疎通確認して、pingが通れば構築完了です。

# 疎通確認
疎通確認にはping/tracerouteを使って、VPCSに対して疎通確認を実行します。
## PC1 -> PC3
```text:ping(pc1 to pc3)
PC1> ping 192.168.30.2

84 bytes from 192.168.30.2 icmp_seq=1 ttl=59 time=14.473 ms
84 bytes from 192.168.30.2 icmp_seq=2 ttl=59 time=13.555 ms
84 bytes from 192.168.30.2 icmp_seq=3 ttl=59 time=6.840 ms
84 bytes from 192.168.30.2 icmp_seq=4 ttl=59 time=13.182 ms
84 bytes from 192.168.30.2 icmp_seq=5 ttl=59 time=4.948 ms
```

```text:traceroute(pc1 to pc3)
PC1> trace 192.168.30.2
trace to 192.168.30.2, 8 hops max, press Ctrl+C to stop
 1   192.168.10.1   1.630 ms  1.093 ms  2.070 ms
 2   10.0.9.3   1.669 ms  1.431 ms  1.560 ms
 3   10.0.9.2   2.844 ms  2.865 ms  1.909 ms
 4   10.0.9.5   3.724 ms  2.907 ms  2.310 ms
 5   10.0.9.9   3.487 ms  3.264 ms  2.682 ms
 6   *192.168.30.2   4.186 ms (ICMP type:3, code:3, Destination port unreachable)
```
ping/traceどちらも正しく通っていることが確認できます。

## PC4 -> PC2
```text:ping(pc4 to pc3)
PC4> ping 192.168.20.2

84 bytes from 192.168.20.2 icmp_seq=1 ttl=59 time=5.583 ms
84 bytes from 192.168.20.2 icmp_seq=2 ttl=59 time=20.804 ms
84 bytes from 192.168.20.2 icmp_seq=3 ttl=59 time=7.042 ms
84 bytes from 192.168.20.2 icmp_seq=4 ttl=59 time=9.390 ms
84 bytes from 192.168.20.2 icmp_seq=5 ttl=59 time=4.120 ms
```

```text:traceroute(pc4 to pc2)
PC4> trace 192.168.20.2
trace to 192.168.20.2, 8 hops max, press Ctrl+C to stop
 1   192.168.40.1   0.996 ms  0.524 ms  0.677 ms
 2   10.0.9.6   5.814 ms  0.903 ms  0.826 ms
 3   10.0.9.1   1.836 ms  1.473 ms  1.289 ms
 4   10.0.9.4   3.272 ms  2.389 ms  5.351 ms
 5   10.0.9.8   5.138 ms  3.168 ms  2.776 ms
 6   *192.168.20.2   3.142 ms (ICMP type:3, code:3, Destination port unreachable)
```
こちらの方も、ping/traceどちらも正しく通っていることが確認できます。

以上で構築は完了です！



# 確認用コマンドのチートシート
SONiC内で使用する確認用コマンド
## show ip interfaces
SONiC内のinterface情報(IP, BGP)を確認可能
```text:show ip interfaces
admin@SONiC-ExSW1:~$ show ip interfaces
Interface    Master    IPv4 address/mask    Admin/Oper    BGP Neighbor    Neighbor IP
-----------  --------  -------------------  ------------  --------------  -------------
Ethernet0              192.168.50.2/24      up/up         N/A             N/A
Ethernet4              10.0.8.1/30          up/up         Ex1-Sp1         10.0.8.2
Ethernet8              10.0.8.5/30          up/up         Ex1-Sp2         10.0.8.6
Ethernet12             10.0.8.9/30          up/up         Ex1-Sp3         10.0.8.10
Ethernet16             10.0.8.13/30         up/up         Ex1-Sp4         10.0.8.14
Loopback0              10.0.9.1/32          up/up         N/A             N/A
```

## show interfaces status
interfaceのstatus(主にup, downなど)を確認可能
```text:show interfaces status
admin@SONiC-ExSW1:~$ show interfaces status
  Interface            Lanes    Speed    MTU    FEC           Alias    Vlan    Oper    Admin    Type    Asym PFC
-----------  ---------------  -------  -----  -----  --------------  ------  ------  -------  ------  ----------
  Ethernet0      25,26,27,28      40G   9100    N/A    fortyGigE0/0  routed      up       up     N/A         N/A
  Ethernet4      29,30,31,32      40G   9100    N/A    fortyGigE0/4  routed      up       up     N/A         N/A
  Ethernet8      33,34,35,36      40G   9100    N/A    fortyGigE0/8  routed      up       up     N/A         N/A
 Ethernet12      37,38,39,40      40G   9100    N/A   fortyGigE0/12  routed      up       up     N/A         N/A
 Ethernet16      45,46,47,48      40G   9100    N/A   fortyGigE0/16  routed      up       up     N/A         N/A
 Ethernet20      41,42,43,44      40G   9100    N/A   fortyGigE0/20  routed    down       up     N/A         N/A
 Ethernet24          1,2,3,4      40G   9100    N/A   fortyGigE0/24  routed    down       up     N/A         N/A
 Ethernet28          5,6,7,8      40G   9100    N/A   fortyGigE0/28  routed      up       up     N/A         N/A
 Ethernet32      13,14,15,16      40G   9100    N/A   fortyGigE0/32  routed      up       up     N/A         N/A
 ︙
```

## show ip bgp summary
設定を投入したbgp neighborの情報を確認可能
```text:show ip bgp summary
admin@SONiC-ExSW1:~$ show ip bgp sum

IPv4 Unicast Summary:
BGP router identifier 10.0.9.1, local AS number 65000 vrf-id 0
BGP table version 12
RIB entries 19, using 3496 bytes of memory
Peers 4, using 2963232 KiB of memory
Peer groups 2, using 128 bytes of memory


Neighbhor      V     AS    MsgRcvd    MsgSent    TblVer    InQ    OutQ  Up/Down      State/PfxRcd  NeighborName
-----------  ---  -----  ---------  ---------  --------  -----  ------  ---------  --------------  --------------
10.0.8.2       4  65100         13         13         0      0       0  00:02:02                3  Ex1-Sp1
10.0.8.6       4  65100          9          8         0      0       0  00:00:12                2  Ex1-Sp2
10.0.8.10      4  65200         14         14         0      0       0  00:02:17                3  Ex1-Sp3
10.0.8.14      4  65200         11         11         0      0       0  00:01:49                3  Ex1-Sp4

Total number of neighbors 4
```

## show ip bgp neighbors
各種設定項目(ngibor-IP/AS, local-AS/holdtime/keepalive...)の確認が可能
```text:show ip bgp neighbors
admin@SONiC-ExSW1:~$ show ip bgp neighbors
BGP neighbor is 10.0.8.2, remote AS 65100, local AS 65000, external link
 Description: Ex1-Sp1
 Member of peer-group PEER_V4 for session parameters
  BGP version 4, remote router ID 0.0.0.0, local router ID 10.0.9.1
  BGP state = Active
  Last read 00:39:53, Last write never
  Hold time is 180, keepalive interval is 60 seconds
  ︙
```

## show ip bgp network
bgp周りの設定確認。router-id, local-asNum, networkなどの情報を確認可能。
```text:show ip bgp network
admin@SONiC-ExSW1:~$ show ip bgp network
BGP table version is 12, local router ID is 10.0.9.1, vrf id 0
Default local pref 100, local AS 65000
Status codes:  s suppressed, d damped, h history, * valid, > best, = multipath,
               i internal, r RIB-failure, S Stale, R Removed
Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self
Origin codes:  i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

   Network          Next Hop            Metric LocPrf Weight Path
*> 10.0.9.1/32      0.0.0.0                  0         32768 i
*> 10.0.9.3/32      10.0.8.2                 0             0 65100 i
*> 10.0.9.4/32      10.0.8.6                 0             0 65100 i
*> 10.0.9.5/32      10.0.8.10                0             0 65200 i
*> 10.0.9.6/32      10.0.8.14                0             0 65200 i
*> 10.0.9.7/32      10.0.8.2                               0 65100 65110 i
*= 10.0.9.8/32      10.0.8.6                               0 65100 65110 i
*>                  10.0.8.2                               0 65100 65110 i
*= 10.0.9.9/32      10.0.8.14                              0 65200 65210 i
*>                  10.0.8.10                              0 65200 65210 i
*= 10.0.9.10/32     10.0.8.14                              0 65200 65210 i
*>                  10.0.8.10                              0 65200 65210 i

Displayed  9 routes and 12 total paths
```

## docker container ls -a
SONiCは各モジュールをcontainerで管理しているので、それぞれのcontainerの状態を確認する必要があるので、SONiC内部で動作している各プロセス(container)を確認可能なこのコマンドを使うと良い。
reloadをした後などでinterfaceがなかなか上がってこないときなどは、containerの状況を確認すべき。特に、`swss`はinterfaceを管理しているcontainerっぽいので、`swss`が上がらないと`bgp`も上がってこないはず。
```text:docker container ls -a
admin@SONiC-ExSW1:~$ docker container ls -a
CONTAINER ID   IMAGE                                COMMAND                  CREATED      STATUS          PORTS     NAMES
4de709b79d95   docker-sonic-telemetry:latest        "/usr/local/bin/supe…"   8 days ago   Up 11 minutes             telemetry
23ebfe3caf9d   docker-sonic-mgmt-framework:latest   "/usr/local/bin/supe…"   8 days ago   Up 11 minutes             mgmt-framework
93c2112f109b   docker-snmp:latest                   "/usr/local/bin/supe…"   8 days ago   Up 11 minutes             snmp
a4a2020df5bd   docker-lldp:latest                   "/usr/bin/docker-lld…"   8 days ago   Up 12 minutes             lldp
7f46f29320f2   docker-router-advertiser:latest      "/usr/bin/docker-ini…"   8 days ago   Up 12 minutes             radv
454862eeb103   docker-gbsyncd-vs:latest             "/usr/local/bin/supe…"   8 days ago   Up 12 minutes             gbsyncd
d43e854b1578   docker-syncd-vs:latest               "/usr/local/bin/supe…"   8 days ago   Up 12 minutes             syncd
fb3af6311a42   docker-teamd:latest                  "/usr/local/bin/supe…"   8 days ago   Up 12 minutes             teamd
d85c2a69edfd   docker-orchagent:latest              "/usr/bin/docker-ini…"   8 days ago   Up 12 minutes             swss
960a6af915c9   docker-platform-monitor:latest       "/usr/bin/docker_ini…"   8 days ago   Up 13 minutes             pmon
4f6d72d4cb65   docker-fpm-frr:latest                "/usr/bin/docker_ini…"   8 days ago   Up 13 minutes             bgp
da38cf39aba8   docker-eventd:latest                 "/usr/local/bin/supe…"   8 days ago   Up 13 minutes             eventd
d36c54948bc7   docker-database:latest               "/usr/local/bin/dock…"   8 days ago   Up 14 minutes             database

```
トラブルシューティングとして、特定のプロセスが上がってこなければ、`sudo journalctl`で各プロセスのjournalを確認。

## show ip route
ルーティングテーブルの確認。
```
admin@SONiC-ExSW1:~$ show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR,
       f - OpenFabric,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup
       t - trapped, o - offload failure

C>* 10.0.8.0/30 is directly connected, Ethernet4, 00:47:52
C>* 10.0.8.4/30 is directly connected, Ethernet8, 00:47:50
C>* 10.0.8.8/30 is directly connected, Ethernet12, 00:47:55
C>* 10.0.8.12/30 is directly connected, Ethernet16, 00:47:54
B>* 10.0.8.16/30 [20/0] via 10.0.8.2, Ethernet4, weight 1, 00:10:06
B>* 10.0.8.20/30 [20/0] via 10.0.8.6, Ethernet8, weight 1, 00:08:21
B>* 10.0.8.24/30 [20/0] via 10.0.8.10, Ethernet12, weight 1, 00:06:54
B>* 10.0.8.28/30 [20/0] via 10.0.8.14, Ethernet16, weight 1, 00:05:22
B>* 10.0.8.32/30 [20/0] via 10.0.8.2, Ethernet4, weight 1, 00:10:06
B>* 10.0.8.36/30 [20/0] via 10.0.8.2, Ethernet4, weight 1, 00:10:06
B>* 10.0.8.40/30 [20/0] via 10.0.8.6, Ethernet8, weight 1, 00:08:21
B>* 10.0.8.44/30 [20/0] via 10.0.8.6, Ethernet8, weight 1, 00:08:21
B>* 10.0.8.48/30 [20/0] via 10.0.8.10, Ethernet12, weight 1, 00:06:54
B>* 10.0.8.52/30 [20/0] via 10.0.8.10, Ethernet12, weight 1, 00:06:54
B>* 10.0.8.56/30 [20/0] via 10.0.8.14, Ethernet16, weight 1, 00:05:22
B>* 10.0.8.60/30 [20/0] via 10.0.8.14, Ethernet16, weight 1, 00:05:22
C>* 10.0.9.1/32 is directly connected, Loopback0, 00:48:42
B>* 10.0.9.3/32 [20/0] via 10.0.8.2, Ethernet4, weight 1, 00:46:21
B>* 10.0.9.4/32 [20/0] via 10.0.8.6, Ethernet8, weight 1, 00:44:32
B>* 10.0.9.5/32 [20/0] via 10.0.8.10, Ethernet12, weight 1, 00:46:37
B>* 10.0.9.6/32 [20/0] via 10.0.8.14, Ethernet16, weight 1, 00:46:08
B>* 10.0.9.7/32 [20/0] via 10.0.8.2, Ethernet4, weight 1, 00:46:21
B>* 10.0.9.8/32 [20/0] via 10.0.8.2, Ethernet4, weight 1, 00:44:32
  *                    via 10.0.8.6, Ethernet8, weight 1, 00:44:32
B>* 10.0.9.9/32 [20/0] via 10.0.8.10, Ethernet12, weight 1, 00:46:08
  *                    via 10.0.8.14, Ethernet16, weight 1, 00:46:08
B>* 10.0.9.10/32 [20/0] via 10.0.8.10, Ethernet12, weight 1, 00:46:08
  *                     via 10.0.8.14, Ethernet16, weight 1, 00:46:08
B>* 192.168.10.0/24 [20/0] via 10.0.8.2, Ethernet4, weight 1, 00:25:57
B>* 192.168.20.0/24 [20/0] via 10.0.8.2, Ethernet4, weight 1, 00:13:17
  *                        via 10.0.8.6, Ethernet8, weight 1, 00:13:17
B>* 192.168.30.0/24 [20/0] via 10.0.8.10, Ethernet12, weight 1, 00:11:59
  *                        via 10.0.8.14, Ethernet16, weight 1, 00:11:59
B>* 192.168.40.0/24 [20/0] via 10.0.8.10, Ethernet12, weight 1, 00:10:50
  *                        via 10.0.8.14, Ethernet16, weight 1, 00:10:50
C>* 192.168.50.0/24 is directly connected, Ethernet0, 00:47:55
```

# 躓いた点
* 各パラメータの設定ミス
自分で定義しておきながら、AS番号を間違って設定していたり、GNS3で結線したポートとは違うinterfaceにアドレスを設定したりしていました。そのため、neighborが確立されなかったり、arp要求が溢れていたりして、特定に結構時間がかかりました。トラブルシューティング時の原因のほとんどがヒューマンエラーだったので、コマンドを発行前に入念にチェックすべきだと身にしみて感じました。。
* コンポーネント故障による問題の特定
リソースがそこまで潤沢に与えられていなかったので、頻繁にノードが落ちてコンポーネントが故障してしまったりしてしまっていて、ヒューマンエラーなのかコンポーネントの故障なのかの問題の特定に時間がかかりました。


# おわりに
今回は、2rack/3layerのClosNWをSONiCでGNS3上に構築しました。
全てのノードに対して、設定ファイルを手書きで入力したので結構時間がかかりました。
今後は、Ansibleなどの構成管理ツールを使ってそこら辺を自動化したいなあと考え中です。
あと、GNS3を使うのではなくて、vbox上で各ノードを立ててk8sクラスタを組んで、フォールトトレラントとスケーラビリティを向上させた環境の構築が出来れば良いなあとも思っています。今の環境だと、リソースが固定化されているため、メモリがギリギリ(構築中に最大40G割り当てで90%くらいまで上昇)になったり、ノードのコンポーネントが壊れたりしているので、そういった改善も必要だと思っています。


# 参考
[sonic-net/SONiC Wiki](https://github.com/sonic-net/SONiC/wiki)
[GNS3でSONiCを使う](https://qiita.com/masru0714/items/1ef92db005a372ae5ea5)
[SONiCをはじめてみよう](https://speakerdeck.com/imasaruoki/sonicwohazimetemiyou)