BGPのAS-PATH属性を徹底解説:Ciscoルータでの設定と動作検証

音声で聞く

読む前にこの記事のポイントを音声で確認できます。この音声は本記事をもとにAIツール(NotebookLM)で自動生成したもので、発音や言い回しが不自然な箇所や、内容の誤りが含まれる可能性があります。理解の補助としてご利用ください。

AS_PATH 属性は、経路がどの AS を通ってきたかを示す BGP のパス属性です。ベストパスの選択やループの防止に使われ、AS_PATH プリペンドで経路の優先度を変えることもできます。

この記事では、AS_PATH の役割と読み方を整理したあと、Cisco ルータで同じプレフィックスを2台から広告し、R2 側で AS_PATH をプリペンドしてベストパスを切り替えます。

この記事でわかること
  1. AS_PATH 属性の役割(経路選択とループ防止)と読み方
  2. AS_PATH が同じ経路が2つあるときの、ベストパスの決まり方
  3. set as-path prepend で AS_PATH を長くし、ベストパスを切り替える方法

AS-PATH属性とは

AS_PATH 属性は、宛先プレフィックスに届くまでに通る AS 番号の並びです。経路を載せた UPDATE メッセージに必ず含まれる属性(Well-known Mandatory)の1つで、主に次の3つの働きがあります。

働き内容
経路選択同じプレフィックスに複数の経路があるとき、AS_PATH が短い(通る AS が少ない)経路を優先する
ループ防止eBGP で受け取った経路の AS_PATH に自分の AS 番号が入っていたら、ループした経路とみなして捨てる
経路操作AS 番号を追加(プリペンド)して AS_PATH をわざと長くし、その経路を選ばれにくくする

AS_PATH の読み方

BGP ルータは、eBGP ピアへ経路を送るときに、自分の AS 番号を AS_PATH の先頭(左端)に追加します。そのため、AS_PATH の右端が経路を生成した AS、左端が直接つながっている隣の AS になります。

たとえば、192.0.2.0/24 の AS_PATH が 100 200 300 の場合、この経路は AS300 で生成され、AS200、AS100 の順に伝わってきたものです。パケットはその逆で、AS100、AS200 を通って AS300 に届きます。

自分の ASAS100AS200AS300192.0.2.0/24 を生成AS_PATH100 200 300AS_PATH200 300AS_PATH300経路の広告(UPDATE)は右から左へ伝わるパケットは左から右へ進む(AS100 → AS200 → AS300)
図1 AS_PATH の読み方(経路は右から左へ伝わり、パケットは左から右へ進む)
補足

AS_PATH は、ベストパス選択の最初に比べる項目ではありません。Cisco ルータは Weight、LOCAL_PREF、自分で生成した経路かを比べ、それらが同じときに AS_PATH の長さを比べます。

検証の概要

AS23 の R2 と R3 の両方から、同じプレフィックス 23.23.23.23/32 を AS6 の R6 へ広告します。

  • R2 と R3 は、どちらも Loopback23 に 23.23.23.23/32 を設定し、network コマンドで R6 へ広告する
  • 初期状態では AS_PATH が同じなので、R6 が AS_PATH 以外の項目でどちらをベストパスにするかを確認する
  • 次に R2 で AS_PATH をプリペンドし、R3 からの経路がベストパスになることを確認する
AS23AS623.23.23.23/32router-id 2.2.2.223.23.23.23/32router-id 3.3.3.3R2R3R6.2.3.6.6192.168.26.0/24eBGP192.168.36.0/24eBGP
図2 検証構成

構成と設定

R2 の設定

R2

R2(config)# int loopback 23
R2(config-if)# ip add 23.23.23.23 255.255.255.255
!
R2(config)# router bgp 23
R2(config-router)# bgp router-id 2.2.2.2
R2(config-router)# neighbor 192.168.26.6 remote-as 6
R2(config-router)# network 23.23.23.23 mask 255.255.255.255

R3 の設定

R3

R3(config)# int loopback 23
R3(config-if)# ip add 23.23.23.23 255.255.255.255
!
R3(config)# router bgp 23
R3(config-router)# bgp router-id 3.3.3.3
R3(config-router)# neighbor 192.168.36.6 remote-as 6
R3(config-router)# network 23.23.23.23 mask 255.255.255.255

R2 と R3 は同じ AS23 で、同じプレフィックスを network コマンドで広告します。違いはルータID(R2 は 2.2.2.2、R3 は 3.3.3.3)だけです。

R6 の設定

R6 で、R2 と R3 を BGP ピアとして設定します。

R6

R6(config)# router bgp 6
R6(config-router)# neighbor 192.168.26.2 remote-as 23
R6(config-router)# neighbor 192.168.36.3 remote-as 23

動作確認

初期状態のベストパスを確認する

R6 の BGP テーブルを確認します。

R6

R6# show ip bgp
BGP table version is 2, local router ID is 6.6.6.6
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, 
              r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter, 
              x best-external, a additional-path, c RIB-compressed, 
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found


     Network          Next Hop            Metric LocPrf Weight Path
 *   23.23.23.23/32   192.168.36.3             0             0 23 i
 *>                            192.168.26.2             0             0 23 i
表示意味
23 iPath 列。AS_PATH は 23、最後の i は Origin(IGP)。R2 と R3 からの経路で同じ
*>ベストパス。Next Hop 192.168.26.2(R2)の経路が選ばれている

経路の詳細も確認します。

R6

R6# show ip bgp 23.23.23.23
BGP routing table entry for 23.23.23.23/32, version 2
Paths: (2 available, best #2, table default)
  Advertised to update-groups:
     1         
  23
    192.168.36.3 from 192.168.36.3 (3.3.3.3)
      Origin IGP, metric 0, localpref 100, valid, external
      rx pathid: 0, tx pathid: 0
  23
    192.168.26.2 from 192.168.26.2 (2.2.2.2)
      Origin IGP, metric 0, localpref 100, valid, external, best
      rx pathid: 0, tx pathid: 0x0
表示意味
2 available, best #2経路が2つあり、2番目に表示されている R2 からの経路がベストパス
23AS_PATH。どちらの経路も 23 だけで、長さは同じ
from 192.168.26.2 (2.2.2.2)ピアのアドレスと、そのピアのルータID
Origin IGP, metric 0, localpref 100Origin、MED、LOCAL_PREF も2つの経路で同じ
R2 が選ばれた理由

AS_PATH、Origin、MED などが同じなので、比較はベストパス選択の最後のほうまで進みます。Cisco ルータは、どちらも eBGP の経路であれば、ルータIDを比べる前に先に受信した(古い)経路を優先します。そのため、この結果は「ルータIDが小さい R2 が選ばれた」とも「R2 の経路を先に受信した」とも考えられ、この出力だけではどちらで決まったかは判断できません。bgp bestpath compare-routerid を設定すると、受信した順番を見ずにルータIDで比べるようになります。

AS-PATHプリペンドの設定

次に、R2 で AS_PATH をプリペンドし、R3 からの経路が選ばれるようにします。

R2 で route-map を設定する

R2

R2(config)# route-map ASPREPEND permit 10
R2(config-route-map)# set as-path prepend 1 2 3 4 5

R2(config)# router bgp 23
R2(config-router)# neighbor 192.168.26.6 route-map ASPREPEND out
設定意味
route-map ASPREPEND permit 10route-map を作る。match がないので、すべての経路が対象になる
set as-path prepend 1 2 3 4 5AS_PATH に 1 2 3 4 5 を追加する
neighbor 192.168.26.6 route-map ASPREPEND outR6 へ送る(out 方向の)経路に route-map を適用する
実際の運用では

この検証では動作がわかりやすいように 1 2 3 4 5 を追加していますが、実際の運用では自分の AS 番号を繰り返して追加します(この構成なら set as-path prepend 23 23 23 など)。他の AS 番号を入れると、経路が通っていない AS を通ったように見えるうえ、その AS のルータは自分の AS 番号が入った経路をループとみなして捨ててしまいます。

BGP セッションをクリアして反映する

設定後、BGP セッションをクリアして、経路を送り直します。

R2

R2# clear ip bgp *

clear ip bgp * は、すべての BGP セッションを切断して張り直します。本番環境では、セッションを切らずに経路だけを送り直す clear ip bgp 192.168.26.6 soft out を使います。

プリペンド後のベストパスを確認する

R6

R6# show ip bgp 23.23.23.23
BGP routing table entry for 23.23.23.23/32, version 3
Paths: (2 available, best #1, table default)
  Advertised to update-groups:
     1         
  23
    192.168.36.3 from 192.168.36.3 (3.3.3.3)
      Origin IGP, metric 0, localpref 100, valid, external, best
      rx pathid: 0, tx pathid: 0x0
  23 1 2 3 4 5
    192.168.26.2 from 192.168.26.2 (2.2.2.2)
      Origin IGP, metric 0, localpref 100, valid, external
      rx pathid: 0, tx pathid: 0
表示意味
2 available, best #11番目に表示されている R3 からの経路がベストパスに変わった
23 1 2 3 4 5R2 からの経路の AS_PATH。長さが 6 になった
external, bestR3(192.168.36.3)からの経路(AS_PATH は 23 で長さ 1)がベストパス

R2 からの経路の AS_PATH は 23 1 2 3 4 5 です。route-map で追加した 1 2 3 4 5 の前に、R2 が eBGP で送るときに自分の AS 番号 23 を追加しています。R3 からの経路(長さ 1)の方が短いので、R6 は R3 の経路をベストパスに選びます。

R2route-map ASPREPEND1 2 3 4 5 を追加eBGP で送信自分の AS 23 を先頭に23 1 2 3 4 5AS_PATH の長さ 6R3eBGP で送信自分の AS 23 を先頭に23AS_PATH の長さ 1R6 が受け取る AS_PATH短いのでベストパス
図3 プリペンド後に R6 が受け取る AS_PATH

プリペンドは、AS23 への入り口を選ばせる方法です。この検証では、AS6 から 23.23.23.23/32 へのパケットが、R2 ではなく R3 を通って AS23 に入るようになります。

まとめ

状態R2 からの経路R3 からの経路R6 のベストパス
初期状態23(長さ 1)23(長さ 1)R2(AS_PATH 以外の項目で決定)
R2 でプリペンド後23 1 2 3 4 5(長さ 6)23(長さ 1)R3(AS_PATH が短い)

AS_PATH は、経路が通ってきた AS の並びで、短い方が優先されます。route-map の set as-path prepend で AS_PATH を長くすると、その経路を選ばれにくくでき、隣の AS から自分の AS への入り口を制御できます。

コメント