概要
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接続のデバッグ |
参考にしたサイト
構成
前提
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区間はフルメッシュで接続しています。
各ルータの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接続できているか確かめます。
では、各区間の設定を修正していきます。
原因 EBGP(物理IF-物理IF)区間
#debug ip bgp allで接続できない原因を特定します。
出力結果から
・TCB(TCP Connection Block)が使用できない
・状態遷移がActiveで止まってIdleに戻っている
ことがわかります。
ActiveはTCP接続できていない状態なので、TCPに原因がありそうです。
debug出力をエクセルにコピペして"from"でフィルタしてみます。
Active-Idle-Active-Idle...を繰り返していることがわかります。
#debug ip tcp transactionsでTCP接続の詳細を確認します。
出力結果から
・Loopback0のIPアドレスに対してリセット(RST)されている
・[0 -> UNKNOWN(0)] ポート番号と宛先IPアドレスが特定できていない
ことがわかります。
Loopback0がなにかしているみたいです。
#show tcpでも状態を確認します。
TCP送信元のLocal hostがLoopback0のIPアドレスになっています。
修正 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
ちなみにR2のみ修正した段階でR2側のTCPは確立できていたようです。
TCP確立後にBGPのOPENメッセージを送る"OpenSent"まで遷移してIdleに戻っていました。
原因 EBGP(Lo-Lo)区間①
次はEBGPのLoopback接続区間です。
#debug ip bgp allで接続できない原因を特定します。
修正 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)区間②
EBGP(物理IF-物理IF)と同様で、TCP接続が原因のようです。
#show tcpで状態を確認します。
update-sourceによってLocal hostがLoopback0のアドレスになっています。
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
修正 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
まとめ
よく見るコマンド(ebgp, update, next-hop-self)はすべて投入してもBGP接続を確立できます。
ただし、update-sourceのIF指定はいつもL0ではなく、状況に応じて修正してあげる必要があります。
学んだこと
・TCPが確立できない場合、BGPの状態はActive-Idleを繰り返す
・BGPがうまく設定できない原因がIPかTCPかは#debug ip bgp allで確認できる
→IPの場合は静かにno route、TCPの場合はBGP状態遷移のどこで止まっているか出力される
・update-sourceは物理IFも指定できる
次回はこの状態から設定を削除して最小にしていきます!