BGP
前回BGPを学ぶ前にASについて確認した。
ASを頭に入れた上でBGPとはなんなのかを確認していく。
プロトコルとしてのBGP
前回のページでも確認したが、BGPはEGPに属する経路交換プロトコル。
ASという組織が管理する範囲と範囲を繋ぐ役割を持つ。
BGPはパスベクタ型プロトコルに分類され、宛先までの経路情報に経由したAS番号をリストとして持つ。(Path attribute)
このパス情報でルーティングループを検知して防止することも可能になっている。
BGPはTCPを使用しており、ポート番号は179で動作する。
TCPで動作することから信頼性はトランスポート層で確保される。
iBGPとeBGP
BGPにはAS内でBGP経路伝搬に使われるiBGPとAS間で経路伝搬するeBGPが存在する。
eBGPはTTLが1であるため基本的に直接接続だが、どうしても難しい場合、
特別なコマンドを使えばマルチホップでneighborを張ることも可能。
また、iBGPはTTLは255であり、IP到達性があればneighborを確立できる。
Interfaceの安定性
IP到達性があればneighborを確立出来るが、宛先をInterfaceのIPアドレスにした場合、
リンクのアップダウンにより影響を受ける。iBGPではLoopbackを宛先にすることで
障害を回避することができるらしい。
BGPの確立
Wiresharkの新しいバージョンにはパケットダイアグラムがあるのでそれを使って確認してみる。
このような構成でAS1のvIOS1にてキャプチャする。
上から見ていくと
- SYN, SYN+ACK, ACK (TCP 3way handshake)
- OPEN Messageを相互で送る。
- KEEPALIVE Messageを相互で送る。
- UPDATE Messageを相互で送る。
- KEEPALIVE Messageを定期的に送る。
BGPでやり取りされるメッセージのタイプは4つある。
- OPEN
- UPDATE
- NOTIFICATION
- KEEPALIVE
まずはじめに、TCPによるネゴシエーションが行われる。
3way handshakeにより信頼性が保たれる。
TCPによる接続が確立されると、OPENメッセージを送信した後、対向ルータからのOPENを待つ。
OPENメッセージでは、AS番号、バージョン、RouterIDなどを確認する。
OPENメッセージの次はKEEPALIVEを送信する。
ここではホールドタイムのネゴが行われ、小さい値に決定する。
UPDATEでは経路情報が交換される。ここにはpath attributeも含まれる。
その後、定期的にKEEPALIVEが送られ、BGP接続を維持する。
経路に更新がある場合はUPDATEを用いて差分のみをやり取り、
エラーが発生した場合はNOTIFICATIONが送信され、TCPで切断される。
KEEPALIVEとHoldtime
KEEPALIVEとHoldtimeは通常60秒, 180秒に設定される。
KEEPALIVEはHoldtimeの3分の1程度で、IOSでもデフォルトは60, 180に設定されている。
R1#show ip bgp neighbors
BGP neighbor is 10.1.1.2, remote AS 2, external link
BGP version 4, remote router ID 192.168.2.1
BGP state = Established, up for 00:17:50
Last read 00:00:23, last write 00:00:21, hold time is 180, keepalive interval is 60 seconds
showコマンドで確認した中のRouter IDはLoopbackで最大のIPアドレスが利用される。
これはOSPFなどと同じ。
UPDATE
UPDATEでは配布する経路の取り消しや追加を行う。
下の例は取り消しが行われた例(Withdraw)
続いて追加された例
Path Attribute – ORIGIN
疑問に思ったポイントがあったので確認。
上のパケットではAS4で広告された192.168.5.0の情報をAS1でキャプチャしたもの。
Path AttributeのORIGINがIGPと表示されている。
このIGPとはOSPFやRIPのこと?と意味がわからなかったが、どうやら「network」コマンドで広告されたものはIGPがセットされるらしい。レガシーなEGPや再配布で生成されたルートは違う値になり、優先度が異なるらしい。 高) IGP < EGP < Incomplete (低
パス属性 (path attribute)
UPDATEに含まれているパス属性は様々。
今回はその中で周知強制である3つ。
ORIGIN
経路の生成方法。
優先度 | 生成元 | 説明 |
---|---|---|
0 | IGP | networkコマンドやaggregateによって広告された |
1 | EGP | レガシーなプロトコルであるEGPで生成されたもの |
2 | Incomplete | IGPからBGPに再配送(Redistribute)されたもの |
AS_PATH
通ってきたAS番号のリスト。
基本的にこのリストが一番短いものがベストパスとなる。
上でキャプチャしたUPDATEパケットには「2, 4」と番号がリストされている。
下の図のように、AS-5がAS-1に送信するにはパスの短いAS-3に送信することになる。
また、AS-1の情報がAS-1に届いた場合、自分のAS番号が含まれているためループを検知できる。
NEXT_HOP
ASに到達するためのネクストホップアドレス。
しかし、AS外で学習したルートについて、iBGPで広告する場合eBGPでのネクストホップがそのまま利用される。AS内で学習したルートについては広告するルータが自分をネクストホップとして広告するのでiBGPのルータがネクストホップとなる。
BGPのパス選択アルゴリズム
優先度 | 内容 |
---|---|
1 | ネクストホップへの到達性がない場合は無視(IGPルートを持っているか) |
2 | CiscoのWeightパラメータが大きいルート |
3 | Local Preference属性の高いルート |
4 | AS_PATH属性のリストが短いルート |
5 | ORIGIN属性のタイプが最も低いルート |
6 | MULTI_EXIT_DIC属性の低いルート |
7 | iBGPよりもeBGPで学習したルート |
8 | ネクストホップへ最小のIGPメトリックを持つルート |
9 | Router IDが小さいルート |
長くなってしまったのでここまで。
シンプルでありながらなかなか難しい。
実際に設定しながら試してみたい。