BGPむずかしい

この記事はOIC ITCreate Club Advent Calendar 2016 24日目の記事です。

www.adventar.org

BGP難しすぎるのでRFCとかCCOとかinfraexpertとかで色々調べて実際に設定してみました。
ちなみにクリスマス予定ありません。

BGPとは

パスベクトル型のルーティングプロトコルで、インターネットの中核を成すものです。
パスベクトル型では経由するASの数に基いて経路制御を行います。
ルーティングプロトコルにはIGPsとEGPsの2種類があり、BGPは後者に当たります。
IGPs(Interior Gateway Protocols)に分類されるものはRIPやOSPF、IS-ISやCisco独自のEIGRP等様々ですが、
EGPs(Exterior Gateway Protocols)に分類されるものはEGPとBGPしかなく、現在使われているのはBGPのみです。

BGP Message

BGPスピーカ(BGPルータ)間では以下の4種類のメッセージを使用します。

  • OPEN
    TCP接続が確立された際に各側から送信される最初のメッセージです。
    OPENメッセージが受け入れ可能な場合、OPENを確認するKEEPALIVEメッセージが返送されます。

  • UPDATE
    BGPピア間のルーティング情報を転送するために使用されます。
    UPDATEメッセージを受け取った場合もKEEPALIVEのHold Timerはリセットされるそうです。

  • KEEPALIVE
    BGPピアの生存確認メッセージです。
    1秒間に1回以上の送信は禁止されています。

  • NOTIFICATION
    エラー状態が検出されると送信されるメッセージです。
    NOTIFICATIONメッセージが送信された直後にBGP接続は閉じられます。

iBGP & eBGP

内部ASで張るBGPピアをiBGP(InternalBGP)ピアと呼び、
外部ASと張るBGPピアをeBGP(ExternalBGP)ピアと呼びます。
AS内部ではBGPスプリットホライズンによってループ回避がされているため、
iBGPピアの張り方に気を付けないとeBGPのルートが正しく広告されない事があります。
基本的にはiBGPフルメッシュ,Route-Reflector,BGP Confederation等で対応します。
eBGPピアと交換するメッセージはTTL"""1"""のため、対向のピアとは直接接続されている必要があります。
もし対向ピアのアドレスとしてLoopbackI/Fを指定する場合はebgp-multihopでTTLを増やします。
またBGPピアを張る際には送信元I/Fのアドレスと対向ピアの指定するアドレスが一致している必要があるため、
LoopbackI/Fを使用する場合はupdate-sourceで送信元としてLoopbackI/Fを指定します。

Path Attribute

BGPでは最適パス選定の際にPath Attributeを使用します。
選定で使用されるPath Attributeは以下の5つです。
- WEIGHT (Cisco独自)
- LOCAL_PREF
- AS_PATH
- ORIGIN
- MULTI_EXIT_DISC

またローカルルートが生成元であるかどうかも選定に影響します。

Configuration

実際に設定してみます。

f:id:vygorrr:20161223202806p:plain

Objective

上図トポロジに基づき全てのルータ間で通信出来るようにします。
BGPでルートを広告する際はredistribute IGPとnetworkコマンドのみを使用します。
IPアドレスは以下の通りに設定されています。プレフィックスは全て24です。

RTs L0 F0/0 F0/1 F2/0 S1/0 S1/1
R1 1.1.1.1 192.168.13.1 192.168.12.1 - - -
R2 2.2.2.2 192.168.12.2 192.168.24.2 - - -
R3 3.3.3.3 192.168.34.3 192.168.13.3 - - -
R4 4.4.4.4 192.168.24.4 192.168.34.4 - 192.168.124.4 192.168.48.4
R5 5.5.5.5 192.168.56.5 192.168.57.5 - - -
R6 6.6.6.6 192.168.68.6 192.168.56.6 - - -
R7 7.7.7.7 192.168.57.7 192.168.78.7 - - -
R8 8.8.8.8 192.168.78.8 192.168.68.8 - 192.168.48.8 192.168.168.8
R9 9.9.9.9 192.168.109.9 192.168.119.9 - - -
R10 10.10.10.10 192.168.109.10 192.168.102.10 - - -
R11 11.11.11.11 192.168.119.11 192.168.112.11 - - -
R12 12.12.12.12 192.168.112.12 192.168.102.12 192.168.126.12 - 192.168.124.12
R13 13.13.13.13 192.168.135.13 192.168.134.13 - - -
R14 14.14.14.14 192.168.134.14 192.168.146.14 - - -
R15 15.15.15.15 192.168.156.15 192.168.135.15 - - -
R16 16.16.16.16 192.168.146.16 192.168.156.16 192.168.126.16 192.168.168.16 -

Task

  1. 全てのルータでIGPを起動し、適用するI/Fはトポロジの通りにします
    ループバックI/Fも含めます
    RIPはversion2を使用します
    RIPとEIGRPでは自動集約を絶対に切ります
  2. 全てのAS内でiBGPピアをフルメッシュで張ります
    ピアアドレスは対向のLoopbackI/Fを指定します
    AS300内ではBGP Confederationの設定を行い2つのサブASに分割します
    サブAS間でeBGPピアを張る際、ピアアドレスはLoopbackI/Fを指定しても構いません
  3. 全てのAS間でeBGPピアを張ります
    ピアアドレスは対向の物理I/Fを指定します
  4. R4,8,12,16の外部AS側の(Serialで接続している)ネットワークをnetworkコマンドを使用してBGPで広告します
  5. IGPで学習しているルートをR4,8,12,16でBGPに再配布します
  6. BGPテーブルとルーティングテーブルに全てのルートが載っているか確認します

気が向いたらroute-mapを使って経路制御などもやろうと思います。
最後にconfigファイルを載せておきます

github.com

チラシの裏

RIPってデフォルトで自動集約が有効になってるんですね。
R1に外部ASのルートが一生載らなくてブチギレてたら、
自動集約がこっそり有効になってる事をその場で知って余計ブチギレました。
EIGRPみたいにauto-summaryが表示されないので気付きませんでしたね。

自動集約が有効の場合

router rip
 version 2
 network 1.0.0.0
 network 192.168.12.0
 network 192.168.13.0 //❓❓❓❓❓❓❓❓

自動集約が無効の場合

router rip
 version 2
 network 1.0.0.0
 network 192.168.12.0
 network 192.168.13.0
 no auto-summary //👈👈👈👈👎👎👎😠😠😠😠😠😠😠😠😠😠😠😠

f:id:vygorrr:20161223223623j:plain

良いお年をお迎えください。