BGP
BGP
IOS12.2 BGP configuration guide
http://www.cisco.com/univercd/cc/td/doc/product/software/ios122/122cgcr/fipr_c/ipcprt2/1cfbgp.htm
- AS間で使うことを前提に作られたプロトコル。ASを一つのルータと考えるといろいろイメージしやすいかも。
- AS-PATHベクタープロトコル。つまりASがひとつのホップの単位。
- 16bitのAS番号を使用。グローバルなら登録が必要。
- TCP port 179を使用
- IP reachabiltyがあることが必須
- 明示的にneighborを指定
- トリガーアップデート
- 但し、バッチ処理で処理するので数秒遅れるかも
- BGPメッセージ
- OPEN
- BGP capabilityを交換・ネゴ
- UPDATE
- NLRI (Network Length Reachability Information)
- Unfeasible Route
- Path attribute
- KEEPALIVE
- BGP sessionの維持
- default 60s, holdtime 180s
- NOTIFICATION
- エラー時に送出。BGP session切断。
- OPEN
- BGP状態遷移
- Idle (start event待ち)
- Connect (tcp 3 way handshake待ち)
- -> (失敗) Active
- -> (16回失敗) Idleへ
- OpenSent (OPEN送出。peerからのOPEN待ち)
- -> (エラー) Idleへ。 NOTIFICATION送出。
- OpenConfirm (KEEPALIVE送出。peerからの最初のKEEPALIVE待ち)
- -> (エラー) Idleへ。 NOTIFICATION送出。
- Established
- -> (エラー) Idleへ。 NOTIFICATION送出。
- [UPDATE]交換
- Connectに遷移しないときは、IP reachabilityがないかも
- Activeで進まないときは、相手のBGPがあがってない、またはcapabiltyのネゴでNGかも
- BGP attribute
- UPDATEに付与される
- Well-Known Mandatory
- すべてのUPDATEに含まれ、全てのBGPルータで認識される
- Origin (type 1)
- ルーティングアップデートの発生元
- IGP (networkコマンド)
- EGP (いまや使わない?)
- incomplete (redistiribute)
- AS-Path (type code 2)
- 通過したASのリスト
- ループ検出にも使用
- Next-Hop (type code 3)
- ネクストホップルータのIP address
- peerが物理リンクで隣接していると限らないので必須
- Well-Known Discretionary
- すべてのBGPルータが認識しなければいけないが、UPDATEに含まれたり含まれなかったり
- Local-Preference (type code 5)
- ASからの出口を設定
- AS内のみ有効
- iBGP
- Atomic Aggregate (type code 6)
- 経路集約で、詳細情報が欠落されたことを示す
- 経路集約するとつく
- Optional No-Transitive
- オプション扱い
- 他のpeerに伝達されない
- AS越えできない
- Multi_Exit_Discriminator (type code 4)
- ASの入り口ポイントの優先度を他ASに伝える
- 2つのAS間でのみ
- eBGP
- Optional Transitive
- オプション扱い
- 他のpeerに伝達される
- AS越えできる
- Aggregator (type code 7)
- 集約経路を生成したASとルータID
- 経路集約するとつく
- Communities (type code 8)
- 共通の特性を共有する経路をグループ化
- ポリシー実装できるといっても、所詮自分のASのみ。AS依存。他のASとの協業が必要。
- BGPテーブルを作成
- 全てのvalidな経路が蓄積される
- ここから1つのみベストパスが選ばれ、ルーティングテーブルにインストールされる(かも。AD次第)
- BGP経路選択
- ネクストホップへのreachabilityがある経路
- 最大のWeight値
- 最大のLocal-Preference
- 発生元がそのルータ (sh ip bgpでNext-Hop 0.0.0.0となっている経路)
- 最小のAS-Path長
- 最小のOriginコード (IGP(0) < EGP(1) < incomplete(2))
- 最小のMED
- IBGPよりEBGPを優先
- もっとも近いIGP隣接ルータ経由を優先
- もっとも古いルートを優先
- 最小のBGP neighbor router ID
- BGPはベストパスのみネイバーにアドバタイズ
- BGPは一定時間毎にルーティングテーブルをスキャンし、それをもとにBGPテーブルへ経路を追加・削除
- BGPで設定されている経路のみ
- フィルタなどポリシー変更したら、BGPセッションの再確立が必要
- soft-reconfiguration
- IBGPネイバーは基本的にloopbackインターフェースを使用
- neighbor update-source loopback 0
- IGPあるいはstaticで到達可能なこと
- IBGPでもらった経路はIBGPでアドバタイズできない(ループ防止のため)
- Next-hop attributeを変更しない
- EBGPでも、マルチアクセスネットワークの場合はnext-hop変えない
- AS間ネットワークへの到達可能性は?
- IGPにredistribution ?
- neighbor next-hop-self
- 同期原則
- AS間において、信頼性のおけない経路をアドバタイズしてはならないというのが大原則
- 自分のルーティングテーブルにないような経路をアドバタイズしてはいけない
- EBGPでもらった経路は、発生元が信頼して出した経路であるはずなのでそのまま信頼
- IBGPフルメッシュなら、同期原則を無効にしてもいいかな、くらいの感覚
- no synchronaization
- 基本的に無効にしない
- 無効にしても、ルーティングテーブルにないものをnetworkコマンドでいれてもBGPテーブルに入らない。アドバタイズされない。
- IGPがOSPFのとき、iBGPでアドバタイズするBGPピアとOSPFでの発生元のRouter-IDが同じでなければ同期しない。つまり、アドバタイズできない。
- AS間において、信頼性のおけない経路をアドバタイズしてはならないというのが大原則
- IBGPのフルメッシュ問題
- ループ防止のため
- セッション数が大きくなり、処理が重い
- ルートリフレクタ
- ASをクラスタ(小さなエリア)に分割
- 各クラスタにはルートリフレクタ(RR)とルートリフレクタクライアント
- クラスタID(ループ防止のため)
- ルートリフレクタはIBGPでもらった経路をIBGPでアドバタイズできる
- クライアント同士のIBGPセッションのみ切ることが可能
- 設定はRRのみ
- bgp cluster-id
- neighbor route-reflector-client
- 先にcluster-id設定いれること(後で変更不可)
- コンフェデレーション
- ASを複数のコンフェデレーションASに分割
- コンフェデレーションAS内はIBGPフルメッシュ
- ルートリフレクタ使ってもよい
- コンフェデレーションASではプライベートAS使用
- コンフェデレーションAS間はEBGP(Intra-EBGP)
- Local-preference, MED, Next-hopは変更しない
- AS-Pathは変更
- 外部からみたら普通の1つのAS
- ピアグループ
- 設定の簡略化
- ポリシーやパラメータをテンプレート化。ネイバーに適用。
- 処理も軽くなる。
Configuration
- BGPを有効に
- Router(config)# router bgp AS#
- ルータで1つのプロセスのみ
- IPv4とIPv6でAS番号わけることできない
- BGPピアの設定
- Router(config)# neighbor { ip-address | peer-group-name } remote-as AS#
- neighborへのIP reachabilityがあること
- neighbor <ip-addr> ebgp-multihop
- データリンクが隣接していないpeerを指定するとき。IP TTLを1から255に設定。
- network <network-address>
- neighborにadvertiseする経路を指定
- 他のIGPのように、routing protocolをそのネットワークでenableにするという意味ではない!
- 基本はクラスフル
- サブネットでもスーパーネットのどちらもOK
- アドバタイズするネットワークは、必ず到達可能、ルーティングテーブルに存在すること
- 例えば 192.168.1.0/24, 192.168.2.0/24, .... , 192.168.254.0/24を192.168.0.0/16に集約してアドバタイズしたくても、192.168.0.0/16がルーティングテーブルに存在しなければアドバタイズできない
- null 0へスタティックルート書いて、ルーティングテーブルに存在させてしまう。
ip route 192.168.0.0 255.255.0.0 null
- null 0へスタティックルート書いて、ルーティングテーブルに存在させてしまう。
- 例えば 192.168.1.0/24, 192.168.2.0/24, .... , 192.168.254.0/24を192.168.0.0/16に集約してアドバタイズしたくても、192.168.0.0/16がルーティングテーブルに存在しなければアドバタイズできない
- OriginコードはIGP(i)となる
- 同期を無効に。デフォルトは有効。
- Router(config-router)# no synchronization
- Next-hopの変更
- route-mapのset ip next-hop
- Router(config-router)# neighbor ip-address next-hop-self
- IGPからのredistribute
- 危険なので基本的にはしない
- やるときは経路を適切にフィルタする
- Originコードはincomplete(?)
- distribute-list使うとき
- router bgp <AS#>
redistribute <IGP>
distribute-list <ACL#> out <IGP>
!
access-list <ACL#> permit <network>
- router bgp <AS#>
- route-map使うとき
- router bgp <AS#>
redistribute <IGP> route-map <map-tag>
!
route-map <map-tag> permit <seq#>
match ip address <ACL#>
!
access-list <ACL#> permit <network>
- router bgp <AS#>
- 同じaccess-listでも、マッチするかどうかdistribute-listとroute-mapで異なるので注意
- 例えばこんなこと(あとで)
- 集約
- networkコマンドにて
- null 0へのstatic route必要
- aggregate-addressコマンド
- 自動でnull 0へのstatic routeを作成してくれる
- BGPテーブルの中に集約アドレスレンジの中に含まれるアドレスが1つでも存在すればアドバタイズ
- デフォルトでは集約前のアドレスもあわせてアドバタイズされる
- summary-onlyオプション
- 集約アドレスのみアドバタイズ
- 集約アドレス+あるネットワークのみアドバタイズしたい
- suppress-map
- route-mapで一致したネットワークはsuppressする(アドバタイズしない)
- aggregate-address <address> <mask> suppress-map <map-tag>
- aggregate-addressコマンドのオプションなので、すべてのアップデートに適用されてしまう
- unsuppress-map
- route-mapで一致したネットワークはunsuppressする(アドバタイズする)
- neighbor <ip addr> <mask> unsuppress-map <map-tag>
- ピア毎に設定
- suppress-map
- 集約アドレスに対するアトリビュートの再設定
- aggregate-addressコマンドにattribute-mapを追加
- aggregate-address <network> <mask> attribute-map <map-tag>
- aggregate-addressコマンドにattribute-mapを追加
- 集約するとAS-Path情報がなくなってしまい、ループの可能性。いままでのAS-Path情報を含めるにはas-setオプション
- networkコマンドにて
- 経路フィルタ
- ネットワーク番号(ACL使用 )に基づくフィルタ
- Router(config-router)# neighbor { ip-address | peer-group-name } distribute-list acl { in | out }
- ACLの書き方
- standard ACL -> ネットワークアドレスのみ
- extended ACL -> ネットワーク + サブネットマスク
- access-list permit
[source] [wildcard] <- ネットワーク
[destination] [wildcard] <- サブネットマスク - 例) /24以下全部
any 0.0.0.0 255.255.255.0 - 例) /24
any 255.255.255.0 0.0.0.255 - 例) /24以上
any 255.255.255.0 0.0.0.255
- access-list permit
- AS-Pathに基づくフィルタ
- Router(config-router)# neighbor <ip addr> filter-list <AS-ACL#> [in | out]
- Router(config)# ip as-path access-list <AS-ACL#> {permit | deny} <regexp>
- 正規表現で記述
- . : 任意の1文字
- ^ : 列の先頭 (as-pathの先頭。隣接AS)
- $ : 列の終わり (as-pathの最後。originate AS)
- _ : 任意のもの (最初、最後、空白、タブ、カンマ。文字列ではない。通過AS)
- * : 直前の文字がないか1つ以上連続
- 例) 65*1 = 61 or 651 or 6551
- ? : 直前の文字がないか1つだけ存在
- そのままだとhelpになってしまうので、いれるときはctl+vいれてから
- 例) 65?1 = 61 or 651
- + : 直前の文字が1つ以上存在
- 例) 65+1 = 651 or 6551 or ...
- ( ) : 条件をグループ化
- | : または
- [ ] : 中であてはまるもの
- 例) [abc] = a,b,cのいずれか
- 例) [a-d] = a,b,c,dのいずれか
- \ : 次の一文字を特殊文字として扱わない
- 例) \(65001 = (65001
- 例) .* : すべて
- 例) ^$ : このAS
- 例) ^100_ : 隣のAS100から来た
- 例) _100$ : AS100で発生
- 例) _100_ : AS100を通過
- 例) ^[0-9]+$ : 隣接AS
- 例) ^[0-9]+(_[0-9]?$ : 隣接ASとその顧客AS
- 例) ^\(.*\)$ : confederation peerで発生
- Prefix(Network/Len)に基づくフィルタ
- Router(config-router)# neighbor <ip addr> prefix-list <Prefix-list-name> [in | out]
- Router(config)# ip prefix-list <prefix-list-name> seq <sequence#> {permit | deny} <network/len> [ge <ge-value> | le <le-value>]
- geとleで一致させるprefix長の範囲を指定
- 例)全アドレス空間で/16〜/24のエントリ : 0.0.0.0/0 ge 16 le 24
- 例)192.168.1.0/16に完全一致 : 192.168.1.0/16
- 例)192.168.1.0/16のうち/18〜/24のエントリ : 192.168.1.0/16 ge 18 le 24
- 例)クラスB : 128.0.0.0/2 ge 16 le 16
- 例) 0.0.0.0/0 : 0.0.0.0に完全一致
- 例) 0.0.0.0/0 le 32 : = any
- Sequence#は、デフォルトでは5ずつ自動で割り振られる。これやめるには
- Router(config-router)# no ip prefix-list sequence-number
- 1つのネイバーに対し、それぞれin/outひとつずつのみ割り当て可能
- ネットワーク番号(ACL使用 )に基づくフィルタ
- 経路選択コントロール
- 基本的にattributeはデフォルト値で使わない。きっちりポリシーを込める。
- route-map
- ACLの集合体
- matchコマンドで条件
- match 条件1 or 条件2 or 条件3 or ....
- match 条件4 とくると上の行にAND
- matchがないとpermit any
- setコマンドでattribute設定
- set attribute1
- set attribute2
- setがなければ、matchでhitしたものはそのまま通過(なにもしない
- 暗黙のdeny
- 経路コントロールのときは基本的にpermit型。フィルタしたいときはdeny型。
- weight
- そのルータ自身でベストパスを制御
- ネイバー毎にデフォルトのweight設定
- neighbor <ip addr> weight <weight>
- route-map
- local-preference
- AS内全体で使用し、どこから出て行くかに影響
- 受信アップデートに適用
- IBGPネイバーのみ送信
- 全てのネイバーからに適用
- bgp default local-preference <value>
- route-map
- weightのほうが優先される
- AS内で一貫した値を使用
- デフォルト値の変更デフォルトは100
- Router(config-router)# bgp default local-preference value
- MED
- EBGPネイバーに対し、どこから入ったらいいかに影響
- 2つのAS間でのみ有効
- 送信アップデートに適用
- 全てのネイバーに適用
- default-metric <MED>
- route-map
- MEDをもらってどうするか
- 複数の異なるASからのMEDを比較対象にしたい場合
- デフォルトでは、同一ASからきたもののみMED値の比較を行う
- Router(config-router)# bgp always-compare-med
- MEDがついてこなかった経路は無制限の値を持つ(最悪の経路)とする場合
- デフォルトでは、0と認識。つまり最優先経路。IETFでは逆。
- Router(config-router)# bgp bestpath med missing-as-worst
- ConfederationでもMED値を比較する場合
- ConfederationのみMED比較。外部AS(confederationでない)を含むものは比較対象外。
- Router(config-router)# bgp bestpath med confed
- ConfederationのみMED比較。外部AS(confederationでない)を含むものは比較対象外。
- 同一AS内からの経路選択でMED使用
- Router(config-router)# bgp deterministic med
- 複数の異なるASからのMEDを比較対象にしたい場合
- デフォルトMED値を設定
- Router(config-router)# default-metric metric
- AS-Path
- AS-Pathを操作することもできる
- route-mapでAS-pathを追加
- set as-path prepend <AS#> <AS#> ...
- 普通自分のAS#を入れる
- ebgpのみ。ibgpではprependできない。
- AS-Pathを経路選択の条件に含めない
- Router(config-router)# bgp bestpath as-path ignore
- コミュニティ
- 離れたASに対するパス選択に影響
- アップデートにコミュニティタグ(32bit) = attribute
- AS番号(16bit):ローカル識別子(16bit)
- 予約領域: 0x00000000 - 0x0000FFFF, 0xFFFF0000 - 0xFFFFFFFF
- 予約済
- no-export(0xFFFFFF01)
- EBGPネイバーに転送しない
- no-advertise(0xFFFFFF02)
- BGPネイバーに転送しない
- inでかけると自分からアドバタイズしなくなる
- no-export-subconfed(0xFFFFFF03)
- コンフェデレーションASのI-EBGPネイバーに転送しない
- Internet
- any
- none
- コミュニティ除去
- no-export(0xFFFFFF01)
- デフォルトでは送信アップデートで除去される(Optional transitiveなのに)
- neighbor <ip addr> send-community
- Router(config)# ip community-list number { permit | deny } community-number
- route-mapで設定
- set comm-list community-list-number [ delete ]
- deleteオプションで、community-listでひっかけたcommunityを削除
- set community <community>
- community追加するときは、additiveオプション
- AS番号:ローカル識別子フォーマットにするには、ip bgp-community new-format
- デフォルトでは10進表記
- set comm-list community-list-number [ delete ]
- コンフェデレーション
- コンフェデレーションASの設定
- router bpg <AS confederation #>
- プライベートASN
- ほんとのAS設定
- bgp confederation identifier <AS#>
- ネイバーコンフェデレーションASを羅列
- bgp confederation peers <C-AS#> <C-AS#> ......
- コンフェデレーションASの設定
- ルートリフレクタ
- RRのみ設定必要
- Router(config-router)# neighbor { ip-address | peer-group-name } router-reflector-client
- ルートリフレクタが複数ある場合、ループ防止のためにクラスタIDを設定。まず先にこれ設定。
- Router(config-router)# bgp cluster-id cluster-id
- クライアント間での転送を無効に(クライアント間でピアはってるような場合)
- Router(config-router)# no bgp client-to-client reflection
- ピアグループ
- ピアグループテンプレート名
- neighbor <peer-group-name> peer-group
- テンプレートへのパラメータ定義
- neighbor <peer-group-name> weight <weight>
- eighbor <peer-group-name> update-source
- neighbor <peer-group-name> filter-list
- neighbor <peer-group-name> next-hop-self
- neighbor <peer-group-name> remote-as (ibgpの場合)
- などなど
- テンプレートをネイバーに適用
- neighbor <ip addr> peer-group <peer-group-name>
- ネイバーごとのポリシー追加については、入ってくるものについてはネイバー毎にいろいろあるので追加可能
- neighbor <ip addr> filter-list <AS-ACL#> in 等
- ピアグループテンプレート名
- リンクが落ちても、BGPセッションもすぐに落とさないようにする。
- Router(config-router)# no bgp fast-external-fallover
- Conditional Advertisement
- あるネットワークがルーティングテーブルからなくなったら、あるネットワークをアドバタイズ
- non-exist-mapでネットワークを監視(permitで書く)し、それがなくなったらadvertise-mapで指定(permitで書く)したネットワークをアドバタイズ
- もちろんadvertise-mapでアドバタイズするルートはルーティングテーブルに存在していること
- Router(config-router)# neighbor ip-address advertise-map map1 non-exist-map map2
- 確認(現在アドバタイズしているかどうか)はshow ip bgp neighborでわかる
- ピアの認証。MD5によるパスワード認証。
- Router(config-router)# neighbor ip-address password password
- ピアの接続を無効に(設定いれたまま)
- Router(config-router)# neighbor ip-address shutdown
- Backdoor Route
- ローカルのネットワークと認識されるが、ebgpピアにはアドバタイズされない
- ADが200になる
- Router(config-router)# network ip-address backdoor
- 例えば、ebgpのピアリングでloopback使い、そのloopbackアドレスがIGPとebgpでアドバタイズされていると、ebgpでIGPが書き換えられるのでピアが落ちる=フラップしてしまう。これを防ぐために、backdoorとしてbgpに注入
- Table Map
- BGPルートをIP routing tableに入れる際に、メトリック、Next-hopなどを変更
- Router(config-router)# table-map route-map
- ADの変更
- Router(config-router)# distance bgp external-distance internal-distance local-distance
- デフォルトは20 200 200
- タイマの変更
- 全体での変更
- Router(config-router)# timers bgp keepalive holdtime
- ピア毎に変更
- Router(config-router)# neighbor ip-address timers keepalive holdtime
- 全体での変更
- デフォルトルート(0.0.0.0)のreditribution
- デフォルトでは0.0.0.0はredistributeできない。これを許可するには
- Router(config-router)# default-information originate
- デフォルトルートを持っていなくても、peerに対しデフォルト流せる
- Router(config-router)# neighbor ip-address default-originate
- デフォルトでは0.0.0.0はredistributeできない。これを許可するには
- Route Dumpening
- 不安定なフラップする経路を監視し、ある閾値を越えたらその経路を使わない、アドバタイズしない
- Router(config-router)# bgp dampening
- Router(config-router)# bgp dampening half-life reuse suppress max-suppress [ route-map map ]
- half-life : 一回のフラップでペナルティ1000がつき、このペナルティが半分になる時間。デフォルト15分。
- reuse : ペナルティがこの値を下回ったらこの経路を使用。デフォルト750。
- suppress : ペナルティがこの値を上回ったらこの経路を使用しない。デフォルト2000。
- max-suppress : 経路を使用しない最大時間。デフォルトはhalf-lifeの4倍。60分。
Tips
- iBGPでNLRIのRedundancy...というような意味合いのものがでたら、route-reflectorを複数設定。クライアントを複数のRRに接続し、redundancyを作る。このときcluster-idをまず先に入れること。
- ロードバランスしろといわれたらloopbackでピアリング。経路選択を最後までもつれさす
- iBGPのルートはIGPにredistributeできない
- Router(config-router)# bgp redistribute-internal
- でできるようにはなるが、ループになるので通常しない
- 発生元のASを返る
- confederation
- もし発生元がPrivate ASなら、neighbor remove-private-as で削除できる!
- ピアリングするときのASを違うものにみせる
- confederation
- neighbor local-as as#
- private ASを取り除く
- private ASを除いてアドバタイズしたpeerに対し、
- Router(config-router)# neighbor ip-address remove-private-as
- private ASを除いてアドバタイズしたpeerに対し、
Debug
- show ip bgp summary
- peerの状況のサマリ
- memoryの使用状況も見れる
- show ip bgp
- bgpテーブルの内容
- show ip bgp regexp
- 正規表現つかって抽出
- show ip bgp filter-list <AS-ACL#>
- AS-Path ACLの条件で抽出
- show ip bgp neighbor x.x.x.x received
- ネイバーから受信した経路
- neighbor soft-reconfiguration inboundいれないと見れない
- show ip bgp neighbor x.x.x.x advertised
- ネイバーにアドバタイズした経路
- debug ip bgp update
トラックバック(0)
トラックバックURL: http://blog.kslabs.net/mt/mt-tb.cgi/243

コメントする