BGPでジェンガしてみる1(構築編)

## 概要
BGPの設定コマンドについての検証です。
BGPとは、ネットワークの自律システム(AS)内外を接続するプロトコルです。
自律システム内か外かで必要な設定が変わってきますが、コマンドの使いどころを理解していないとうまく設定できなくて悩んでしまいます。

今回、必要な設定と不要だけど影響のない設定を理解するために検証を行いました。
検証にあたっては、基本的な設定を投入して動作することを確認し、不要な設定を削除して最小にしていく方法をとりました。(ジェンガみたい！)

構築編では、できるだけ削らないように基本的な設定を投入していきます。

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

|コマンド|用途| 
|-------|----|
|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|
|#debug ip bgp all|BGP接続のデバッグ|
|#debug ip tcp transactions|TCP接続のデバッグ|



**参考にしたサイト**

https://www.cisco.com/c/ja_jp/support/docs/ip/border-gateway-protocol-bgp/26634-bgp-toc.html

https://www.cisco.com/c/ja_jp/support/docs/ip/border-gateway-protocol-bgp/13752-24.html

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

## 前提
IBGP区間にはIF単位でospfを設定します。
ospfを設定するIF
　R1: Gi0/0, Gi0/1, L0
　R2: Gi0/0, L0
　R3: Gi0/1, L0

Loopback0をospfに参加させる理由は、BGP設定の送信元と宛先としてLoopback0を使用するためです。
BGPで接続するためには、IP到達性が確保されている=#show ip routeにアドレスが表示されている必要があります。

検証でも以下2点がポイントになるかなと思います。
・IP到達性が確保されているか
・TCP接続が確立できているか

## 設定　とりあえずよく見るコマンドをいれてみる
各ルータにBGP設定コマンドを投入します。
まずはR1,R2,R3,R4,R5すべてに同じ設定を投入してみます。

**コマンド**
 router bgp *XX*
 neighbor *A.B.C.D* remote-as *YY*
 neighbor *A.B.C.D* ebgp-multihop 2
 neighbor *A.B.C.D* update-source Loopback0
 neighbor *A.B.C.D* next-hop-self

**各区間の設定**
省略していますが、IBGP区間はフルメッシュで接続しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/22e58fdd-9e52-a18c-4c46-6780fc38b477.png)

**各ルータのBGP設定例**
【IBGP(Loopback)区間】
例:R1
router bgp 10
 bgp log-neighbor-changes
 neighbor 2.2.2.2 remote-as 10
 neighbor 2.2.2.2 ebgp-multihop 2
 neighbor 2.2.2.2 update-source Loopback0
 neighbor 2.2.2.2 next-hop-self
 neighbor 3.3.3.3 remote-as 10
 neighbor 3.3.3.3 ebgp-multihop 2
 neighbor 3.3.3.3 update-source Loopback0
 neighbor 3.3.3.3 next-hop-self

【EBGP (物理IF-物理IF)区間】
例:R4
router bgp 40
 bgp log-neighbor-changes
 neighbor 24.0.0.2 remote-as 10
 neighbor 24.0.0.2 ebgp-multihop 2
 neighbor 24.0.0.2 update-source Loopback0
 neighbor 24.0.0.2 next-hop-self

【IBGP(Lo-Lo)区間】
例:R5
router bgp 50
 bgp log-neighbor-changes
 neighbor 30.0.0.1 remote-as 10
 neighbor 30.0.0.1 ebgp-multihop 2
 neighbor 30.0.0.1 update-source Loopback0
 neighbor 30.0.0.1 next-hop-self

## 確認
BGP接続できているか確かめます。

IBGP(Loopback)区間は接続できています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/f3a465b1-b621-7146-96b0-dce07dee684a.png)

EBGP(物理IF-物理IF)区間は接続できていません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/bc4146cb-e567-2b26-9c72-67e98e3a097a.png)

EBGP(Lo-Lo)区間も接続できていません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/c0fac0d7-d66e-3921-01d3-630a1aec206c.png)

## 
**では、各区間の設定を修正していきます。**

## 原因　EBGP(物理IF-物理IF)区間
**#debug ip bgp all**で接続できない原因を特定します。

出力結果から
・TCB(TCP Connection Block)が使用できない
・状態遷移がActiveで止まってIdleに戻っている
ことがわかります。
ActiveはTCP接続できていない状態なので、TCPに原因がありそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/ebb3afac-20db-26b1-0e1d-3e7646e717bf.png)

debug出力をエクセルにコピペして"from"でフィルタしてみます。
Active-Idle-Active-Idle...を繰り返していることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/2e33c800-c952-5a50-1772-a4cccf2f8812.png)

**#debug ip tcp transactions**でTCP接続の詳細を確認します。

出力結果から
・Loopback0のIPアドレスに対してリセット(RST)されている
・[0 -> UNKNOWN(0)]　ポート番号と宛先IPアドレスが特定できていない
ことがわかります。
Loopback0がなにかしているみたいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/d79c8ea5-14bb-e46b-7dd1-9d4c2cdaa69c.png)

**#show tcp**でも状態を確認します。
TCP送信元のLocal hostがLoopback0のIPアドレスになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/cbd49870-5a77-430a-f2cd-9871a33c18f4.png)

## 修正　EBGP(物理IF-物理IF)区間
neighborは正しく物理IFを指定しているので、BGP接続の送信元を指定する**update-source**の設定が原因です。

update-sourceをLoopback0から物理IFに修正します。
**R2(config-router)#neighbor 24.0.0.4 update-source GigabitEthernet0/2**
**R4(config-router)#neighbor 24.0.0.2 update-source GigabitEthernet0/2**

BGP接続できました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/9c5d3821-e9bb-ee28-de2e-0ca59f01aad3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/0cf4e9ac-3f53-1622-beab-5a64994a946a.png)

ちなみにR2のみ修正した段階でR2側のTCPは確立できていたようです。
TCP確立後にBGPのOPENメッセージを送る"OpenSent"まで遷移してIdleに戻っていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/19e54ea1-58e2-59d5-1f10-169fde4ade17.png)


## 原因　EBGP(Lo-Lo)区間①
次はEBGPのLoopback接続区間です。
**#debug ip bgp all**で接続できない原因を特定します。

宛先へのルート情報がないことがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/d37dc92c-a8a1-db1f-86d9-dc9ffe7f49c4.png)

**#show tcp**の出力がありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/6ba16bbb-5f90-2094-1727-c7f1222004a9.png)

## 修正　EBGP(Lo-Lo)区間①
原因はR3とR5にIP到達性がないことのようです。

R3とR5にstatic routeを追加します。
**R3(config)# ip route 50.0.0.0 255.255.255.0 35.0.0.5**
**R5(config)# ip route 30.0.0.0 255.255.255.0 35.0.0.3**

...がまだBGPはupしません。

## 原因　EBGP(Lo-Lo)区間②
**#debug ip bgp all**を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/b49f6208-626a-7097-c91e-06244f93d97a.png)

EBGP(物理IF-物理IF)と同様で、TCP接続が原因のようです。

**#show tcp**で状態を確認します。
**update-source**によってLocal hostがLoopback0のアドレスになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/f81169be-30b6-d5ef-299e-3d6e153227fe.png)

R3-R5のneighborはLoopback0ではなく、Loopback1を設定しています。
>例:R5
router bgp 50
 bgp log-neighbor-changes
 neighbor 30.0.0.1 remote-as 10
 neighbor 30.0.0.1 ebgp-multihop 2
 neighbor 30.0.0.1 update-source Loopback0
 neighbor 30.0.0.1 next-hop-self

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/bbc4d867-c031-b72a-ae89-13a882b352b0.png)

## 修正　EBGP(Lo-Lo)区間②
**update-source**をLoopback0からLoopback1に修正します。

**R3(config-router)#neighbor 50.0.0.1 update-source Loopback1**
**R5(config-router)#neighbor 30.0.0.1 update-source Loopback1**

BGP接続できました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/6a0b6114-a436-573c-5a7a-8de0f59694d6.png)
    
## まとめ
よく見るコマンド(ebgp, update, next-hop-self)はすべて投入してもBGP接続を確立できます。
ただし、update-sourceのIF指定はいつもL0ではなく、状況に応じて修正してあげる必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122841/1895d652-2352-3aa8-d336-4731a564eb2c.png)

## 学んだこと
・TCPが確立できない場合、BGPの状態はActive-Idleを繰り返す
・BGPがうまく設定できない原因がIPかTCPかは#debug ip bgp allで確認できる
　→IPの場合は静かにno route、TCPの場合はBGP状態遷移のどこで止まっているか出力される
・update-sourceは物理IFも指定できる

次回はこの状態から設定を削除して最小にしていきます！

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