BGPのピアの間では、どんなメッセージがやり取りされているのでしょうか。この記事では、R1とR2の間で動いている内部BGP(iBGP)の通信をWiresharkでキャプチャし、メッセージの種類ごとに中身を確認します。エラー時に送られるNOTIFICATIONも、実際にエラーを起こして見てみます。
- BGPのセッションがTCP 179の上で張られる様子(TTL・DSCP)
- OPEN・UPDATE・KEEPALIVE の各メッセージで確認すべき項目
- NOTIFICATION のエラーコードの読み方(AS番号の不一致、ホールドタイム)
検証構成とメッセージの全体像
R1とR2は同じAS 12に属し、192.168.12.0/24で直結しています。iBGPのピアは、この直結リンクのアドレス同士で張っています。
BGPのメッセージは4種類で、どれも共通のヘッダ(Marker 16バイト、Length 2バイト、Type 1バイトの計19バイト)から始まります。キャプチャでは、Typeの番号でメッセージの種類を見分けられます。
| Type | メッセージ | 役割 |
|---|---|---|
| 1 | OPEN | セッション開始時に、バージョン・AS番号・ホールドタイム・ルータIDを伝える |
| 2 | UPDATE | 経路の広告と取り消し |
| 3 | NOTIFICATION | エラーを伝え、セッションを切断する |
| 4 | KEEPALIVE | セッションが生きていることを定期的に伝える(OPENへの応答にも使う) |
この記事のキャプチャ画面は、実際の画面ではなく、検証時のキャプチャ結果から確認すべき項目を抜き出して描いたイメージです。Wiresharkのバージョンや設定によって、表示の並びや表記は変わります。
TCPセッションの確立
BGPはTCPの179番ポートでセッションを張ります。まずR1からR2の179番へSYNが送られ、3ウェイハンドシェイクでTCPセッションが確立すると、その上でBGPのメッセージがやり取りされます。
| No. | Source | Destination | Protocol | Info |
|---|---|---|---|---|
| 14 | 192.168.12.1 | 192.168.12.2 | TCP | 25827 → 179 [SYN] |
| 15 | 192.168.12.2 | 192.168.12.1 | TCP | 179 → 25827 [SYN, ACK] |
| 16 | 192.168.12.1 | 192.168.12.2 | TCP | 25827 → 179 [ACK] |
▾ Internet Protocol Version 4, Src: 192.168.12.1, Dst: 192.168.12.21 Differentiated Services Field: 0xc0 (DSCP: CS6, ECN: Not-ECT)2 Time to live: 255 Protocol: TCP (6)3▸ Transmission Control Protocol, Src Port: 25827, Dst Port: 179
| No. | 表示 | 意味 |
|---|---|---|
| 1 | DSCP: CS6 | ルーティングプロトコルの通信として、優先度の高いCS6でマーキングされています。QoSを設定している環境では、データ通信より優先して扱われます。 |
| 2 | Time to live: 255 | iBGPのパケットはTTL 255で送られます。eBGPは既定でTTL 1なので、直結していない相手とeBGPを張るには ebgp-multihop などの設定が必要です。 |
| 3 | Dst Port: 179 | BGPの宛先ポートです。送信元ポート(25827)はランダムに選ばれます。 |
DSCPとTTLは、TCPではなくIPヘッダの項目です。
OPENメッセージ
TCPセッションが確立すると、最初にOPENメッセージを交換します。お互いのバージョン、AS番号、ホールドタイム、ルータIDを伝え合い、内容に問題がなければKEEPALIVEを返して受け入れます。下はR1が送ったOPENです。
| No. | Source | Destination | Protocol | Info |
|---|---|---|---|---|
| 17 | 192.168.12.1 | 192.168.12.2 | BGP | OPEN Message |
▾ Border Gateway Protocol - OPEN Message Marker: ffffffffffffffffffffffffffffffff Length: 57 Type: OPEN Message (1)1 Version: 42 My AS: 123 Hold Time: 1804 BGP Identifier: 1.1.1.1 Optional Parameters Length: 28 ▸ Optional Parameters
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Version: 4 | BGPのバージョン。現在使われているのはBGP-4です。 |
| 2 | My AS: 12 | 送信元のAS番号。相手の neighbor … remote-as と一致しないと、セッションは確立しません(後述のNOTIFICATION)。 |
| 3 | Hold Time: 180 | メッセージが届かなくなってからセッションを切るまでの秒数。Ciscoの既定は180秒で、両者の値のうち小さい方が使われます。 |
| 4 | BGP Identifier: 1.1.1.1 | ルータID。bgp router-id で指定していなければ、ループバックの中で最も大きいアドレス(ループバックがなければ有効なインターフェースの最も大きいアドレス)が選ばれます。相手と同じルータIDだとネイバーが確立できません。 |
UPDATEメッセージ
UPDATEメッセージは、経路の広告と取り消しに使います。広告する経路はNLRI(Network Layer Reachability Information)、取り消す経路はWithdrawn Routesに入ります。R2のループバックを広告・取り消しして、それぞれの中身を比べます。
経路を広告する
R2
R2(config)#router bgp 12
R2(config-router)#network 2.2.2.2 mask 255.255.255.255
| No. | Source | Destination | Protocol | Info |
|---|---|---|---|---|
| 6 | 192.168.12.2 | 192.168.12.1 | BGP | UPDATE Message |
▾ Border Gateway Protocol - UPDATE Message Marker: ffffffffffffffffffffffffffffffff Length: 56 Type: UPDATE Message (2)1 Withdrawn Routes Length: 02 Total Path Attribute Length: 28 ▸ Path attributes3 ▾ Network Layer Reachability Information (NLRI) 2.2.2.2/32 (NLRI prefix length: 32, NLRI prefix: 2.2.2.2)
経路を取り消す
R2
R2(config)#router bgp 12
R2(config-router)#no network 2.2.2.2 mask 255.255.255.255
| No. | Source | Destination | Protocol | Info |
|---|---|---|---|---|
| 5 | 192.168.12.2 | 192.168.12.1 | BGP | UPDATE Message |
▾ Border Gateway Protocol - UPDATE Message Marker: ffffffffffffffffffffffffffffffff Length: 28 Type: UPDATE Message (2)1 Withdrawn Routes Length: 52 ▾ Withdrawn Routes 2.2.2.2/32 (Withdrawn route prefix length: 32, Withdrawn prefix: 2.2.2.2)3 Total Path Attribute Length: 0
2つのUPDATEを並べると、使っている欄の違いがはっきりします。
| 項目 | 広告(図5) | 取り消し(図6) |
|---|---|---|
| Withdrawn Routes Length | 0(取り消す経路なし) | 5(2.2.2.2/32 の1件) |
| Total Path Attribute Length | 28(パス属性あり) | 0(パス属性なし) |
| 経路が入る場所 | NLRI:2.2.2.2/32 | Withdrawn Routes:2.2.2.2/32 |
取り消しのUPDATEを受け取ったR1は、2.2.2.2/32 をBGPテーブルから削除します。
KEEPALIVEメッセージ
KEEPALIVEは、セッションが生きていることを相手に伝えるために定期的に送るメッセージです。Ciscoの既定では60秒ごとに送り、ホールドタイム(既定180秒)の間に何も届かなければセッションを切断します。セッションが切れると、その相手から学習した経路はすべて使えなくなります。
| No. | Source | Destination | Protocol | Info |
|---|---|---|---|---|
| 5 | 192.168.12.1 | 192.168.12.2 | BGP | KEEPALIVE Message |
▾ Border Gateway Protocol - KEEPALIVE Message Marker: ffffffffffffffffffffffffffffffff1 Length: 192 Type: KEEPALIVE Message (4)
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Length: 19 | KEEPALIVEには本体がなく、共通ヘッダ(19バイト)だけで送られます。 |
| 2 | Type: KEEPALIVE Message (4) | メッセージの種類。Typeの番号は前述の表のとおりです。 |
キープアライブ間隔は、ホールドタイムの1/3にするのが一般的です。
NOTIFICATIONメッセージ
エラーを検出したルータは、NOTIFICATIONメッセージでエラーの種類(Major error Code)と詳細(Minor error Code)を相手に伝え、セッションを切断します。ここでは2つのエラーを起こして確認します。
AS番号の不一致
R2の remote-as を、わざと違う番号(1212)にします。
R1
R1(config)#router bgp 12 R1(config-router)#neighbor 192.168.12.2 remote-as 12
R2
R2(config)#router bgp 12
R2(config-router)#neighbor 192.168.12.1 remote-as 1212
R2はAS 1212からのOPENを待っていますが、R1のOPENには「My AS: 12」と書かれています。R2はこれをエラーと判断してNOTIFICATIONを送り、両方のルータにログが出ます。
R2: *May 5 03:03:37.430: %BGP-3-NOTIFICATION: sent to neighbor 192.168.12.1 passive 2/2 (peer in wrong AS) 2 bytes 000C
R1 *May 5 03:03:37.430: %BGP-3-NOTIFICATION: received from neighbor 192.168.12.2 active 2/2 (peer in wrong AS) 2 bytes 000C
| No. | Source | Destination | Protocol | Info |
|---|---|---|---|---|
| 29 | 192.168.12.2 | 192.168.12.1 | BGP | NOTIFICATION Message |
▾ Border Gateway Protocol - NOTIFICATION Message Marker: ffffffffffffffffffffffffffffffff Length: 23 Type: NOTIFICATION Message (3)1 Major error Code: OPEN Message Error (2)2 Minor error Code (Open Message): Bad Peer AS (2)3 Bad Peer AS: 12
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Major error Code: OPEN Message Error (2) | OPENメッセージの内容に問題があったことを示します。ログの「2/2」の左側です。 |
| 2 | Minor error Code: Bad Peer AS (2) | 相手のAS番号が想定と違うことを示します。ログの「2/2」の右側(peer in wrong AS)です。 |
| 3 | Bad Peer AS: 12 | 受け取ったAS番号。ログ末尾の「000C」は12の16進表記です。 |
受け入れられないホールドタイム
次はホールドタイムのエラーです。まず、タイマーの設定方法を確認しておきます。
BGPプロセス全体のタイマーを変更する場合
R2(config-router)#timers bgp Keepalive Holdtime
ネイバーごとにタイマーを変更する場合
R2(config-router)#neighbor 192.168.12.1 timers Keepalive Holdtime
R1とR2のネイバーが確立した状態で、R2のキープアライブを5秒、ホールドタイムを15秒にします。ホールドタイムが20秒未満だと、ピアのフラッピングが起きやすくなるという警告が出ますが、設定自体は反映されます。
R2(config-router)#timers bgp 5 15
% Warning: A hold time of less than 20 seconds increases
the chances of peer flapping
タイマーの変更は、セッションを張り直したときに反映されます。セッションをクリアします。
R2#clear ip bgp * *May 5 03:26:54.973: %BGP-5-ADJCHANGE: neighbor 192.168.12.1 Down User reset *May 5 03:26:54.973: %BGP_SESSION-5-ADJCHANGE: neighbor 192.168.12.1 IPv4 Unicast topology base removed from session User reset *May 5 03:26:55.126: %BGP-5-ADJCHANGE: neighbor 192.168.12.1 Up
R2#show ip bgp neighbors
BGP neighbor is 192.168.12.1, remote AS 12, internal link
BGP version 4, remote router ID 1.1.1.1
BGP state = Established, up for 00:00:09
Last read 00:00:00, last write 00:00:03, hold time is 15, keepalive interval is 5 seconds
R1#show ip bgp neighbors
BGP neighbor is 192.168.12.2, remote AS 12, internal link
BGP version 4, remote router ID 2.2.2.2
BGP state = Established, up for 00:06:36
Last read 00:00:01, last write 00:00:03, hold time is 15, keepalive interval is 5 seconds
R1のホールドタイムは既定の180秒のままですが、OPENで交換した値のうち小さいR2の15秒が使われています。キープアライブ間隔も、それに合わせて5秒になっています。
相手が意図せず短いホールドタイムを設定してきた場合に備えて、受け入れるホールドタイムの最小値を timers bgp の3つ目の値で指定できます。R1で最小値を30秒にします。
R1(config-router)#timers bgp 60 180 ?
<0-65535> Minimum hold time from neighbor
R1(config-router)#timers bgp 60 180 30
R1でセッションをクリアすると、R2のホールドタイム15秒が最小値30秒を下回るため、R1がNOTIFICATIONを送り、セッションが確立しなくなります。
R1#clear ip bgp *
R1#
*May 5 06:14:48.479: %BGP-5-ADJCHANGE: neighbor 192.168.12.2 Down User reset
*May 5 06:14:48.480: %BGP_SESSION-5-ADJCHANGE: neighbor 192.168.12.2 IPv4 Unicast topology base removed from session User reset
*May 5 06:14:49.025: %BGP-3-NOTIFICATION: sent to neighbor 192.168.12.2 active 2/6 (unacceptable hold time) 0 bytes
| No. | Source | Destination | Protocol | Info |
|---|---|---|---|---|
| 7 | 192.168.12.1 | 192.168.12.2 | BGP | NOTIFICATION Message |
▾ Border Gateway Protocol - NOTIFICATION Message Marker: ffffffffffffffffffffffffffffffff Length: 21 Type: NOTIFICATION Message (3)1 Major error Code: OPEN Message Error (2)2 Minor error Code (Open Message): Unacceptable Hold Time (6)
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Major error Code: OPEN Message Error (2) | OPENメッセージの内容に問題があったことを示します(ログの「2/6」の左側)。 |
| 2 | Minor error Code: Unacceptable Hold Time (6) | 受け入れられないホールドタイムだったことを示します(ログの「2/6」の右側)。 |
RFC 4271では、ホールドタイムは0(KEEPALIVEを送らない)か3秒以上と決められています。極端に短い値はセッションが不安定になる原因になるので、変更するときは両側の値と最小値の設定をあわせて確認してください。
キャプチャで確認するポイント
BGPのセッションが張れない、経路が届かないといったときは、どのメッセージのどの項目を見ればよいかを決めておくと切り分けが早くなります。
| 症状 | 見るメッセージ | 確認すること |
|---|---|---|
| セッションが張れない | TCP(SYN) | 179番宛てのSYNが出ているか、SYN-ACKが返ってきているか |
| 張ろうとしてすぐ切れる | OPEN、NOTIFICATION | My AS、Hold Time、BGP Identifier の値と、NOTIFICATION の Major / Minor error Code |
| 経路が届かない・消えない | UPDATE | NLRI に広告したい経路が入っているか、Withdrawn Routes に入っていないか |
| セッションが一定時間で切れる | KEEPALIVE | KEEPALIVE が間隔どおりに届いているか、ホールドタイムが短すぎないか |
まとめ
| メッセージ | キャプチャで見たポイント |
|---|---|
| TCP | 宛先ポート179、iBGPはTTL 255、DSCP CS6 |
| OPEN(Type 1) | Version 4、My AS 12、Hold Time 180、BGP Identifier 1.1.1.1 |
| UPDATE(Type 2) | 広告はNLRI、取り消しはWithdrawn Routes に 2.2.2.2/32 |
| KEEPALIVE(Type 4) | ヘッダだけの19バイト。既定は60秒間隔 |
| NOTIFICATION(Type 3) | Bad Peer AS(2/2)、Unacceptable Hold Time(2/6) |
メッセージの中身を一度見ておくと、ルータのログに出る「2/2」のようなコードや、show コマンドの値が何を意味しているかがつながって理解しやすくなります。
コメント