読む前にこの記事のポイントを音声で確認できます。この音声は本記事をもとにAIツール(NotebookLM)で自動生成したもので、発音や言い回しが不自然な箇所や、内容の誤りが含まれる可能性があります。理解の補助としてご利用ください。
AS_PATH 属性は、経路がどの AS を通ってきたかを示す BGP のパス属性です。ベストパスの選択やループの防止に使われ、AS_PATH プリペンドで経路の優先度を変えることもできます。
この記事では、AS_PATH の役割と読み方を整理したあと、Cisco ルータで同じプレフィックスを2台から広告し、R2 側で AS_PATH をプリペンドしてベストパスを切り替えます。
- AS_PATH 属性の役割(経路選択とループ防止)と読み方
- AS_PATH が同じ経路が2つあるときの、ベストパスの決まり方
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 に届きます。
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 からの経路がベストパスになることを確認する
構成と設定
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 i | Path 列。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 からの経路がベストパス |
| 23 | AS_PATH。どちらの経路も 23 だけで、長さは同じ |
| from 192.168.26.2 (2.2.2.2) | ピアのアドレスと、そのピアのルータID |
| Origin IGP, metric 0, localpref 100 | Origin、MED、LOCAL_PREF も2つの経路で同じ |
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 10 | route-map を作る。match がないので、すべての経路が対象になる |
| set as-path prepend 1 2 3 4 5 | AS_PATH に 1 2 3 4 5 を追加する |
| neighbor 192.168.26.6 route-map ASPREPEND out | R6 へ送る(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 #1 | 1番目に表示されている R3 からの経路がベストパスに変わった |
| 23 1 2 3 4 5 | R2 からの経路の AS_PATH。長さが 6 になった |
| external, best | R3(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 の経路をベストパスに選びます。
プリペンドは、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 への入り口を制御できます。
コメント