【BGP】ルータ間通信をキャプチャしてみた

 R1〜R2間の内部BGPで送信されているBGPメッセージをキャプチャしてみます。

 まずは、ルータ間でTCPセッションが確立されます。その後、BGPの通信が行われます。BGP通信(メッセージ)の種類は、OPEN、UPDATE、KEEPALIVE NOTIFICATION の4種類があります。

スポンサーリンク

TCPセッションの確立

 ルータ間でTCPの3ハンドシェイクを結びます。

 R1からR2に対して、TCP 179番ポートを使って、SYNパケットを発行し、R2とセッションを確立しています。また、TTL(Time to live)の値が255 です。これは、複数ホップ先のルータともBGPセッションを確立できることを意味します。これは内部BGPの特徴で、外部BGPでは、デフォルトでTTLの値は1です。あと、DSCP値はCS6にマーキングされています。これはルーティング関連の通信をその他通信より優先するためです。

スポンサーリンク

OPENメッセージ

TCPセッションが確立されると、OPENメッセージが送信されます。これにより、各種パラメータを交換します。

  • バージョン
  •  現在のバージョンは4です。

  • AS番号
  •  自身のAS番号を通知します。対向のルータで設定されているAS番号と一致しないと、ネイバーは確立できません。neighborコマンドの設定ミスなどが不一致の原因と考えられます

  • ホールドタイマ
  •  対向のルータからBGPメッセージを受信しない場合、対向のルータがダウンしたと判断し、BGPセッションを破棄するまでの時間です。Ciscoルータのホールドタイマのデフォルト値は180秒です。対向ルータと比べて、小さい方の値を採用します。ホールドタイムをクリアするため、定期的にKEEPALIVEメッセージが送信されます。KEEPALAIVEの間隔はホールドタイマの3分の1(今回は60秒)です。

  • ルータID
  •  自身のルータIDを通知します。これは、自身を一意に特定するIDで、bgp router-idコマンドで設定するか、インタフェースに設定されたIPアドレスの最高の値(物理アドレスよりループバックアドレスが優先)が選定されます。
    対向のルータIDと重複すると、ネイバーは確立できません。

    スポンサーリンク

    UPDATEメッセージ

     BGPルートの更新メッセージです。BGPルートを広告する際に、このUPDATEメッセージが使用されます。例えば、R2のループバックアドレスをR1へアドバタイズした際に次のようなメッセージが送信されます。

    R2(config)#router bgp 12
    R2(config-router)#network 2.2.2.2 mask 255.255.255.255
    

     キャプチャデータを見ると、Network Layer Reachability Information(NLRI)という言葉があります。これは、BGPで利用可能な経路情報という意味です。R2からの2.2.2.2/32の経路情報をUPDATEメッセージとして、R1に広告しています。

     では、次に、R2からR1へのループバックアドレスの広告を停止した場合は、どのようなメッセージが流れるのか確認してみます。

    R2(config)#router bgp 12
    R2(config-router)#no network 2.2.2.2 mask 255.255.255.255
    

     Withdraw(撤退する)メッセージで、R2のループバックアドレスが到達不可であることを通知しています。R1は、学習していた2.2.2.2/32の経路情報をBGPテーブルから削除します。

    スポンサーリンク

    KEEPALIVEメッセージ

     ネイバー関係維持のため、定期的なKEEPALIVEメッセージを送信します。このメッセージに対して、対向ルータが応答することで、ネイバー関係が継続して維持されます。送信間隔はCiscoのデフォルト値で60秒です。

    スポンサーリンク

    NOTIFICATIONメッセージ

    エラー通知で使用されます。R1とR2間でBGPネイバー間でエラーが出るように設定し、エラー通知を発生させてみます。

    AS番号の不一致

    R1とR2で設定したリモートAS番号を不一致にしてみます。この場合は、ネイバーが張れません。

    R1(config)#router bgp 12
    R1(config-router)#neighbor 192.168.12.2 remote-as 12
    
    R2(config)#router bgp 12
    R2(config-router)#neighbor 192.168.12.1 remote-as 1212
    

    デフォルトでは、コンソール上に以下のログが出力されます

    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
    

    以下のパケットキャプチャは、上記のR2からR1に送信されたNOTIFICATIONメッセージで、誤ったAS番号であることが通知されています。

    受け入れられないホールドタイム

     R1とR2間のネイバーが張れた状態で、R2のホールドタイムを変更します。

     BGPプロセス全体のタイマーを変更するには、

    R2(config-router)#timers bgp  Keepalive  Holdtime 

     ネイバーごとにタイマーを変更するには、

    R2(config-router)#neighbor 192.168.12.1 timers Keepalive  Holdtime 

     R2のキープアライブを5秒に、ホールドタイム15秒に設定します。

    R2(config-router)#timers bgp 5 15
    % Warning: A hold time of less than 20 seconds increases
      the chances of peer flapping
    

     20 秒を下回るホールドタイムによりピアのフラッピング機会が増加する旨の警告メッセージが出力される場合があります。ただし、設定自体は反映されます。

    では、BGPセッションをクリアして、新しいホールドタイムが反映されるか確認します。

    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秒ですが、値が小さいR2の15秒が採用されています。

     対向のルータが予期せず小さいホールドタイムを設定した場合に備えて、ホールドタイムの最小値をtimers bgpコマンドのオプションで設定できます。

    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のBGPセッションをクリアし、BGPセッションを張り直します。 R2のホールドタイムはR1で設定した最小値を下回る15秒のため、エラーとなり、BGPセッションが張れません。

    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キャプチャを見ると、R1からR2にNOTIFICATIONメッセージにて、Unacceptable Hoid Time として、エラーを通知しています。

    その他 BGP関連記事は   >>  ルーティングプロトコル(BGP)まとめ << より参照できます。

    コメント