CCNP-ENARSI_BGP
BGP(Border Gateway Protocol)
AS間で経路情報を交換する動的ルーティングプロトコル
- BGP-4がほぼ唯一のEGPとなっている(BGPはEGPの一種)
- 各ASにはIANA(Internet Assigned Numbers Authority)からASN(AS Number:AS番号)が設定される
- このASNによって経路決定される
- BGPでは「経路情報(NLRI:Network Layer Reachability Information)の広告」を扱い、IGPのような自動ネイバ探索は実施しない
- 基本的に手動で設定する
- BGPにはメトリックが存在しない
- 代わりに経路情報に付加された様々な情報を元に最適な経路を選択する = パス属性(Path Attribute)とよぶ。
- TCP(ポート:179)を利用するので信頼性が高い
- 使用するデータベースは「ネイバーテーブル」 「BGPテーブル」 「ルーティングテーブル」の3種類
- ピアから受信したルート情報はBGPテーブルに格納される
- ピアにアドバタイズするルート情報は BGPテーブルに格納されている中の最適パスのみ
- ルーティングテーブルに格納するのは BGPテーブルに格納されている中の最適パスのみ
- 自身で生成した経路のNext Hopは「0.0.0.0」になる
- トリガーアップデートを行う
iBGPとeBGP
BGPにて経路情報の広告をする相手は主に下記の2点
iBGP(Internal BGP)
- 同一ASのネイバとの経路情報交換に使うBGP
- AD値は200
eBGP(External BGP)
- 異なるASのネイバとの経路情報交換に使うBGP
- AD値は20
BGPの最適パス選択アルゴリズム
下記の優先順位で最適経路を選択する
優先順 | 属名 | 説明 |
---|---|---|
1 | Weight | Cisco独自の設定 ローカルルータ内のみ有効な属性 大きい値が優先 |
2 | Local Preference | ASからの出口を示す属性 大きい値が優先 |
3 | ローカルルート | ローカルルート 自身で生成したルートが優先される |
4 | AS_Path | 通貨するAS番号が示す属性 最短のルートが優先される |
5 | Origin | ルートの生成元を示す属性 IGP・EGP・incompleteの順で優先 |
6 | MED | 外部ASへの入口を示す属性 小さい値が優先 |
7 | ネイバータイプ | eBGP・iBGP・ルートの順で優先 |
8 | IGPメトリック | 小さい値が優先される |
コマンド:BGPの基本的な設定
BGPを有効にする
(config)#router bgp {自身のAS番号}
BGPピアを確立する相手を指定する
(config-router)#neighbor {ネイバのIPアドレス} remote-as {ネイバのAS番号}
ピアに通知する経路情報を指定
(config-router)#network {広告したいネットワークアドレス} [mask {サブネットマスク}]
コマンド:BGPの情報確認
BGPの稼動状態
show ip bgp summary
BGPで扱う経路情報を格納したBGPテーブルを表示
show ip bgp
ルーティングテーブルのBGPで学習した経路情報を表示
show ip route bgp
Next Hopの書き換え動作
Next Hop属性は宛先へ向かうためのネクストホップを示す属性
この属性の動作は以下
- eBGPピアに経路情報を送る時は、Next Hopを自身のIPアドレスに変更する
- eBGPピアから送られてきた経路情報をiBGPピアに送る時は、Next Hopを変更しない
BGPピアグループ
同じアウトバウンドポリシー(ルートマップやディストリビュートリストなど)を適用するピアをグループ化する機能
BGPピアグループの特徴やルールは下記
- ローカルでのみ有効
- 設定をグループごとにまとめられるので設定効率が上がる
- UPDATEメッセージがグループごとに生成されるようになるのでルータの負荷が減る
- アウトバウンドのポリシーは個別に設定できない
- インバウンドのポリシーは個別にも設定できる
コマンド:BGPピアグループの設定
ピアグループを作成する
(config)#router bgp {AS番号}
(config-router)#neighbor {グループ名} peer-group
ピアグループごとに共通になるパラメータを設定(オプション)
(config-router)#neighbor {グループ名} remote-as {AS番号}
(config-router)#neighbor {グループ名} update-source {インターフェース}
(config-router)#neighbor {グループ名} route-map {ルートマップ名} {in | out}
ピアグループにまとめるピアを指定
(config-router)#neighbor {ピアのIPアドレス} peer-group {グループ名}
- AS65001
- RA_Loopback1_1.1.1.1
# BGPピアグループの設定なし
**router bgp 65001
neighbor 2.2.2.2 remote-as 65001
neighbor 3.3.3.3 remote-as 65001
neighbor 4.4.4.4 remote-as 65001
neighbor 2.2.2.2 update-source Loopback1
neighbor 3.3.3.3 update-source Loopback1
neighbor 4.4.4.4 update-source Loopback1
neighbor 2.2.2.2 route-map MAP1 out
neighbor 3.3.3.3 route-map MAP1 out
neighbor 4.4.4.4 route-map MAP1 out**
# BGPグループの設定あり
**router bgp 65001
neighbor group1 peer-group
neighbor group1 remote-as 65001
neighbor group1 update-source Loopback1
neighbor group1 route-map MAP1 out
neighbor 2.2.2.2 peer-group group1
neighbor 3.3.3.3 peer-group group1
neighbor 4.4.4.4 peer-group group1**
BGPのステータス
- Idle:初期状態
- Connect:TCP接続の完了を待っている状態
- Active:TCP接続を開始して、TCP接続の完了を待っている状態
- Open Sent:BGPピアからのOPENメッセージを待っている状態
- Open Confirm:BGPピアからのKeepaliveメッセージを待っている状態
- Established:BGPピアが確立している状態
BGPメッセージ
- Open:BGPセッションで使用するメッセージ。バージョン番号やAS番号などの基本情報が含まれ、オプション領域にMD5認証値を含むこともできる
- Notification:BGPセッションのエラー通知に使用するメッセージ
- Update:経路の追加や削除が発生した場合に送信するメッセージ
- Keepalive:BGPピア関係維持のために定期的に送信するメッセージ
- Route Refresh:相手ルータに対し全経路情報を要求するメッセージ
LoopbackをeBGPピアにする際の注意点と解決策
-
注意点1:直接接続ではないので neighborコマンドで指定するアドレスへの経路がない
→ スタティックルートなどで経路を作成する -
注意点2:受信するBGPメッセージの送信元アドレスと neighborコマンドで指定するピアのアドレスが一致しなくなる
→ 「update-source」コマンドで送信元アドレスを変更する
-
注意点3:eBGPパケットのTTL(time to live)は「デフォルトで1」なので、直接接続していない(コードC以外の)経路にはパケットを送信しない
→ 「ebgp-multihop」コマンドでTTLを変更する(2以上にすることで直接接続していない経路にもパケットを送信するようになる)
→ 「disable-connected-check」コマンドで直接接続していない経路にもパケットを送信させる
BGPの経路集約
BGPテーブルにある経路情報を集約してアドバタイズする
設定コマンド
(config-router)#aggregate-address {集約アドレス} {サブネットマスク} [summary-only] [as-set]
- summary-only:集約経路のみをアドバタイズ
- オプション無:個別経路と集約経路の両方をアドバタイズ
- as-set:集約前のAS_Pathアトリビュートを含む形でアドバタイズ
BGPの自動経路集約
BGPの自動経路集約では、BGPへ再配送されるルートに対して集約される
※networkコマンドで指定したルートなどBGPでアドバタイズするルートが自動集約される訳ではない
※Ciscoの機器ではBGPにおける自動集約がデフォルトで無効
自動集約を有効化
(config)#router bgp {自身のAS番号}
(config-router)#auto-summary
自動集約を無効化
(config)#router bgp {自身のAS番号}
(config-router)#no auto-summary
BGPの認証
BGPはMD5認証をサポート
MD5認証では、パスワードを使用してお互いを認証するので証明書は不要
認証設定コマンド(ピアに設定する場合)
(config-router)#neighbor {IPアドレス}password {パスワード}
認証設定コマンド(ピアグループに設定する場合)
(config-router)#neighbor {グループ名} password {パスワード}
コマンド:BGPで受信するプレフィックス数の制限
(config-router)#neighbor {ネイバのIPアドレス} maximum-prefix {上限値}
上限値を超える数のプレフィックス(経路情報)を受信した場合は、そのネイバとの関係を切断する
プレフィックスを大量に受信することによるメモリ枯渇を防ぐ
AS_Path属性を基にしたフィルタリング
設定コマンド①AS_Path属性を基にしたフィルタリングを行うには「ip as-path access-list」コマンドを使用
(config)#ip as-path access-list {ACL番号} {permit | deny} {正規表現}
- ACL番号・・・1~500の中から任意の値を指定
正規表現
特殊文字 | 説明 |
---|---|
. | 任意の1文字と一致 |
_ | 数字以外の文字と一致 |
* | 直前の文字を0回以上繰り返し |
^ | 入力した文字列の先頭と一致 |
$ | 入力した文字列の末尾と一致 |
設定コマンド②AS_Path属性を基にしたフィルタリングは「neighbor filter-list」コマンドで適用
(config-router)#neighbor {ネイバのIPアドレス} filter-list {ACL番号} {in | out}
- in:BGP経路を受信する時にフィルタリング
- out:BGP経路を送信する時にフィルタリング
distribute-listを用いたフィルタリング
設定コマンド
(config-router)#neighbor {ネイバのIPアドレス} distribute-list {ACL番号} {in | out}
- in:BGP経路を受信する時にフィルタリング
- out:BGP経路を送信する時にフィルタリング
BGPセッションリセットの方法
リセットを行うことで、BGPの設定変更がすぐに反映される
リセットしない場合、パスアトリビュートの変更やプレフィックスリストの変更等を行ってもすぐには反映されない
手法は2種類。ハードリセットとソフトリセット
コマンド:ハードリセット
clear ip bgp *
ハードリセットは再接続に時間がかかる
コマンド:ソフトリセット
clear ip bgp * soft [in|out]
コマンド:BGPアトリビュート変更用ルートマップの設定
(config)#route-map {マップ名} [permit | deny] [シーケンス番号]
(config-router-map)#match {条件}
(config-router-map)#set {動作}
- マップ名 :任意の名前を入力
- permit:matchに一致した経路情報に対してsetの動作を適用して送受信する
- deny:matchに一致した経路情報を送受信しない
- シーケンス番号 :ルートマップの処理を行う順番(若い番号から順に処理される)
- match ip address {ACL}:一致条件にACL番号またはACL名を使用する
- match ip address prefix-list {リスト名}:一致条件にプレフィックスリストを使用する
- match tag:一致条件にタグを使用する
- set tag :「match」に一致した経路情報にタグを付ける
- set as-path prepend {追加したいAS番号}:「match」に一致した経路情報にAS_Path属性を追加で付与する
- set local-preference {値}:「match」に一致した経路情報のLocal_Preference値を変更する
コマンド:ルートマップの適用
(config)#router bgp {自身のAS番号}
(config-router)#neighbor {ネイバのIPアドレス} route-map {マップ名} [in | out]
コマンド:ネイバー単位でのBGPアトリビュート変更
ネイバー単位でWeightの値を変更する場合、下記のコマンドが必要
(config)#router bgp {自身のAS番号}
(config-router)#neighbor {ネイバのIPアドレス} weight {Weightの値}
Community属性を基にしたルートのグループ化
Communityアトリビュートはパスアトリビュートの一種
ただし、最適パス選択アルゴリズムには使用されない
BGPルートに対してタグ付けを行い、ルートのグループ化に使用される
Community値の付与によりグループ化したルートをBGPピアに通知する設定
# 「AS番号(16ビット)+ 識別子(16ビット)」の形式でCommunity値を設定する場合に使用する
(config)#ip bgp-community new-format
# Community値を通知するコマンド。デフォルトではピアにCommunity値は通知されないためこのコマンドで通知設定が必要
(config)#router bgp {自身のAS番号}
(config-router)#neighbor {ネイバのIPアドレス} send-community
コミュニティ値を付与するルートマップの設定
グループ化したいルートのACLを作成し、ルートマップの条件として使用する
(config)#route-map {マップ名} [permit | deny] [シーケンス番号]
(config-router-map)#match {条件}
(config-router-map)#set community {コミュニティ値}
- マップ名:任意の名前を入力
- permit:matchに一致した経路情報に対してsetの動作を適用して送受信する
- deny:matchに一致した経路情報を送受信しない
- シーケンス番号:ルートマップの処理を行う順番(若い番号から順に処理される)
- match ip address {ACL}:一致条件にACL番号またはACL名を使用する
- コミュニティ値:matchに一致した経路情報にコミュニティ値を追加で付与する
ルートマップの適用
(config)#router bgp {自身のAS番号}
(config-router)#neighbor {ネイバのIPアドレス} route-map {マップ名} [in | out]
ルートリフレクタ(Route Reflector:RR)
ルートリフレクタはiBGPピアから受信したルートを別のiBGPピアに反射する(伝える)機能
iBGPではiBGPスプリットホライズン(iBGPピアから受信した経路情報を他のiBGPピアに伝えない)という働きがあるため、AS内の一部BGPスピーカが経路情報を学習できないという状況が発生する。これを回避するにはフルメッシュにピアを張る(全スピーカと隣接関係を結ぶ)方法があるが、フルメッシュでは帯域消費やルータ負荷の増加といった問題が発生する。
→ ルートリフレクタを使用することでフルメッシュにすることなく iBGPスプリットホライズンの問題を解決できる
ルートリフレクタの動作
ルートリフレクタではBGPスピーカを「ルートリフレクタ」「クライアント」「ノンクライアント」という役割で分ける
以下のルールで動作
- ルートリフレクタはクライアントから受け取った経路情報をクライアントとノンクライアントに伝える
- ルートリフレクタはノンクライアントから受け取った経路情報をクライアントに伝える
コマンド:ルートリフレクタの設定
(config)#router bgp {AS番号}
(config-router)#neighbor {IPアドレス | ピアグループ名} route-reflector-client
BGP同期
BGP同期とは、iBGPピアから通知された経路情報は IGPでも通知されるまで使用できないというルール
現在はデフォルトでBGP同期は無効になっている
コマンド:BGP同期の有効化・無効化
# BGP同期の有効化
(config-router)#synchronization
# BGP同期の無効化
(config-router)#no synchronization
MP-BGP(Multiprotocol BGP)
MP-BGPは、BGPを拡張してIPv4以外に対応できるようにしたプロトコル
IPv6環境やVRFやMPLS-VPNなどで利用される
MP-BGPを使ったIPv6 BGPの基本的な設定
# IPv6を有効にする
(config)#ipv6 unicast-routing
# BGPを有効にする
(config)#router bgp {自身のAS番号}
# ルータIDを設定する
(config-router)#bgp router-id {IPv4アドレス形式}
# BGPピアを確立する相手を指定する
(config-router)#neighbor {ネイバのIPアドレス} remote-as {ネイバのAS番号}
# IPv4アドレスファミリの無効化
(config-router)#no bgp default ipv4-unicast
# address-familyモードへの移行
(config-router)#address-family ipv6 [vrf vrf名] [unicast | multicast | vpnv6]
- unicast :IPv6ユニキャストルーティングを利用する場合に指定。省略した場合、デフォルトで「unicast」となる。
- multicast:IPv6マルチキャストアドレスプレフィックスを利用する場合に指定
- vpnv6:MPLS-VPNでMP-BGPを利用する場合に指定
# ピアとの情報交換の有効化
(config-router-af)#neighbor {ネイバのIPアドレス} activate
# ピアに通知する経路情報を指定
(config-router-af)#network {広告したいネットワークアドレス}
ASの接続種類
ASは接続状態により「スタブAS」 「トランジットAS」 「非トランジットAS」に分類される
- スタブAS:1つのASとだけ接続しているAS(シングルホームASとも呼ばれる)
- トランジットAS:複数のASと接続し、他ASのトラフィックが通過するAS(マルチホームトランジットASとも呼ばれる)
- 非トランジットAS:複数のASと接続しているが、他ASのトラフィックが通過しないAS(マルチホーム非トランジットASとも呼ばれる)
RIB-failure
ベストパスとなっているBGPルートがルーティングテーブル(RIB)にないと発生するエラー
スタティックルートの重複や記載なしなどが主な要因
eBGPにおけるループ回避
自身と同じAS番号の場合は破棄する
このAS番号の破棄を無効化するには下記のコマンドが必要
# allowas-inの有効化
(config)#router bgp {自ASN}
(config-router)#neighbor {ネイバーのIPアドレス} allowas-in
指定したネイバーからの経路情報に自身のAS番号が含まれても、それを破棄せずに学習するようになる
ダミーのAS_pathの設定方法
AS65040からAS65010宛のパケットをAS65030を経由するように設定する
# ダミーASPATHを設定する
RB(config)#route-map ASPATH permit 10
RB(config-route-map)#set as-path prepend 65020
# 各コマンドの解説
**RB(config)#route-map ASPATH permit 10**
route-map:route-mapコマンド
ASPATH:ルートマップの名前
permit 10:シーケンス番号の設定
**RB(config-route-map)#set as-path prepend 65020**
as-path prepend 65020:ASパス属性を追加
RBにダミーASPATHを設定することで、最短で通信できるAS65030を選択するようになる
ルートリフレクタについて再度まとめ
ルートリフレクタについて理解が浅かったので、再度メモにまとめる
ルートリフレクタとは?
iBGPのルート情報を別のiBGPへ伝達する機能
なぜルートリフレクタは必要?
前提として、iBGPには「iBGPスプリットホライゾン」が存在する
iBGPスプリットホライゾンは「iBGPのルート情報を別のiBGPへ伝達しないようにする」機能であり、通信のループ防止が目的
このiBGPスプリットホライゾンを回避するにはフルメッシュにピアを張るというような手法が存在するが、この方法では「帯域消費」・「ルータ負荷の増加」というような問題が発生する
このフルメッシュの問題を回避しつつルート情報を伝達させるためにルートリフレクタが存在する