BGPの冗長構成（MED、Local-Preference）

## BGPの冗長構成の設計
[前回の記事](https://qiita.com/coco0922/items/bca5ead860b6f9e58979)のLocal-Preference、AS PATH Prependを使った冗長構成からAS PATH Prependを外して、MEDを使った制御に変えた構成で検証しました。

## 物理構成図
![image.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533510/2efda224-c3d1-bfd2-f32f-5c1ee6918ab8.jpeg)

環境はCMLで以下のように構成しています。
CSR1000-V（ルータ）×6
Alpine Linux（デスクトップ）×2
※CMLはネットワーク機器のシミュレートをするサービスでCisco社が有償で提供しています。

スタブASであるRT1、RT6の先には、PCを設置します。
PC1（10.1.0.1/24）
PC2（10.2.0.1/24）

## 本構成で実現したいこと
①RT1→RT2→RT4→RT6の経路を主系とする
②主系障害時は従系に回り込んだ後、主系側の経路に戻る

BGPはパスアトリビュートを設定することで柔軟に経路を調節できます。
今回は①の要件を MED、②の要件をローカルプリファレンスで実現するようにしてみました。
※②の要件については[前回の記事](https://qiita.com/coco0922/items/bca5ead860b6f9e58979)で設定した内容と同様ですので、本記事では省略しております。

## ①RT1→RT2→RT4→RT6の経路を主系とする
![image.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533510/e5b6a0c4-1d42-462b-f8b9-a5f65018af22.jpeg)

**MED**
主系側のMED値を低くして、主系側の経路を優先させる。
![image.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533510/d7f876be-007a-4c13-a58e-a15d03359c42.jpeg)


## 基本的なBGPの設定
CMLでは下記のような画面になっています。
※desktop-0をPC1、desktop-1をPC2として設定しています。
![image.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533510/1d2198fc-c0df-650f-c612-5c35306c6ee1.jpeg)

基本的な設定については[前回の記事](https://qiita.com/coco0922/items/bca5ead860b6f9e58979)で、具体的なコンフィグを記載しています。
前回は、AS_PATHでeBGP、LOCAL_PREFでiBGP間の経路を調整していました。
## ①の要件を満たす設定
①の要件は、RT1→RT2→RT4→RT6の経路を主系とすることです。
今回は主系側の経路のMEDの値を従系側より**低く**して主系側の優先度を高くすることで実現します。
![image.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533510/d32515b8-f757-b039-c6b2-fd4c10fbed17.jpeg)


```:RT2
RT2(config)# access-list 1 permit 10.1.0.0 0.0.0.255
RT2(config)# access-list 2 permit 10.2.0.0 0.0.0.255
RT2(config)# route-map PC1-subnet-MED permit 10
RT2(config-route-map)# match ip address 1
RT2(config-route-map)# set metric 10
RT2(config-route-map)# exit
RT2(config)# route-map PC1-subnet-MED permit 20
RT2(config-route-map)# exit
RT2(config)# route-map PC2-subnet-MED permit 10
RT2(config-route-map)# match ip address 2
RT2(config-route-map)# set metric 10
RT2(config-route-map)# exit
RT2(config)# route-map PC2-subnet-MED permit 20
RT2(config-route-map)# exit
RT2(config)# router bgp 200 
RT2(config-router)# neighbor 10.10.1.1 route-map PC2-subnet-MED out
RT2(config-router)# neighbor 10.30.1.2 route-map PC1-subnet-MED out
```
```:RT3
RT3(config)# access-list 1 permit 10.1.0.0 0.0.0.255
RT3(config)# access-list 2 permit 10.2.0.0 0.0.0.255
RT3(config)# route-map PC1-subnet-MED permit 10
RT3(config-route-map)# match ip address 1
RT3(config-route-map)# set metric 20
RT3(config-route-map)# exit
RT3(config)# route-map PC1-subnet-MED permit 20
RT3(config-route-map)# exit
RT3(config)# route-map PC2-subnet-MED permit 10
RT3(config-route-map)# match ip address 2
RT3(config-route-map)# set metric 20
RT3(config-route-map)# exit
RT3(config)# route-map PC2-subnet-MED permit 20
RT3(config-route-map)# exit
RT3(config)# router bgp 200 
RT3(config-router)# neighbor 10.10.2.1 route-map PC2-subnet-MED out
RT3(config-router)# neighbor 10.30.2.2 route-map PC1-subnet-MED out
```
```:RT4
RT4(config)# access-list 1 permit 10.1.0.0 0.0.0.255
RT4(config)# access-list 2 permit 10.2.0.0 0.0.0.255
RT4(config)# route-map PC1-subnet-MED permit 10
RT4(config-route-map)# match ip address 1
RT4(config-route-map)# set metric 10
RT4(config-route-map)# exit
RT4(config)# route-map PC1-subnet-MED permit 20
RT4(config-route-map)# exit
RT4(config)# route-map PC2-subnet-MED permit 10
RT4(config-route-map)# match ip address 2
RT4(config-route-map)# set metric 10
RT4(config-route-map)# exit
RT4(config)# route-map PC2-subnet-MED permit 20
RT4(config-route-map)# exit
RT4(config)# router bgp 300 
RT4(config-router)# neighbor 10.30.1.1 route-map PC2-subnet-MED out
RT4(config-router)# neighbor 10.50.1.2 route-map PC1-subnet-MED out
```
```:RT5
RT5(config)# access-list 1 permit 10.1.0.0 0.0.0.255
RT5(config)# access-list 2 permit 10.2.0.0 0.0.0.255
RT5(config)# route-map PC1-subnet-MED permit 10
RT5(config-route-map)# match ip address 1
RT5(config-route-map)# set metric 20
RT5(config-route-map)# exit
RT5(config)# route-map PC1-subnet-MED permit 20
RT5(config-route-map)# exit
RT5(config)# route-map PC2-subnet-MED permit 10
RT5(config-route-map)# match ip address 2
RT5(config-route-map)# set metric 20
RT5(config-route-map)# exit
RT5(config)# route-map PC2-subnet-MED permit 20
RT5(config-route-map)# exit
RT5(config)# router bgp 200 
RT5(config-router)# neighbor 10.30.2.1 route-map PC2-subnet-MED out
RT5(config-router)# neighbor 10.50.2.2 route-map PC1-subnet-MED out
```




## ②の要件を満たす設計
![image.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533510/8391b7f5-df8e-19f9-737a-e3868ffe70ed.jpeg)
②の要件は、主系障害時は従系に回り込んだ後、主系側の経路に戻るようにすることです。

②の要件を満たす設定は、[前回の記事](https://qiita.com/coco0922/items/bca5ead860b6f9e58979)で具体的なコンフィグを記載しています。
アトリビュートの変更をしていないデフォルトの状態のBGPでは、eBGP経路で受信した経路情報はiBGPで受信した経路情報よりも優先されてしまい、今回の構成では主系側の障害で従系側に通信が迂回すると、そのまま従系側の経路のまま、宛先へ転送してしまいます。
渡りから主系側に戻るような通信するためには、宛先経路に対するLocal-Preferenceの値を主系側で高くします。
|優先度 |内容|
|:--|:--|
|1|WEIGHTアトリビュートが最も大きいルート
|2|<font color="red">**LOCAL_PREFアトリビュートが最も大きいルート**</font>
|3|ネットワークコマンドで生成したルート
|4|AS_PATHアトリビュートが最も短いルート
|5|ORIGINアトリビュートが最も小さいルート
|6|<font color="red">**MEDアトリビュートが最も小さいルート**
|7|<font color="red">**IBGPで学習したルート<EBGPで学習したルート**
|8|ネクストホップに対して最小のIGPメトリックを持つルート
|9|EBGPネイバーから受信したルートのうち最も古いルート
|10|ルータIDが最小のBGPピアから受信したルート
|11|BGPピアのIPアドレスが最小のルート

## 検証

上記の設定を行い、①、②の要件を満たしているか検証します。
```:PC1
PC1:/home/cisco# traceroute 10.2.0.1
traceroute to 10.2.0.1 (10.2.0.1), 30 hops max, 46 byte packets
 1  10.1.0.254 (10.1.0.254)  0.672 ms  0.528 ms  0.585 ms
 2  10.10.2.2 (10.10.2.2)  1.950 ms  2.800 ms  1.055 ms
 3  10.20.0.1 (10.20.0.1)  1.005 ms  1.539 ms  0.958 ms
 4  10.30.1.2 (10.30.1.2)  1.211 ms  2.248 ms  1.368 ms
 5  10.50.1.2 (10.50.1.2)  2.076 ms  4.027 ms  2.131 ms
 6  10.2.0.1 (10.2.0.1)  3.217 ms  3.656 ms  2.450 ms
```
PC1→PC2の通信が主系側の経路を通っていることがわかります。
次に、RT2-RT4間のインターフェースを落としてみます。
```:RT1
 PC1:/home/cisco# traceroute 10.2.0.1
traceroute to 10.2.0.1 (10.2.0.1), 30 hops max, 46 byte packets
 1  10.1.0.254 (10.1.0.254)  0.722 ms  0.719 ms  0.395 ms
 2  10.10.1.2 (10.10.1.2)  0.972 ms  1.132 ms  0.634 ms
 3  10.20.0.2 (10.20.0.2)  1.263 ms  1.598 ms  1.121 ms
 4  10.30.2.2 (10.30.2.2)  1.491 ms  2.014 ms  1.432 ms
 5  10.40.0.1 (10.40.0.1)  1.743 ms  4.119 ms  2.010 ms
 6  10.50.1.2 (10.50.1.2)  2.099 ms  2.951 ms  2.211 ms
 7  10.2.0.1 (10.2.0.1)  2.652 ms  4.670 ms  2.956 ms
```
```:PC2
PC2:/home/cisco# traceroute 10.1.0.1
traceroute to 10.1.0.1 (10.1.0.1), 30 hops max, 46 byte packets
 1  10.2.0.254 (10.2.0.254)  0.642 ms  0.602 ms  0.533 ms
 2  10.50.1.1 (10.50.1.1)  0.983 ms  0.992 ms  0.579 ms
 3  10.40.0.2 (10.40.0.2)  1.368 ms  1.470 ms  1.039 ms
 4  10.30.2.1 (10.30.2.1)  1.687 ms  2.875 ms  1.434 ms
 5  10.20.0.1 (10.20.0.1)  2.372 ms  2.403 ms  2.097 ms
 6  10.10.1.1 (10.10.1.1)  2.437 ms  2.953 ms  2.640 ms
 7  10.1.0.1 (10.1.0.1)  2.490 ms  3.477 ms  2.686 ms
 ```
PC1→PC2の通信でRT2-RT4間に障害が発生したため、RT2がRT3に転送し、従系側に迂回します。その後にRT5で渡りを通って主系側であるRT4に戻って通信しているので要件を達成できていることがわかります。PC2→PC1でも同じ経路を使って通信できているので、非対称通信になっていないことが確認できます。