BGPメッセージをキャプチャして解析してみた

BGPのピアの間では、どんなメッセージがやり取りされているのでしょうか。この記事では、R1とR2の間で動いている内部BGP(iBGP)の通信をWiresharkでキャプチャし、メッセージの種類ごとに中身を確認します。エラー時に送られるNOTIFICATIONも、実際にエラーを起こして見てみます。

この記事でわかること
  1. BGPのセッションがTCP 179の上で張られる様子(TTL・DSCP)
  2. OPEN・UPDATE・KEEPALIVE の各メッセージで確認すべき項目
  3. NOTIFICATION のエラーコードの読み方(AS番号の不一致、ホールドタイム)

検証構成とメッセージの全体像

R1とR2は同じAS 12に属し、192.168.12.0/24で直結しています。iBGPのピアは、この直結リンクのアドレス同士で張っています。

AS 12 Lo0 Lo0 1.1.1.1/32 2.2.2.2/32 R1 R2 .1 .2 192.168.12.0/24 iBGP(TCP 179)
図1 検証構成

BGPのメッセージは4種類で、どれも共通のヘッダ(Marker 16バイト、Length 2バイト、Type 1バイトの計19バイト)から始まります。キャプチャでは、Typeの番号でメッセージの種類を見分けられます。

Typeメッセージ役割
1OPENセッション開始時に、バージョン・AS番号・ホールドタイム・ルータIDを伝える
2UPDATE経路の広告と取り消し
3NOTIFICATIONエラーを伝え、セッションを切断する
4KEEPALIVEセッションが生きていることを定期的に伝える(OPENへの応答にも使う)
R1 R2 TCP 3ウェイハンドシェイク(宛先ポート179)OPENバージョン・AS番号・ホールドタイム・ルータIDKEEPALIVEOPENを受け入れた応答UPDATE2.2.2.2/32 の広告・取り消しKEEPALIVE定期的に送信NOTIFICATION(エラー時)
図2 R1とR2の間でやり取りされるメッセージの流れ(今回の検証で見た順番)
画面イメージについて

この記事のキャプチャ画面は、実際の画面ではなく、検証時のキャプチャ結果から確認すべき項目を抜き出して描いたイメージです。Wiresharkのバージョンや設定によって、表示の並びや表記は変わります。

TCPセッションの確立

BGPはTCPの179番ポートでセッションを張ります。まずR1からR2の179番へSYNが送られ、3ウェイハンドシェイクでTCPセッションが確立すると、その上でBGPのメッセージがやり取りされます。

パケットキャプチャ(Wireshark)画面イメージ
No.SourceDestinationProtocolInfo
14192.168.12.1192.168.12.2TCP25827 → 179 [SYN]
15192.168.12.2192.168.12.1TCP179 → 25827 [SYN, ACK]
16192.168.12.1192.168.12.2TCP25827 → 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
図3 TCPセッション確立時のパケット(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1DSCP: CS6ルーティングプロトコルの通信として、優先度の高いCS6でマーキングされています。QoSを設定している環境では、データ通信より優先して扱われます。
2Time to live: 255iBGPのパケットはTTL 255で送られます。eBGPは既定でTTL 1なので、直結していない相手とeBGPを張るには ebgp-multihop などの設定が必要です。
3Dst Port: 179BGPの宛先ポートです。送信元ポート(25827)はランダムに選ばれます。

DSCPとTTLは、TCPではなくIPヘッダの項目です。

OPENメッセージ

TCPセッションが確立すると、最初にOPENメッセージを交換します。お互いのバージョン、AS番号、ホールドタイム、ルータIDを伝え合い、内容に問題がなければKEEPALIVEを返して受け入れます。下はR1が送ったOPENです。

パケットキャプチャ(Wireshark)画面イメージ
No.SourceDestinationProtocolInfo
17192.168.12.1192.168.12.2BGPOPEN 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
図4 OPENメッセージ(R1 → R2)(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1Version: 4BGPのバージョン。現在使われているのはBGP-4です。
2My AS: 12送信元のAS番号。相手の neighbor … remote-as と一致しないと、セッションは確立しません(後述のNOTIFICATION)。
3Hold Time: 180メッセージが届かなくなってからセッションを切るまでの秒数。Ciscoの既定は180秒で、両者の値のうち小さい方が使われます。
4BGP 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
パケットキャプチャ(Wireshark)画面イメージ
No.SourceDestinationProtocolInfo
6192.168.12.2192.168.12.1BGPUPDATE 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)
図5 UPDATEメッセージ:経路の広告(R2 → R1)(実際の画面ではなく、表示内容のポイントを示したイメージです)

経路を取り消す

R2

R2(config)#router bgp 12
R2(config-router)#no network 2.2.2.2 mask 255.255.255.255
パケットキャプチャ(Wireshark)画面イメージ
No.SourceDestinationProtocolInfo
5192.168.12.2192.168.12.1BGPUPDATE 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
図6 UPDATEメッセージ:経路の取り消し(R2 → R1)(実際の画面ではなく、表示内容のポイントを示したイメージです)

2つのUPDATEを並べると、使っている欄の違いがはっきりします。

項目広告(図5)取り消し(図6)
Withdrawn Routes Length0(取り消す経路なし)5(2.2.2.2/32 の1件)
Total Path Attribute Length28(パス属性あり)0(パス属性なし)
経路が入る場所NLRI:2.2.2.2/32Withdrawn Routes:2.2.2.2/32

取り消しのUPDATEを受け取ったR1は、2.2.2.2/32 をBGPテーブルから削除します。

KEEPALIVEメッセージ

KEEPALIVEは、セッションが生きていることを相手に伝えるために定期的に送るメッセージです。Ciscoの既定では60秒ごとに送り、ホールドタイム(既定180秒)の間に何も届かなければセッションを切断します。セッションが切れると、その相手から学習した経路はすべて使えなくなります。

パケットキャプチャ(Wireshark)画面イメージ
No.SourceDestinationProtocolInfo
5192.168.12.1192.168.12.2BGPKEEPALIVE Message
▾ Border Gateway Protocol - KEEPALIVE Message    Marker: ffffffffffffffffffffffffffffffff1    Length: 192    Type: KEEPALIVE Message (4)
図7 KEEPALIVEメッセージ(R1 → R2)(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1Length: 19KEEPALIVEには本体がなく、共通ヘッダ(19バイト)だけで送られます。
2Type: 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
パケットキャプチャ(Wireshark)画面イメージ
No.SourceDestinationProtocolInfo
29192.168.12.2192.168.12.1BGPNOTIFICATION 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
図8 NOTIFICATIONメッセージ:AS番号の不一致(R2 → R1)(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1Major error Code: OPEN Message Error (2)OPENメッセージの内容に問題があったことを示します。ログの「2/2」の左側です。
2Minor error Code: Bad Peer AS (2)相手のAS番号が想定と違うことを示します。ログの「2/2」の右側(peer in wrong AS)です。
3Bad 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 
パケットキャプチャ(Wireshark)画面イメージ
No.SourceDestinationProtocolInfo
7192.168.12.1192.168.12.2BGPNOTIFICATION 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)
図9 NOTIFICATIONメッセージ:受け入れられないホールドタイム(R1 → R2)(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1Major error Code: OPEN Message Error (2)OPENメッセージの内容に問題があったことを示します(ログの「2/6」の左側)。
2Minor error Code: Unacceptable Hold Time (6)受け入れられないホールドタイムだったことを示します(ログの「2/6」の右側)。
補足

RFC 4271では、ホールドタイムは0(KEEPALIVEを送らない)か3秒以上と決められています。極端に短い値はセッションが不安定になる原因になるので、変更するときは両側の値と最小値の設定をあわせて確認してください。

キャプチャで確認するポイント

BGPのセッションが張れない、経路が届かないといったときは、どのメッセージのどの項目を見ればよいかを決めておくと切り分けが早くなります。

症状見るメッセージ確認すること
セッションが張れないTCP(SYN)179番宛てのSYNが出ているか、SYN-ACKが返ってきているか
張ろうとしてすぐ切れるOPEN、NOTIFICATIONMy AS、Hold Time、BGP Identifier の値と、NOTIFICATION の Major / Minor error Code
経路が届かない・消えないUPDATENLRI に広告したい経路が入っているか、Withdrawn Routes に入っていないか
セッションが一定時間で切れるKEEPALIVEKEEPALIVE が間隔どおりに届いているか、ホールドタイムが短すぎないか

まとめ

メッセージキャプチャで見たポイント
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 コマンドの値が何を意味しているかがつながって理解しやすくなります。

コメント