BGPでジェンガしてみる3(崩し編)

## 概要
BGP設定がうまくいかないときの検証です。

前回の最小設定編では、BGPを最小の設定コマンドで接続しました。
今回の崩し編では、さらにコマンドを削除していきdebugやshowコマンドを確認します。

https://qiita.com/k_kuri/items/f511e6db508cad4a0306


**設定コマンドと用途**

|コマンド|用途| 
|-------|----|
|router bgp|ルータプロセスと、ルータが属するAS番号を定義する|
|remote-as|BGPネイバを形成する|
|ebgp-multihop|直接接続されていない2つのネットワークを接続する|
|update-source|BGP接続の送信元を指定する|
|next-hop-self|ネクストホップを自身のアドレスに設定する|

**おもな確認コマンドと用途**
|コマンド|用途| 
|-------|----|
|#show ip bgp all summary|BGP接続の確認　State/PfxRcd が数字であればOK|
|#show tcp|TCP接続の確認　Connection state is ESTABであればOK|
|#show ip bgp|BGPテーブルの確認|
|#show ip route *A.B.C.D*|*A.B.C.D*宛てルートの確認|
|#debug ip bgp all|BGP接続のデバッグ|
|#debug ip tcp transactions|TCP接続のデバッグ|

## 構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/e0eb541e-58d8-88a5-08ee-a499adccdf2e.png)


**各区間の設定**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/4deb4e55-1ad9-5811-f648-0add69d4b0aa.png)
補足
・IBGP区間はIF単位でospfを設定しています
・IBGP区間はフルメッシュでBGP接続しています
・各ルータのL0,L1アドレスはBGPの**network**コマンドでアドバタイズしています

## 作戦
以下の順番で崩していきます。
　①R2のR1向け**next-hop-self**を削除
　②R3のR5向け**ebgp-multihop**を削除
　③R1とR3の**update-source**を削除
　④R4の**remote-as**を間違える
　⑤R4の**remote-as**を削除
　⑥R4の**router bgp**を削除

(①はジェンガの上の方、④⑤⑥は下の方です)
各項番、崩した後は設定を戻します。

**では、崩していきます。**

##  ①R2のR1向け**next-hop-self**を削除
**next-hop-self**はBGP接続後のネットワークアドバタイズに関わるコマンドなので、BGPは接続されたままpingが失敗する想定です。

R1向けを削除します。
**R2(config-router)#no  neighbor 1.1.1.1 next-hop-self**

BGP接続は切断されていません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/455d4537-bb1e-c4b7-9105-24c0ff29188b.png)

外部AS40のネットワーク4.4.4.4/21と40.0.0.0/24のネクストホップを確認します。
削除前のR2のL0アドレス2.2.2から、削除後はR4のGi0/2のアドレス24.0.0.4に変更されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/f6eff163-95c5-80b8-0773-c8b14e6e4705.png)

R1はネクストホップ24.0.0.4のルート情報を持たないため、4.4.4.4にpingが届かなくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/2902bfc8-2e9d-1297-95e5-9cab2cadc5d0.png)

R5→R4向けのpingはR1で止まってしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/5b93e193-137d-7cca-4c79-87210c42d4ca.png)

## ②R3のR5向け**ebgp-multihop**を削除
**ebgp-multi-hop**はLoopbackでEBGPを接続するときに、TTLを増やしてパケットを廃棄しないようにするコマンドです。TCP接続できなくなるため、BGPも確立できなくなる想定です。

R3の設定を削除します。
**R3(config-router)#no  neighbor 50.0.0.1 ebgp-multihop 2**

BGPがIdleになっています。
TCP状態を確認すると、R3のTTLが1に変更されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/a14773c0-5e06-f868-fb8f-234a4a41d1e8.png)
少しすると**show tcp**が表示されなくなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/eb98a3ee-97a3-e365-6689-4dff92749e9a.png)


**debug ip bgp all**を確認します。
R3は50.0.0.1へのルートがなくなっています。
R5はIdleとActiveを繰り返しているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/ab7a2714-928e-cfd4-aef6-c28cea0424b5.png)

R3の設定を削除したままR5も削除すると、両方"no route to peer"になりました。

## ③R1とR3の**update-source**を削除
送信元の指定がneighborコマンドの指定とミスマッチになるので、BGPは切断される想定です。

**R1(config-router)#no neighbor 3.3.3.3 update-source l0**
**R3(config-router)#no neighbor 1.1.1.1 update-source l0**

BGPの接続が切断されました。**show tcp**は表示されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/b77561a0-19c0-51ac-0a73-087f6b17b8f6.png)

**debug ip bgp all**を確認すると、IdleとActiveを繰り返していることがわかります。
local addressが物理IFのアドレスになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/68c4bd2b-e358-6354-1efb-8b7ce6a6abb9.png)

**debug ip tcp transactions**を確認します。
RST to 物理IF from Loopbackとなっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/64969cc8-52cd-422f-7031-a89e1819a90f.png)

**show tcp**のLocal host=debugのfrom(送信元)、Foreign host=to(宛先)に対応しているみたいです。
削除後は物理IFが宛先になってしまっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/f4ccb27f-b3fc-109d-404f-12f8660ec2bf.png)

R1を例に考えると
・update-source L0を指定した場合
　R1が送信元として1.1.1.1を通知する(update-source L0)ので、R3は宛先が1.1.1.1と認識する
・指定しない場合
　R1が送信元としてデフォルトの物理IFアドレスを通知するので、R3は宛先が13.0.0.1(R1 Gi0/1)と認識する
ということかなと思います。

(片方削除でBGPがdownしなかったのですが、このへんが関係している???)

## ④R4のremote-asを間違える
:::note alert
マネしないでください
:::

大量にメッセージが出力されて収拾つかなくなった場合、ネイバからshutdownすることで止まります。
**R2#conf t**
**R2(config)#router bgp 10**
**R2(config-router)#neighbor 24.0.0.4 shut**
**R2(config-router)#**
##

では、間違ったAS番号に変更してみます。

R4の**remote-as**を10→100に変更します。
**R4(config)#router bgp 40**
**R4(config-router)#neighbor 24.0.0.2 remote-as 100**
**R4(config-router)#**

削除後、ASが間違っているというNotificationメッセージが出力されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/e8a84c56-9ed2-d669-02dc-a0e555853f8a.png)

**debug ip bgp all**を確認します。
大量に出力されて見づらいので、エクセルにコピペして"from"でフィルタしました。
R2はOpenConfirmまで遷移してIdleに戻っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/f42654c0-49fb-c800-4502-5c3658dc2436.png)
R4はremote host(R2)に拒否されています。
その後、OPENメッセージが表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/5af1cb3e-14a6-487b-25da-f84578e8b604.png)
ACTIVE=TCPが接続できていないはずなのにBGPのOPENメッセージ？と思いますが、読み解けなくてわかりません..

**debug ip tcp translations**の出力です。"state"でフィルタしています。
一応Establishedになっていますが、debug出力は止まらなかったです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/f2072ae4-91bf-8645-0600-153848b84b37.png)

debugは見づらいだけでよくわからなかったです。
削除後のメッセージpeer in wrong ASがわかりやすいヒントでした。

## ⑤R4のremote-asを削除

**R4(config-router)#no neighbor 24.0.0.2 remote-as 10**

削除後、peerの設定がなくなったというNotificationメッセージが表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/5632d37a-6b44-a3e2-9baa-e682cdcd026b.png)


R2のBGPがIdleになっています。
R4は**sh ip bgp all sum**も**sh tcp**も表示されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/4ad8ecba-59f8-14c8-c5de-755190595b57.png)

R2はIdleとActiveを繰り返しています。remote host(R4)に拒否されているようです。
R4は出力されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/f4218ee2-3b63-c1f6-b42a-57ddf24d590e.png)

TCPはお互い接続しようとしているみたいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/1b355411-d8ea-33d5-7913-b6c53bdf6874.png)

## ⑥R4のrouter bgpを削除
**R4(config-router)#no router bgp 40**

R2側でR4がBGPセッションを終了したメッセージが表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/7ede936e-b459-831e-f60e-a6c97ca95b1b.png)

R4はBGPの設定が入っていないという表示になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/99652eb0-08b4-fe00-7819-088eb4642ccf.png)

BGPの設定コマンドがすべて消去されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/b7446999-de3d-5f90-bbaa-16ff59c6ef42.png)

R4の**debug ip bgp all**は出力されませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/9e031788-86e8-50b4-6e10-7a26bf3e98d3.png)
remot-as削除と同様、TCPは接続しようとしているみたいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/92c6b96f-6143-ff3e-8ef9-70a9f8f350d3.png)
R2側のneighborを削除することでTCPのdebugは止まりました。

## まとめ
①R2のR1向けnext-hop-selfを削除
・BGPは切断されない
・BGPテーブルに宛先は残るがneighborのネクストホップが書き換わる

②R3のR5向けebgp-multihopを削除
・BGPは切断される
・設定削除した側のdebug ip bgp allで切断の原因がno route to peerとわかる

③R1とR3のupdate-sourceを削除
・BGPは切断される
・お互いのdebugを見比べると、送信元と宛先のミスマッチで切断されたと推測できる

④R4のremote-asを間違える
・すぐにBGPが切断されてNotificationメッセージが出力される
・Notificatioinメッセージにpeer in wrong ASの表示
・debug ip bgp allのConnection refusedから、remote hostが接続を拒否しているとわかる

⑤R4のremote-asを削除
・すぐにBGPが切断されてNotificationメッセージが出力される
・NotificationメッセージにPeer De-configuredの表示
・debug ip bgp allのConnection refusedから、remote hostが接続を拒否しているとわかる

⑥R4のrouter bgpを削除
・すぐにBGPが切断されて、相手側でセッション終了のメッセージが表示される
・設定していたBGPコマンドがすべて消去される


## 学んだこと
・BGP接続が確立できないときはTCPの送信元と宛先を確認する
　・Notificationメッセージが表示されないときは、debugコマンドで確認(②③)
　・メッセージが表示されたときは、メッセージから原因がわかる(④⑤⑥)

debugコマンドをちゃんと見ることがあまりなかったので勉強になりました！

## 参考
【Cisco】
Border Gateway Protocol(BGP)ケーススタディの確認
https://www.cisco.com/c/ja_jp/support/docs/ip/border-gateway-protocol-bgp/26634-bgp-toc.html

BGP ネイバーがアイドル状態、接続状態、アクティブ状態間でトグルする理由
https://www.cisco.com/c/ja_jp/support/docs/ip/border-gateway-protocol-bgp/13752-24.html

Cisco IOS IP Routing: BGP Command Reference
https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/iproute_bgp/command/irg-cr-book/bgp-m1.html

【ネットワークエンジニアとして】
BGP - Neighbor
https://www.infraexpert.com/study/bgpz02.html

BGP - loopback I/F IBGP / EBGP
https://www.infraexpert.com/study/bgpz08.html

【RFC】
TCP Connection State Diagram　Figure 6.
https://datatracker.ietf.org/doc/html/rfc793

【書籍】
『Routing TCP/IP, Volume II: CCIE Professional Development, 2nd Edition』
https://www.ciscopress.com/store/routing-tcp-ip-volume-ii-ccie-professional-development-9781587054709

【その他】
https://www.universal-music.co.jp/yaida-hitomi/products/toct-22226/



**お読みいただいた方、ありがとうございます。**