# IP / 経路制御（BGP）

経路制御プロトコルBGP（Border Gateway Protocol）について解説します。
BGPはISPなどのネットワーク運用組織（経路制御ドメインまたは自律システム（AS）と呼びます）間で経路情報の交換を行うために開発されたプロトコルです。BGPは現在のインターネットを支える基幹的な経路制御プロトコルです。
ここでは、BGPの概要と設定手順について解説します。なお、BGP経路のフィルタリングやポリシー設定については「IP」の「経路制御（フィルタリング）」をご覧ください。
Note

本製品はIPv4におけるBGPにのみ対応しており、IPv6におけるBGP（BGP+）には非対応です。

Note

BGP由来の経路を65経路以上使用する場合はフィーチャーライセンスが必要です。BGPはフィーチャーライセンスがなくても使用できますが、その場合BGP由来の経路は64経路までしかシステムの経路表に登録されません（登録できなかった場合はログに記録が残ります）。
ライセンスのインストール方法については「運用・管理」/「システム」の「ライセンスキーのインストール」をご参照ください。

## プロトコル概要

BGPは、インターネットに代表される相互接続型ネットワークにおいて、ASと呼ばれる組織（ISPや企業など）間で経路情報をやりとりするために開発された経路制御プロトコルです。現在使われているBGPバージョン4（BGP4）は基本仕様がRFC1771で規定されており、その他運用上の詳細や拡張機能の仕様などが多数のRFCで規定されています。
同じ経路制御プロトコルでも、RIPやOSPFは組織内のトラフィックを配送するために使用されるため、IGP（Interior Gateway Protocol）と呼ばれるのに対し、BGPは組織間でトラフィックを配送するために使用されるため、EGP（Exterior Gateway Protocol）と呼ばれます。ただし、後述するようにBGPはAS内（組織内）での経路制御にも使用でき、実際そのような形に限定した使い方もされています。
アルゴリズム的に見ると、BGPはディスタンスベクターアルゴリズム（パスベクター）を使用した比較的シンプルな設計になっています。ただし、他組織との関係（契約など）に応じた柔軟な配送制御ができるよう、各ASにおいて経路情報にさまざまな情報（「属性」と呼びます）を付加して、各組織のポリシーに基づくルーティングが可能になっています。

### AS（Autonomous System）

BGPは組織間で経路情報を交換するEGP（Exterior Gateway Protocol）です。
ここでいう「組織」は、より正確には「AS（Autonomous System = 自律システム）」と呼ぶべきものです。BGPでは、RIPやOSPFでいうASと比べ、若干その意味が拡張されています。すなわち、「1つの経路制御プロトコルとメトリックを使って経路情報を交換しあっているルーターの集まり」という旧来の定義ではなく、「外部から見たときに、首尾一貫した経路制御ポリシーを持つように見えるルーターの集合（ネットワーク）。内部では複数の経路制御プロトコルやメトリックを使用していてもよい」という意味でASという言葉を使っています。ASは通常同一組織の管理下に置かれており、経路制御ドメインなどと呼ばれることもあります。
ASは1～4294967295の番号（ASN = AS番号）によって識別されます。AS番号はICANN（Internet Corporation for Assigned Names and Numbers）が管理していますが、64512～65535はプライベートAS番号として予約されており、各組織内で自由に使用できます。ただし、プライベートAS番号は絶対にインターネット上に流してはなりません。

#### ASの種類

ASは他ASとの接続形態やトラフィックの配送ポリシーによって次のように分類できます。

名称 | 説明
スタブAS（Stub AS） | 1つのASとだけ1点で接続しているAS。自AS宛てのトラフィックだけを受け入れる。
マルチホームAS（Multihomed AS） | 1つのASと複数点で接続している、あるいは、複数のASと接続しているASのうち、自AS宛てのトラフィックだけを受け入れ、他AS宛てのトラフィックは通過させないもの
トランジットAS（Transit AS） | 複数のASと接続しており、自AS宛てのトラフィックだけでなく、他AS宛てのトラフィックも（ポリシーに応じて）通過を許可するAS

#### ASとトラフィック

AS間の関係を考慮した場合、トラフィックは次の2つに分類して考えることができます。

- ローカルトラフィック：始点か終点のどちらかが自AS内のアドレスであるトラフィック。すなわち、自AS宛てのトラフィックや自ASから他ASに向けて送られるトラフィック。
- トランジットトラフィック：始点と終点の両方が他ASのアドレスであるトラフィック。すなわち、自ASを単なる通過点とするトラフィック。

また、BGPでは、トラフィックの配送ポリシーを表すときに「トランジット」「非トランジット」という言葉が使われます。この場合それぞれの意味は次のとおりです。

- トランジット：他AS宛てトラフィックが自ASを通過することを許可する。
- 非トランジット：他AS宛てトラフィックが自ASを通過することを許可しない（自AS宛てのトラフィックしか受け取らない）。

BGPの基本は、自AS内のプレフィックスを他ASに通知することで自AS宛てのトラフィックを受け取れるようにすること、および、他ASから経路を学習することで他AS宛てにトラフィックを送信できるようにすることです。
また、トランジットASの場合は、特定のトランジットトラフィックだけが自ASを通過できるよう、他ASに通知する経路情報を操作することも重要になります。BGPには、このようなポリシーを実施するために必要な機能が備えられています。

### プレフィックス

プレフィックスとは、IPv4ネットワーク（IPv4アドレスの範囲）をアドレスとネットワーク部の長さの組で表したものです。次に表記例を挙げます。

`[IPv4]
172.16.10.0/24
172.16.10.0/255.255.255.0
`

IPv4における2つの例は同じプレフィックス（IPアドレス 172.16.10.0～172.16.10.255の範囲）を表しています。最初の例では、ネットワーク部の長さをビット数で表しています（マスク長またはプレフィックス長）。一方2番目の例では、ネットワーク部の長さをIPアドレスと同じ形式のビットマスクで表しています（ネットマスク）。どちらも同じ意味ですが、（文字数が少ないためか）どちらかというと最初の例のほうがよく使われています。
IPv4では、このようにナチュラルサブネットマスク（クラスA、B、C）にこだわらないネットワークの設定方法を「CIDR」（Classless Inter-Domain Routing）と呼びます。CIDRは、限られたIPアドレスを効率的に割り当てるため、また、次に述べる経路集約によってインターネット上の経路数を少なくするために役立っています。

#### 経路集約

経路集約とは、複数のプレフィックスを1つのプレフィックスにまとめることを言います。
たとえば、IPv4において、172.16.0.0/24、172.16.1.0/24、172.16.2.0/24 ～ 172.16.255.0/24という256個のプレフィックスは、172.16.0.0/16という1個のプレフィックスに集約して表すことができます。
経路情報を適切に集約することで、ネットワーク全体に通知される経路エントリーの数を減らし、経路制御にかかる負荷を軽減することができます。

### BGPスピーカー

BGPの仕様では、BGP実装機器をBGPスピーカー（BGP speaker）と呼んでいます。BGPスピーカーは通常ルーターですが、経路情報を配布できるのであれば通常のホストであってもかまいません。
BGPスピーカーは、それぞれBGP識別子（BGP Identifier）という値を持ちます。BGP識別子は32ビットの符号なし整数値で、通常IPv4アドレスと同じ形式で表されます（例：10.10.10.1）。IPv4アドレスを持つBGPスピーカーでは自身のIPv4アドレスの1つを使うことが多いです。
BGP識別子はルーターIDとも呼ばれます。

### BGPセッション

BGPはTCP上で動作するため、必ず2つのBGPスピーカー間でセッションを張ることになります。互いにセッションを張っているBGPスピーカーを「BGPピア」と呼びます。また、BGPセッションを張って経路情報を交換することを「ピアリングする」などと呼ぶこともあります。
異なるASに属するスピーカー同士のセッションをeBGP（External BGP）、同じASに属するスピーカー同士のセッションをiBGP（Internal BGP）と呼びます。
eBGPはAS間で経路情報を交換するためのセッション、iBGPは他ASから学習した経路情報を同一AS内の他のスピーカーに伝えるためのセッションです。
eBGPとiBGPは原則的に同じ動作ですが、学習した経路を他のBGPピアに再通知するときのルールに違いがあります。BGPスピーカーは、あるiBGPピアから学習した経路を別のiBGPピアに通知することができません。これはAS内における経路情報のループを防ぐためです。iBGPで学習した経路をeBGPピアに通知すること、eBGPピアから学習した経路をiBGPで通知することは問題ありません。
このような制限があるため、BGPスピーカーは同一ASに所属する他のすべてのBGPスピーカーとセッションを張る必要があります。結果としてAS内にはメッシュ状にiBGPセッションが張られることになります。メッシュ構成の煩雑さを避けるための手段として「ルートリフレクション」や「ASコンフェデレーション」があります。

### BGPメッセージ

BGPメッセージはTCPを使って送信されます。TCPポート番号は179です。
BGPのメッセージには以下の種類があります。

タイプ | メッセージ名 | 説明
1 | OPEN | BGPセッションを開始するためのメッセージ。ルーター間にTCPコネクションが確立した直後に送られる。各ルーターの所属ASを通知しあったり、タイマー値のネゴシエーションを行ったりする
2 | UPDATE | 経路情報の通知に使うメッセージ。新規プレフィックスの通知や無効になったプレフィックスの取り消し依頼などを相手に通知する
3 | NOTIFICATION | プロトコル上のエラーを相手に通知するためのメッセージ。BGPセッションの終了通知にも使われる
4 | KEEPALIVE | BGPセッションが有効であることを確認するためのメッセージ。定期的に送信される
5 | ROUTE-REFRESH | BGPピアに対し、すべての経路情報を送信しなおすよう要求するためのメッセージ（RFC2918による拡張）

### パス属性

BGPでは、UPDATEメッセージで送信される経路情報にさまざまな情報を付加することができます。この付加情報をパス属性と呼びます。属性はポリシールーティングの基礎となる情報を相手に提供します。属性には以下の種類があります。

タイプ | 属性名 | 種類 | 説明
1 | ORIGIN | well-known mandatory | プレフィックスがどのようにしてBGPに取り込まれたかを示す
2 | AS_PATH | well-known mandatory | プレフィックスがどのような経路をたどって通知されてきたかを示す
3 | NEXT_HOP | well-known mandatory | プレフィックス宛トラフィックのネクストホップアドレスを示す
4 | MULTI_EXIT_DISC | optional non-transitive | 隣接ASと複数点で接続している場合に、特定プレフィックス宛トラフィックのNEXTHOPとしてどちらが適切であるかを（隣接ASに対して）示す一種のメトリック（コスト）。小さいほどコストが低い（優先度が高い）
5 | LOCAL_PREF | well-known discretionary | AS内における（iBGP）経路選択のための優先度。大きいほど優先度が高い
6 | ATOMIC_AGGREGATE | well-known discretionary | プレフィックスが集約されたものであることを示す
7 | AGGREGATOR | optional transitive | プレフィックスを集約したASおよびBGPスピーカーのBGP識別子を示す
8 | COMMUNITIES | optional transitive | コミュニティーを示す（RFC1997による拡張属性）
9 | ORIGINATOR_ID | optional non-transitive | 該当経路を最初に学習したiBGPピアのBGP識別子（ルーターID）を示す。ルートリフレクション使用時に経路情報のループを防ぐために使われる（RFC2796による拡張属性）
10 | CLUSTER_LIST | optional non-transitive | AS内における該当経路のリフレクトパスを示す。ルートリフレクターは、経路を再通知（リフレクト）するときに自身のクラスターID（CLUSTER_ID）を本属性に付加する。ルートリフレクション使用時に経路情報のループを防ぐために使われる（RFC2796による拡張属性）

以下、おもなパス属性について説明します。

#### AS_PATH

AS_PATH（ASパス）とは、あるプレフィックスの経路情報がどのASをどんな順番で経由してきたのかを示すAS番号のリストです。
たとえば、次の図ではAS 10が「10.0.0.0/12」というプレフィックスを他のASに通知しています。AS 10は同プレフィックスのAS_PATH属性に「10」をセットしてAS 20に通知します。
AS 20から見ると、プレフィックス10.0.0.0/12へは、AS 10経由で到達できるという意味になります。次にAS 20は、同プレフィックスのAS_PATH属性に自AS番号を追加し、「20 10」としてAS 30に通知します。
AS 30から見ると、プレフィックス10.0.0.0/12へは、AS 20、AS 10の順番に経由して到達できるという意味になります。

一般的に、AS_PATH属性は「30 20 10」のように表します。「30」「20」「10」はいずれもAS番号を示します。先ほどの例にもあるように、リストの末尾（右端）がプレフィックスの通知元（起源AS）、リストの先頭（左端）が直前のASとなります。
BGPスピーカーは、あるプレフィックスへの経路が複数ある場合、AS_PATHの短い経路を優先します。この仕組みを利用し、自ASに向かうトラフィックを操作することもできます。たとえば、自AS内のプレフィックスを通知するときに、AS_PATH属性に自AS番号を複数回含めることがあります。こうすることにより、AS_PATHを長くし、他ASにとって該当経路の優先度を引き下げさせることができます。
AS_PATHは、経路情報のループを検出するためにも使用されます。BGPスピーカーは、受信した経路情報のうち、AS_PATHに自AS番号を含むものを受け取らずに破棄します。これによりループを防いでいます。

#### MULTI_EXIT_DISC

MULTI_EXIT_DISC（MED = MULTI-EXIT DISCRIMINATOR）属性は、隣接ASと複数点で接続している場合に、特定プレフィックスへのNEXT HOPとしてどちらの接続点がより望ましいかを通知するために使用する一種のメトリック（コスト指標）です。
次の図では、AS 20がAS 10に対して2つのプレフィックス「10.1.0.0/16」と「10.16.0.0/12」を通知しようとしています。
AS 20とAS 10はA-C、B-Dという2つの回線で接続しています。ここで、AS 20はAS 10に対し、「10.1.0.0/16」宛てのトラフィックはA-C経由で、「10.16.0.0/12」宛てのトラフィックはB-D経由で送ってほしいと考えています。そのほうがAS 20内での配送コストが低いためです。MED属性はこのような場合に使います。
MED属性は小さい値ほどコストが低いことを示します。そのため、AS 20はAS 10にプレフィックスを通知するにあたり、「10.1.0.0/16」のMED属性はA-Cのほうが小さくなるようにし、「10.16.0.0/12」のMED属性はB-Dのほうが小さくなるようにします。
これにより、AS 10でMED属性を考慮するポリシーが運用されていれば、AS 20の意図通り、「10.1.0.0/16」宛てのトラフィックはA-C経由で、「10.16.0.0/12」宛てのトラフィックはB-D経由でAS 20に送信されることになります。

本製品は、デフォルトでは経路情報にMED属性を含めません。しかし、後述するルートマップを使えば、特定の経路に任意のMED値を設定することができます。

#### LOCAL_PREF

LOCAL_PREF属性は、1つのAS内部において、特定プレフィックスへの経路としてどれがもっとも望ましいかを選択するための優先度です。複数のASと接続しているなど、あるプレフィックス宛ての経路が複数存在する場合に使用します。
たとえば次の図では、AS 10からプレフィックス「10.16.0.0/12」への経路として、AS 20経由とAS 40経由の2通りがあります。
ここで、AS 10ではAS 40経由のほうが回線が太いなど条件がよいことを知っているとします。このような場合、AS 10ではルーターA、Bに設定を施し、プレフィックス「10.16.0.0/12」のLOCAL_PREF属性値をBのほうが高くなるよう設定することで、「10.16.0.0/12」宛ての経路としてルーターB側を使うようにできます。

本製品は、iBGPセッションにおけるデフォルトLOCAL_PREF値として100を通知します。後述するルートマップを使えば、特定の経路情報に任意のLOCAL_PREF値を設定することも可能です。

#### ATOMIC_AGGREGATE

ATOMIC_AGGREGATE属性は、プレフィックスが集約されたものであることを示すフラグ属性（「あり」か「なし」だけが意味を持つ属性）です。

経路情報がATOMIC_AGGREGATE属性付きで通知された場合、通知されたプレフィックスに含まれる特定のプレフィックスへの経路がAS_PATHとは異なることがあります。

#### COMMUNITIES

COMMUNITIES属性は、BGPのポリシー運用を簡略化するために追加された属性です。共通の性質を持つプレフィックスを「コミュニティー」にグループ化し、コミュニティー単位でポリシー制御を行うことを目的としています。
「コミュニティー」は32ビットの整数値で表します。コミュニティー値の意味は各ASが独自に定義できます。たとえば、コミュニティー「100」はトランジットさせる経路、コミュニティー「200」はトランジットさせない経路、といった使い方ができます。慣例として、コミュニティーの前半16ビットは自AS番号、後半16ビットは自AS内でのコミュニティー識別子とします。この場合、読みやすさを考慮して「65001:100」といった表記がよく使われます。
なお、0x00000000～0x0000FFFF（0:0～0:65535）の範囲と、0xFFFF0000～0xFFFFFFFF（65535:0～65535:65535）の範囲は予約済みとなっています。
また、定義済みの特殊なコミュニティー（Well-known Communities）として次のものが定義されています。

- NO_EXPORT（0xFFFFFF01）：NO_EXPORTコミュニティーに属する経路情報を受け取った場合、その経路を他のAS（正確にはASコンフェデレーション）に再通知してはならない。
- NO_ADVERTISE（0xFFFFFF02）：NO_ADVERTISEコミュニティーに属する経路情報を受け取った場合、その経路を他のBGPスピーカーに再通知してはならない。
- NO_EXPORT_SUBCONFED（0xFFFFFF03）：NO_EXPORT_SUBCONFEDコミュニティーに属する経路情報を受け取った場合、その経路を他のAS（同一ASコンフェデレーション内の他のメンバーASも含む）に再通知してはならない。

本製品では、ルートマップを使って、特定の経路情報に任意のコミュニティー値を設定したり、経路情報に付加されているコミュニティー値に基づいて経路を分類したりすることができます。

## 基本設定

BGPを使用するための基本的な設定手順について説明します。

1. BGPルーティングプロセスの設定を行うため、router bgpコマンドを実行してBGPモードに移行します。このとき、自AS番号を指定します。

       awplus(config)# router bgp 65010

2. 自身のBGP識別子（ルーターID）を設定します。これには、bgp router-idコマンドを使います。

       awplus(config-router)# bgp router-id 10.10.10.1

3. 自らが提供するIPv4経路情報を設定します。たとえばIPv4のインターフェース直結経路をBGPで通知したいときは、BGPモードのredistributeコマンドを使って次のようにします。

       awplus(config-router)# redistribute connected

   なお、通知するIPv4プレフィックスを明示的に指定したいときは、BGPモードのnetworkコマンドで該当プレフィックスを指定します。

       awplus(config-router)# network 192.168.10.0/24

4. IPv4経路情報の交換相手となるBGPスピーカー（BGPピア）を指定します。これには、neighbor remote-asコマンドを使います。相手のIPアドレスと相手の所属AS番号を指定してください。remote-asパラメーターに指定した番号が自ASと同じならiBGPピア、違うならeBGPピアとなります。

       awplus(config-router)# neighbor 10.10.10.5 remote-as 65050

   Note

   初期設定では、neighbor remote-asコマンドの実行と同時にIPv4経路情報の交換が開始されます。ただし、bgp default ipv4-unicastコマンドをno形式で実行している場合は、BGPモードのneighbor activateコマンドを実行しないとIPv4経路情報の交換が開始されません。

設定は以上です。

### 設定項目詳細

BGPのおもな設定項目について説明します。
自AS番号の設定は、BGPルーティングプロセスの設定を開始するときにrouter bgpコマンドで行います。

    awplus(config)# router bgp 65010

初期設定では、インターフェースに設定されたIPv4アドレスの中でもっとも大きなものがBGP識別子（ルーターID）として使われます。ただし、bgp router-idコマンドでルーターIDを明示的に指定した場合はその値が使われます。また、明示的に指定していない場合でも、ループバックインターフェース（lo）にIPv4アドレスを設定している場合は、そのアドレスがルーターIDとして使われます。

- ルーターIDを明示的に指定するには、BGPモードのbgp router-idコマンドを使います。このコマンドが実行されている場合は、このコマンドで指定した値がルーターIDとして使われます。

      awplus(config-router)# bgp router-id 10.10.10.1

- bgp router-idコマンドでBGPルーティングプロセスのルーターIDが設定されていない場合、ループバックインターフェース（lo）にIPアドレスが設定されていれば、その値がルーターIDとして使われます。

      awplus(config)# interface lo
      awplus(config-if)# ip address 10.10.10.1/32

- 上記の方法でルーターIDが指定されていない場合は、インターフェースに設定されたIPアドレスの中でもっとも大きなものがBGP識別子（ルーターID）として使われます。

BGPで通知する経路情報はredistributeコマンドで指定します。

- IPv4の経路情報を通知するときは、BGPモードのredistributeコマンドで指定します。インターフェース（直結）経路、スタティック経路、RIP経路、OSPF経路のそれぞれについて、IPv4 BGP経路表への取り込み時にルートマップによる取捨選択や属性設定が可能です。

      awplus(config-router)# redistribute connected
      awplus(config-router)# redistribute static route-map imp_static

BGPで通知する経路情報の設定は、経路種別ごとではなく、プレフィックスごとに行うこともできます。これには、networkコマンドを使います。

- IPv4のプレフィックスを通知するときは、BGPモードのnetworkコマンドを使います。

      awplus(config-router)# network 172.16.10.0/24
      awplus(config-router)# network 172.16.20.0/24

  初期設定では、networkコマンド（BGPモード）で指定したプレフィックスがIP経路表（RIB。show ip route databaseコマンドで表示）に登録されていなくても、該当経路をIPv4 BGP経路表に登録します。network synchronizationコマンド（BGPモード）を実行している場合は、networkコマンド（BGPモード）で指定したプレフィックスがIP経路表に登録されていないと、該当経路はIPv4 BGP経路表に登録されません。

経路情報を集約したいときは、aggregate-addressコマンドを使います。

- IPv4経路の集約には、BGPモードのaggregate-addressコマンドを使います。同コマンドで指定したプレフィックス（集約経路）よりも具体的な経路（プレフィックス長が長い経路）がIPv4 BGP経路表に現れた場合、IPv4 BGP経路表に集約経路が追加されます。summary-onlyオプションを指定した場合は集約経路だけが通知され、個別経路は通知されません（使用が抑制されます）。summary-onlyオプションを指定しなかった場合は集約経路と個別経路の両方が通知されます。

      awplus(config-router)# aggregate-address 172.16.0.0/16 summary-only

BGPピアの指定はneighbor remote-asコマンドで行います。
このコマンドでは、BGPピアのIPアドレスと所属ASを指定してください。BGPピアの所属ASが自ASと違うならeBGPピア（外部ピア）、同じならiBGPピア（内部ピア）となります。

    awplus(config-router)# neighbor 10.10.10.5 remote-as 65050

経路交換の有効・無効はneighbor activateコマンドで制御します。

- IPv4経路情報の交換は、BGPモードのneighbor activateコマンドで制御します。通常形式で交換開始、no形式で交換停止となります。初期設定では、neighbor remote-asコマンドで設定した直後はIPv4経路の交換が有効ですが、bgp default ipv4-unicastコマンドをno形式で実行している場合は無効なので、neighbor activateコマンド（BGPモード）による手動での開始が必要です。

      awplus(config-router)# no neighbor 10.10.10.5 activate
      awplus(config-router)# neighbor 10.10.10.5 activate

BGPピアの有効・無効（BGPセッションの開始・切断）はneighbor shutdownコマンドで行います。通常形式でセッション切断、no形式でセッション開始ができます。neighbor remote-asコマンドで設定した直後のBGPピアは有効です。

    awplus(config-router)# neighbor 10.10.10.5 shutdown
    awplus(config-router)# no neighbor 10.10.10.5 shutdown

その他、BGPピア固有の各種設定はneighbor xxxxコマンドで行います。

    awplus(config-router)# neighbor 10.10.10.5 distribute-list AS65050_in

Note

BGPピア固有の各種設定（neighbor xxxxコマンド）は、原則として該当ピアとの経路交換（neighbor activateコマンド）が有効になっていないと行えません。適宜 neighbor activateコマンドを実行してから設定を行ってください（経路交換の有効化については、こちらを参照）。

変更内容を反映するには、clear xxxxコマンドをsoftオプション付きで実行してください（ソフトリセット）。

- IPv4 BGPピアに対する変更を反映する場合は、clear bgpコマンドかclear ip bgpコマンドを使います。

      awplus# clear ip bgp 10.10.10.5 soft

Note

softオプションを付けずに実行すると、BGPセッションがいったん切断されるのでご注意ください（ハードリセット）。softオプションを付けた場合は、BGPセッションを保持したまま経路情報を更新します。詳しくはclear bgp、clear ip bgpコマンドの説明をご覧ください。

## 経路選択プロセス

BGP経由で学習した経路情報の中には、同じプレフィックスを持つものが複数存在する可能性があります。一般的にこれは、該当プレフィックス宛ての経路が複数あることを意味しますが、この場合どの経路をシステムの経路表に取り入れるかが重要になってきます。
あるプレフィックスへの経路が1つしか存在しない場合は、その経路を使用します。しかし、複数の経路が存在する場合は、次の流れにしたがって1つの経路に絞ります。

1. NEXT_HOP属性のIPアドレスが到達可能な経路だけを選択
   到達できないネクストホップを持つ経路は無効として無視される。ネクストホップの到達可能性はshow ip bgp scanコマンドで確認できる。
2. 内部的なウェイト（重み付け）の大きい経路を優先
   ウェイトは1台のルーター内でのみ意味を持つ内部的な属性値で、neighbor weightコマンド（BGPモード）やルートマップのset weightコマンドで任意の値を設定できる。
3. LOCAL_PREF属性の大きい経路を優先
4. AS_PATH属性の短い経路を優先
   ただし、bgp bestpath as-path ignoreコマンドを実行している場合は、AS_PATH属性の比較を行わず、次のステップに進む。
5. ORIGIN属性。次の順序で優先
   (1) IGP
   (2) EGP
   (3) INCOMPLETE
6. MULTI_EXIT_DISC（MED）属性の小さい経路を優先
   初期設定では同一ASから学習した経路間の比較にのみMED属性を使うが、bgp always-compare-medコマンドを実行している場合は、異なるASから学習した経路間の比較にもMED属性を使う。
   また、初期設定ではMED属性が付加されていない経路のMED値を0（優先度最高）と見なすが、bgp bestpath medコマンドでmissing-as-worstオプションを指定している場合は、MED値無限大（優先度最低）と見なす。
7. iBGPピアから学習した経路よりもeBGPピアから学習した経路を優先
8. NEXT_HOP属性のIPアドレスへのコストが小さい経路を優先
   ネクストホップへのコストはshow ip bgp scanコマンドで確認できる。
9. 先に学習した経路（学習してからの経過時間の長い経路）を優先
   ただし、bgp bestpath compare-routeridコマンドを実行している場合は、学習してからの経過時間ではなく、学習元BGPピアのルーターIDが小さい経路を優先する
10. 学習元BGPピアのIPv4アドレス（BGPセッションで使用しているアドレス）が小さい経路を優先

## 経路フィルタリングとポリシー設定

BGPの運用においては、どの経路情報を受け入れるかといったフィルタリング機能、また、特定の経路情報に付加的情報を追加するポリシー設定機能が重要な意味を持ちます。
BGP経路のフィルタリングやポリシー設定については、「IP」の「経路制御（フィルタリング）」をご覧ください。

## iBGPフルメッシュの回避

AS内部でBGPを使用する環境、すなわちiBGP環境においては、経路情報がループすることを防ぐため、すべてのBGPスピーカーがフルメッシュでセッションを張る必要があります。このため、BGPスピーカーの数が N のとき、iBGPセッション数 nSess は次のようになります。

`nSess = N × (N - 1) ÷ 2
`

たとえば、BGPスピーカーが4台のとき、セッション数は 6 （= 4 × (4 - 1) ÷ 2）ですが、8台のときは 28 （= 8 × (8 - 1) ÷ 2）となります。
このように、BGPスピーカーの数が少ないうちはそれほど問題になりませんが、数が増えてくると、システム資源（メモリーやCPU）や設定作業にかかる負荷が非常に大きくなります。
この問題を回避するための手段として、本製品は「ルートリフレクション」と「ASコンフェデレーション」をサポートしています。以下、それぞれについて解説します。

### ルートリフレクション

ルートリフレクションは、「ルートリフレクター」（RR）と呼ばれる特殊な役割のiBGPスピーカーを導入して、iBGPセッション数を削減するための仕組みです（RFC2796）。
次図の左側は通常のフルメッシュ構成を示しています。ここでは、iBGPスピーカーが5台あるため、合計10本のBGPセッションが必要になります。ここで、5台のうちの1台をRRにすると、右側のような構成となり、必要なセッション数は4本に削減されます。

通常のiBGPスピーカーは、他のiBGPピアから学習した経路を別のiBGPピアに通知することができませんが、RRとして設定されたルーターにはこれ（iBGPで学習した経路の再通知）が許可されます。RRは、他のiBGPピアを次の2種類に分けて扱います。

- クライアントピア（CP）: RRに依存しており、RR経由で経路情報の送受信を行っているiBGPピア。RRは、CPから受信した経路を他のCPおよびNCPに再通知（リフレクト）します。
- ノンクライアントピア（NCP）: RRに依存していない通常のiBGPピア。RRは、NCPから受信した経路をCPにだけ再通知（リフレクト）します。

RRが経路を再通知するときは、該当経路にORIGINATOR_ID属性が付加されているかどうかを確認し、付加されていなければ通知元のBGP識別子（ルーターID）を値としてこれを追加します。
ルートリフレクションでは、RRとそれに依存するCPで「クラスター」と呼ばれるグループを構成します。各クラスターは4バイトのクラスターID（通常はRRのBGP識別子となる）で識別されます。クラスター外部のBGPスピーカー（NCP）からは、クラスターは1つの大きなNCPとしか意識されないことになります。

RRが経路を再通知するときは、該当経路にCLUSTER_LIST属性が付加されているかどうかを確認し、付加されていなければ自身のクラスターIDを値としてこれを追加します。すでにCLUSTER_LIST属性が付加されていたときは、自身のクラスターIDが含まれていないかどうかを確認し、含まれている場合は経路がループしているとみなして該当経路を破棄します。自身のクラスターIDが含まれていない場合は、これを追加して再通知します。
ルートリフレクションを使用するには、RRとして動作させるルーター上でBGPピアを設定するときに、該当ピアがCPであるかNCPであるかを指定します。

- ピアがCPのときは、neighbor route-reflector-clientコマンドを実行して、該当ピアに対するRRとして動作するよう設定します。

      awplus(config)# router bgp 65010
      awplus(config-router)# neighbor 10.10.10.5 remote-as 65010
      awplus(config-router)# neighbor 10.10.10.5 route-reflector-client

- BGPピアがNCPのときは、通常のiBGPピアと同じなので特別な設定はありません。

      awplus(config)# router bgp 65010
      awplus(config-router)# neighbor 10.10.10.7 remote-as 65010

Note

ルートリフレクションに対応している必要があるのはRRだけです。RR以外のCP、NCPは通常のiBGPの動作をするだけなので、RRをピアとして指定するときにも特殊な設定は必要ありません。また、CP、NCPは、ルートリフレクションに対応していない機器でもかまいません。

Note

neighbor route-reflector-clientコマンドはiBGPピアに対してのみ有効です。eBGPピアに対して実行した場合はエラーになります。

RRとして動作している場合、デフォルトではクラスターIDとして自身のBGP識別子（ルーターID）を使います。通常はこれで問題ありませんが、次図の右側の構成のようにクラスター内に複数のRRを置いて冗長性を確保する場合は、クラスター内のすべてのRRに同じクラスターID（いずれかのRRのBGP識別子）を設定する必要があります。これには、bgp cluster-idコマンドを使います。

    RR1(config-router)# bgp cluster-id 10.10.10.1

    RR2(config-router)# bgp cluster-id 10.10.10.1

ルートリフレクションの設定は、show ip bgp neighborsコマンドでピアごとに確認します。「Route-Reflector Client」という一行が表示されている場合、該当ピアはCPであり、自身は該当ピアのRRとして動作しています。

    awplus> show ip bgp neighbors 10.10.10.5
    BGP neighbor is 10.10.10.5, remote AS 65010, local AS 65010, internal link
      BGP version 4, remote router ID 10.10.10.5
      BGP state = Established, up for 00:02:48
      Last read 00:02:48, hold time is 180, keepalive interval is 60 seconds
      Neighbor capabilities:
        Route refresh: advertised and received (old and new)
        Address family IPv4 Unicast: advertised and received
      Received 13 messages, 0 notifications, 0 in queue
      Sent 16 messages, 3 notifications, 0 in queue
      Route refresh request: received 0, sent 2
      Minimum time between advertisement runs is 5 seconds

     For address family: IPv4 Unicast
      BGP table version 6, neighbor version 6
      Index 1, Offset 0, Mask 0x2
      Route-Reflector Client
      Community attribute sent to this neighbor (both)
      1 accepted prefixes
      10 announced prefixes
    ...

### ASコンフェデレーション

ASコンフェデレーションは、大きなASを複数の「サブAS」に分割することで、iBGPセッション数を削減するための仕組みです（RFC3065）。
次図の左側は、あるAS（65010）内における通常のフルメッシュ構成を示しています。ここでは、iBGPスピーカーが5台あるため、合計10本のBGPセッションが必要になります。ここで、AS 65010を2つのサブAS「65011」と「65012」に分割し、全体をASコンフェデレーション「65010」として設定すると、右側のような構成となり、必要なセッション数は5本に削減されます。

サブAS「65011」「65012」間は、コンフェデレーションeBGP（C-eBGP）と呼ばれる特殊なeBGPセッションで接続しています。サブASはコンフェデレーションの中からしか見えず、コンフェデレーションの外部（図ではルーターF）からは単一のAS（ここではAS 65010）として見えます。
ASコンフェデレーションを使用するために必要な設定項目を示します。
Note

ASコンフェデレーションを使用する場合は、コンフェデレーション内のすべてのBGPスピーカーにASコンフェデレーションの設定をする必要があります。

- サブASの番号を自AS番号として設定する（router bgpコマンド）。

      awplus(config)# router bgp 65012
      awplus(config-router)#

- ASコンフェデレーションの番号を指定する（bgp confederation identifierコマンド）。

      awplus(config-router)# bgp confederation identifier 65010

- ピアを設定するときは次のようにする（neighbor remote-asコマンド）。
  - ASコンフェデレーション内のピアを指定するときは、remote-asパラメーターにピアのサブAS番号を指定する。
    サブAS番号が同じピアは、iBGPピアとなる。

        awplus(config-router)# neighbor 10.10.10.2 remote-as 65012

    サブAS番号が異なるピアを指定する場合は、neighbor remote-asコマンドの前に、bgp confederation peersコマンドを実行して、ピアのサブAS番号を指定する。このようにして設定したピアは、コンフェデレーションeBGPピア（C-eBGPピア）となる。

        awplus(config-router)# bgp confederation peers 65011
        awplus(config-router)# neighbor 10.10.10.1 remote-as 65011

  - ASコンフェデレーション外部のピアを指定するときは、remote-asパラメーターにピアのAS番号を指定する。このピアは、eBGPピアとなる。

        awplus(config-router)# neighbor 10.10.10.8 remote-as 65080

show ip bgp neighborsコマンドの「BGP neighbor is」行では、通常のeBGPピア、コンフェデレーションeBGPピア（C-eBGPピア）のどちらとも「external link」と表示されますが、C-eBGPピアのときは少し下の方に「Neighbor under common administration」という一行が表示されます。

- iBGPピアの場合は「internal link」と表示される。「remote AS」にはiBGPピアの所属するサブAS番号、「local AS」には自分の所属するサブAS番号が表示される。

      awplus> show ip bgp neighbors 10.10.10.2
      BGP neighbor is 10.10.10.9, remote AS 65012, local AS 65012, internal link
        BGP version 4, remote router ID 10.10.10.2
        BGP state = Established, up for 00:48:23
      ...

- コンフェデレーションeBGPピア（C-eBGPピア）の場合は「external link」と表示され、少し下のほうに「Neighbor under common administration」という一行が表示される。「remote AS」にはC-eBGPピアの所属するサブAS番号、「local AS」には自分の所属するサブAS番号が表示される。

      awplus> show ip bgp neighbors 10.10.10.1
      BGP neighbor is 10.10.10.1, remote AS 65011, local AS 65012, external link
        BGP version 4, remote router ID 10.10.10.1
        Neighbor under common administration
        BGP state = Established, up for 00:45:57
      ...

- コンフェデレーション外部の通常のeBGPピアの場合は「external link」と表示される（「Neighbor under common administration」という一行は表示されない）。「remote AS」にはeBGPピアの所属するAS番号、「local AS」には自分の所属するコンフェデレーションAS番号が表示される。

      awplus> show ip bgp neighbors 10.10.10.8
      BGP neighbor is 10.10.10.8, remote AS 65080, local AS 65010, external link
        BGP version 4, remote router ID 10.10.10.8
        BGP state = Established, up for 00:28:07
      ...

show ip bgpコマンドの「Path」欄では、ASコンフェデレーション内のサブAS番号はカッコで囲んで表示されます。

    awplus> show ip bgp regexp .+
    BGP table version is 67, local router ID is 10.10.10.5
    Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
                  S Stale
    Origin codes: i - IGP, e - EGP, ? - incomplete

       Network          Next Hop            Metric LocPrf Weight Path
    *> 172.16.0.0       10.10.10.1               0    100      0 (65011) ?
    *> 172.22.0.0       10.10.10.1               0    100      0 (65011 65013) i
    *> 172.23.0.0       10.10.10.8               0             0 65080 i
    *> 172.24.0.0       10.10.10.8               0             0 65080 65090 i

    Total number of prefixes 4

## その他の機能

### TCP MD5認証

TCP MD5認証は、TCPのオプション機能であるMD5ダイジェスト認証を利用して、BGPセッションの信頼性・安全性を高めるための機能です（RFC2385）。
TCP MD5認証を使用するには、neighbor passwordコマンドでパスワード（認証鍵）を指定します。パスワードはピアと同じ値を指定してください。

    awplus(config)# router bgp 65010
    awplus(config-router)# neighbor 10.10.10.5 password 41e9re10
    awplus(config-router)# neighbor 2001:db8:2222:10::5 password 1i31twoDa4o

### プライベートASフィルター

プライベートASフィルターは、UPDATEメッセージの送信時にAS_PATH属性からプライベートAS番号（64512～65535）を取り除く機能です。
プライベートASフィルターを使用するには、neighbor remove-private-asコマンドでピアごとに設定します。同コマンドを実行すると、該当ピアに送信するUPDATEメッセージのAS_PATH属性からプライベートAS番号が取り除かれます。

    awplus(config-router)# neighbor 10.10.10.8 remote-as 12345
    awplus(config-router)# neighbor 10.10.10.8 remove-private-as

Note

neighbor remove-private-asコマンドはeBGPピアに対してのみ有効です。iBGPピアに対して実行した場合はエラーになります。

プライベートASフィルターの設定は、show ip bgp neighborsコマンドで確認できます。「Private AS number removed from updates to this neighbor」という一行が表示されれば、該当ピアに対するプライベートASフィルターが有効です。

    awplus> show ip bgp neighbors 10.10.10.8

### ピアグループ（ピアテンプレート）

BGPピアグループ（ピアテンプレート）は、共通のフィルタリングポリシーを適用する多数のピアとセッションを張る場合に、設定の手間を軽減するための機能です。
この機能では、複数のBGPピアを「ピアグループ」にまとめておき、通常ピアごとに行う設定（neighbor xxxxコマンドの類）をピアグループに対して行うことで、複数のピアに対して同じ設定を素早く適用することができます。
ピアグループを利用して、BGPピアの設定をする場合の基本的な流れは次のとおりです。

1. ピアグループを作成します。これには、neighbor peer-group(create)コマンドを使います。このコマンドではピアグループに識別子となる名前を付けます。ここでは例として、いくつかのiBGPピアをまとめるピアグループ「INT」を作成します。

       awplus(config-router)# neighbor INT peer-group

2. ピアグループを作成したら、次にピアグループの所属ASを指定します。これには、neighbor remote-asコマンドを使います。単一ピアの設定を行うときは、ピアのIPアドレスを指定しますが、ピアグループの設定を行うときはピアグループの名前を指定します。

       awplus(config-router)# neighbor INT remote-as 65010

3. ピアグループとの経路交換を有効化します。
   ピアグループに対する設定やBGPピアの追加は、経路交換を有効にしていないと行えないためです。
   - IPv4で使用するピアグループの場合は、BGPモードのneighbor activateコマンドを実行してIPv4経路情報の交換を有効化します。

         awplus(config-router)# neighbor INT activate

     Note

     「no bgp default ipv4-unicast」を設定していない場合、この設定は不要です（実行しても問題ありません）。

4. 続いて、ピアグループ所属のBGPピアに適用したい設定をneighbor xxxxコマンドで行います。これらのコマンドでも、ピアのアドレスではなくピアグループの名前を指定します。
   - IPv4で使用するピアグループの場合は、たとえば次のようにします。

         awplus(config-router)# neighbor INT route-map INT_in in
         awplus(config-router)# neighbor INT route-map INT_out out

5. 最後に、ピアグループに所属させたいBGPピアのアドレスを指定します。これには、neighbor peer-group(add)コマンド（BGPモード）を使います。
   - IPv4ピアを追加するには、BGPモードのneighbor peer-group(add)コマンドを使います。

         awplus(config-router)# neighbor 10.0.0.5 peer-group INT
         awplus(config-router)# neighbor 10.0.0.7 peer-group INT
         awplus(config-router)# neighbor 10.0.0.8 peer-group INT

ピアグループからピアを取り除くには、neighbor peer-group(add)コマンド（BGPモード）をno形式で実行します。

    awplus(config-router)# no neighbor 10.0.0.8 peer-group INT

ピアがどのピアグループに所属しているかは、show ip bgp neighborsコマンドで確認できます。「Member of peer-group XXX for session parameters」のような一行が表示されている場合、該当ピアはピアグループ「XXX」に所属しています。また、「XXX peer-group member」のような行も同じことを表しています。

    awplus> show ip bgp neighbors 10.0.0.5
    BGP neighbor is 10.0.0.5, remote AS 65010, local AS 65010, internal link
     Member of peer-group INT for session parameters
      BGP version 4, remote router ID 10.0.0.5
      BGP state = Established, up for 00:03:01
      Last read 00:03:01, hold time is 180, keepalive interval is 60 seconds
      Neighbor capabilities:
        Route refresh: advertised and received (old and new)
        Address family IPv4 Unicast: advertised and received
      Received 7 messages, 0 notifications, 0 in queue
      Sent 8 messages, 0 notifications, 0 in queue
      Route refresh request: received 0, sent 0
      Minimum time between advertisement runs is 5 seconds
      Update source is lo

     For address family: IPv4 Unicast
      BGP table version 5, neighbor version 5
      Index 1, Offset 0, Mask 0x2
      INT peer-group member
    ...

### BGPグレースフルリスタート

BGPグレースフルリスタート機能について説明します。
メンテナンス等で本装置のBGPルーティングプロセスを再起動させると隣接するBGPピアがそれを検出し、本装置が通知した経路情報を自身のルーティングデータベースから削除するため、経路情報の再通知が完了するまでの間、パケット転送が停止します。
BGPで大量の経路情報を管理している場合、経路の再学習に長い時間を要するため、パケット転送の停止状態が予想以上に長くなる場合があります。
BGPグレースフルリスタートは、BGPルーティングプロセスを再起動した場合に、隣接するBGPピアが本装置が通知した再起動前の経路情報を保持することにより、再起動中もパケット転送を継続させる機能です。
BGPグレースフルリスタートでは、BGPルーティングプロセスを再起動させるノードと隣接ピアの再起動を検出した場合に再起動前の経路を保持するノードが存在します。それぞれのノードを設定する場合の基本的な流れは次の通りです。
自身のBGPルーティングプロセスを再起動させるノードを設定する場合の基本的な流れは次の通りです。
なお、以下の例では、BGPピアの基本設定まで（経路情報を交換できる状態まで）は完了しているものと仮定しています。

1. neighbor capability graceful-restartコマンド（BGPモード）を使用し、隣接ピアにBGPグレースフルリスタート機能が有効である旨を通知する設定を行います。

       awplus(config-router)# neighbor 10.10.10.8 capability graceful-restart

2. bgp graceful-restartコマンドを使用し、BGPグレースフルリスタート機能を有効にします。

       awplus(config-router)# bgp graceful-restart

隣接ピアの再起動を検出した場合に経路を保持するノードを設定する場合の基本的な流れは次の通りです。

1. neighbor capability graceful-restartコマンド（BGPモード）を使用し、隣接ピアにBGPグレースフルリスタート機能が有効である旨を通知する設定を行います。

       awplus(config-router)# neighbor 10.10.10.8 capability graceful-restart

2. bgp graceful-restart graceful-resetコマンドを使用し、隣接ピア再起動時に経路情報を保持する設定を行います。

       awplus(config-router)# bgp graceful-restart
       awplus(config-router)# bgp graceful-restart graceful-reset

実際にBGPグレースフルリスタートを実行する場合は、restart bgp gracefulコマンドを使用します。

    awplus# restart bgp graceful

### BGPネクストホップトリガー

BGPネクストホップトリガー機能について説明します。
BGPルーティングプロセスは装置のルーティングテーブルを定期的に確認し、変更があった場合に自プロセスが管理するBGP経路情報にその変更を反映させます。そのため、装置のルーティングテーブルの変更がBGPプロセスに反映されるまでいくらかの遅延が発生します。
BGPネクストホップトリガー機能はこの経路情報の反映プロセスを変更します。本機能を有効にすると装置のルーティングテーブルの更新自体を監視し、更新を検出すると直ちにその変更をBGPの経路情報に反映させます。これにより、IGPなどによる経路変更がBGPルーティングドメインへ少ない遅延で伝わることになります。
その反面、IGPルーティングドメインが不安定な場合、頻繁に発生するIGP経路変更がBGPドメインにそのまま伝播する恐れがあるため、この機能を有効にする際は注意が必要です。本装置では、この問題を軽減するためにルーティングテーブルの変更を検出した際、少し時間を空けてからBGPルーティングデータベースの更新を開始します。また、短期間にルーティングテーブルの変更が多発した場合に一時的にBGPネクストホップトリガー機能を無効にします。
BGPネクストホップトリガー機能を有効にするには、bgp nexthop-trigger enableコマンドを使用します。

    awplus(config)# bgp nexthop-trigger enable

## 設定や状態の確認

BGPの設定や各種状態を確認するコマンドを紹介します。
BGPの全体設定を確認するには、show running-configコマンドでセクション名「bgp」を指定するとよいでしょう。

    awplus# show running-config bgp

フィルタリングに用いる標準IPアクセスリスト、IPプレフィックスリスト、ASパスアクセスリスト、コミュニティーリスト、ルートマップは、それぞれshow running-configコマンドでセクション名「access-list」、「prefix-list」、「as-path access-list」、「community-list」、「route-map」を指定して確認します。

    awplus# show running-config access-list
    awplus# show running-config prefix-list
    awplus# show running-config as-path access-list
    awplus# show running-config community-list
    awplus# show running-config route-map

BGPピアの情報を確認するには、下記のコマンドを使います。

- IPv4で通信しているBGPピアの情報は、show ip bgp neighborsコマンドやshow ip bgp summaryコマンドで確認できます。

      awplus> show ip bgp neighbors
      awplus> show ip bgp summary

BGP経路表を確認するには、下記のコマンドを使います。

- IPv4のBGP経路表は、show ip bgpコマンドで確認できます。

      awplus> show ip bgp

IPv4経路表（RIB）を確認するには下記のコマンドを使います。

- IPv4経路表（IPv4 RIB）は、show ip route databaseコマンドで確認できます。
  IPv4 RIBは各種情報源から得た経路情報を蓄積するデータベースで、この中から管理距離（AD：Administrative Distance）的に最適と判断された経路がシステムのIPv4転送表（IPv4 FIB）に登録されます。

      awplus> show ip route database

IPv4転送表（FIB）を確認するには下記のコマンドを使います。

- IPv4転送表（IPv4 FIB）は、show ip routeコマンドで確認できます。
  IPv4 FIBは、IPv4パケットの転送判断時に参照するデータベースで、各宛先に対する最適な経路だけが登録されています。

      awplus> show ip route