なぜプライベートAS番号を除去するのか
AS番号には、組織内で自由に使えるプライベートAS番号の範囲があります。
| 空間 | 範囲 |
|---|---|
| 2バイト | 64512〜65534 |
| 4バイト | 4200000000〜4294967294 |
範囲を定めているのはRFC 6996(BCP)です。
IANA has reserved, for Private Use, a contiguous block of 1023 Autonomous System numbers from the “16-bit Autonomous System Numbers” registry, namely 64512 - 65534 inclusive.
プライベートAS番号は一意性が保証されません。 誰でも同じ番号を使えるため、
インターネットの経路情報に出てはいけません。AS_PATHに混ざると、別々の組織が同じ番号を名乗り、
ループ検出が誤作動する可能性があります。
一方で、ISPに接続する顧客がプライベートAS番号を使うことはよくあります。 グローバルAS番号を取得するほどの規模ではないが、BGPは話したいという場合です。
そこでISP側が、上流へ広告するときにAS_PATHからプライベートAS番号を取り除きます。
これがremove-private-ASです。
どこに効くか
| 項目 | 内容 |
|---|---|
| 方向 | 既定は出方向。広告するときに取り除く。IOS XRには受信時に取り除くinboundオプションもある |
| 単位 | ネイバー単位。上流ピアに対してだけ有効にする |
| 対象 | eBGPのみ |
| 自分のAS | 影響しない。 取り除いた後に、自分のAS番号が通常どおり先頭に付く |
出方向で使う限り、顧客から見た経路のAS_PATHは変わりません。変わるのは、上流が受け取るAS_PATHだけです。
標準化されていない
RFC 6996が定めているのは番号の範囲だけで、「除去する」という動作はどのRFCも規定していません。 実装ごとの機能なので、細かい挙動はベンダーやバージョンで違います。
とくに差が出るのが、AS_PATHにグローバルAS番号が混ざっている場合です。
64512 65001 すべてプライベート -> 単純に全部消せる
64512 300 65001 グローバルAS 300 が挟まっている -> どこまで消す?すべてプライベートなら全部消して問題ありません。しかしグローバルASが挟まっていると、
そのグローバルASより手前のプライベートASを消すとAS_PATHの順序が壊れ、
経路長も変わります。この場合に何もしない実装と、プライベートASだけを抜き取る実装があります。
この記事では、IOS XRが実際にどちらの動作をするかを実機で確かめます。
IOS XRでの設定
remove-private-ASはネイバーのaddress-family配下に置きます。 neighborの直下では受け付けません。
router bgp 100
neighbor 10.3.4.4
address-family ipv4 unicast
remove-private-AS| 項目 | 内容 |
|---|---|
remove-private-AS | そのネイバーへ広告するとき、AS_PATHからプライベートAS番号を取り除く |
remove-private-AS entire-aspath | AS_PATHがすべてプライベートのときだけ取り除く。名前に反して「経路全体から取り除く」という意味ではない |
remove-private-AS inbound | 受信したUPDATEから取り除く |
show bgp neighbors <ピア> advertised-routes | 実際に広告しているAS_PATHを確認する |
実機での検証
XRd 26.1.1のルータ4台で確認します。
- R1(
65001)とR2(64512)がプライベートAS、R3(100)とR4(200)がグローバルAS - R3が「顧客のプライベートASを隠すISP」の役で、R4向けのセッションに
remove-private-ASを適用する - 各ルータはLo1(
192.168.<番号>.0/24)をBGPに載せる。観測対象はR1が出す192.168.1.0/24をR4がどう見るか - グローバルASが混ざった
AS_PATHは、R2の出方向ポリシーでprepend as-pathして作る
| ルータ | AS番号 | 種別 | 役割 |
|---|---|---|---|
| R1 | 65001 | プライベート | 顧客。192.168.1.0/24を出す |
| R2 | 64512 | プライベート | 顧客の上流(同じくプライベート) |
| R3 | 100 | グローバル | ISP。ここで除去する |
| R4 | 200 | グローバル | 上流。ここでAS_PATHを観測する |
各STEPの概要
| STEP | 操作 | R3が受け取るAS_PATH | R4が見るAS_PATH |
|---|---|---|---|
| 0 | 除去なし(初期状態) | 64512 65001 | 100 64512 65001(漏れている) |
| 1 | R3にremove-private-AS | 64512 65001 | 100 |
| 2 | R2でグローバルAS300を混ぜる | 64512 300 65001 | 100 300 |
| 3 | R3をentire-aspathに変える | 64512 300 65001 | 100 64512 300 65001 |
| 4 | 混ぜるASを4バイトのプライベート4200000001に | 64512 4200000001 65001 | 100 |
| 5 | 混ぜるASを4199999999(プライベートの範囲の1つ手前)に | 64512 4199999999 65001 | 100 4199999999 |
| 6 | STEP 1〜5を戻す(最終状態) | 64512 65001 | 100 64512 65001 |
STEP 0:プライベートASが漏れている状態
R4のBGPテーブルには、R1の65001とR2の64512がそのまま入っています。
RP/0/RP0/CPU0:R4#show bgp
Fri Sep 11 07:46:12.036 UTC
<snip>
Status codes: s suppressed, d damped, h history, * valid, > best
i - internal, r RIB-failure, S stale, N Nexthop-discard
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 192.168.1.0/24 10.3.4.3 0 100 64512 65001 i
*> 192.168.2.0/24 10.3.4.3 0 100 64512 i
*> 192.168.3.0/24 10.3.4.3 0 0 100 i
*> 192.168.4.0/24 0.0.0.0 0 32768 i
Processed 4 prefixes, 4 pathsR3がR4へ広告している内容でも同じです。
RP/0/RP0/CPU0:R3#show bgp neighbors 10.3.4.4 advertised-routes
Fri Sep 11 07:45:14.866 UTC
Network Next Hop From AS Path
192.168.1.0/24 10.3.4.3 10.2.3.2 100 64512 65001i
192.168.2.0/24 10.3.4.3 10.2.3.2 100 64512i
192.168.3.0/24 10.3.4.3 Local 100i
Processed 3 prefixes, 3 pathsSTEP 1:remove-private-ASを適用する
R3のR4向けネイバーに設定します。address-family配下です。
router bgp 100
neighbor 10.3.4.4
address-family ipv4 unicast
remove-private-AS neighbor 10.3.4.4
remote-as 200
description eBGP to R4 (AS 200)
address-family ipv4 unicast
send-community-ebgp
route-policy FROM-R4 in
route-policy TO-R4 out
remove-private-AS
soft-reconfiguration inbound always
!
!広告するAS_PATHから64512と65001が消え、R3自身の100だけになりました。
RP/0/RP0/CPU0:R3#show bgp neighbors 10.3.4.4 advertised-routes
Fri Sep 11 07:50:38.328 UTC
Network Next Hop From AS Path
192.168.1.0/24 10.3.4.3 10.2.3.2 100i
192.168.2.0/24 10.3.4.3 10.2.3.2 100i
192.168.3.0/24 10.3.4.3 Local 100i
Processed 3 prefixes, 3 pathsR4のテーブルにも100だけが入ります。
RP/0/RP0/CPU0:R4#show bgp
Fri Sep 11 07:51:35.337 UTC
<snip>
Status codes: s suppressed, d damped, h history, * valid, > best
i - internal, r RIB-failure, S stale, N Nexthop-discard
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 192.168.1.0/24 10.3.4.3 0 100 i
*> 192.168.2.0/24 10.3.4.3 0 100 i
*> 192.168.3.0/24 10.3.4.3 0 0 100 i
*> 192.168.4.0/24 0.0.0.0 0 32768 i
Processed 4 prefixes, 4 pathsSTEP 2:グローバルASが混ざるとどうなるか
AS_PATHの途中にグローバルASを入れて、混在した状態を作ります。R2の出方向ポリシーで300をプリペンドします。
route-policy TO-R3
prepend as-path 300 1
pass
end-policyRP/0/RP0/CPU0:R2#show rpl route-policy TO-R3
Fri Sep 11 07:54:29.823 UTC
route-policy TO-R3
prepend as-path 300 1
pass
end-policy
!R3が受け取るAS_PATHは64512 300 65001——プライベートの間にグローバルASが挟まった形です。
RP/0/RP0/CPU0:R3#show bgp
Fri Sep 11 07:55:25.880 UTC
<snip>
Status codes: s suppressed, d damped, h history, * valid, > best
i - internal, r RIB-failure, S stale, N Nexthop-discard
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 192.168.1.0/24 10.2.3.2 0 64512 300 65001 i
*> 192.168.2.0/24 10.2.3.2 0 0 64512 300 i
*> 192.168.3.0/24 0.0.0.0 0 32768 i
*> 192.168.4.0/24 10.3.4.4 0 0 200 i
Processed 4 prefixes, 4 pathsR4が見るAS_PATHは100 300です。
グローバルASが挟まっていても、プライベートASだけが抜き取られました。
RP/0/RP0/CPU0:R4#show bgp
Fri Sep 11 07:56:25.699 UTC
<snip>
Status codes: s suppressed, d damped, h history, * valid, > best
i - internal, r RIB-failure, S stale, N Nexthop-discard
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 192.168.1.0/24 10.3.4.3 0 100 300 i
*> 192.168.2.0/24 10.3.4.3 0 100 300 i
*> 192.168.3.0/24 10.3.4.3 0 0 100 i
*> 192.168.4.0/24 0.0.0.0 0 32768 i
Processed 4 prefixes, 4 pathsAS_PATHの長さが3から1に縮んでいる点にも注意してください。
除去は経路長を変えるので、ベストパス選択の結果が変わることがあります。
STEP 3:entire-aspathは名前と動作が違う
同じ混在パスのまま、R3のオプションをentire-aspathに変えます。
router bgp 100
neighbor 10.3.4.4
address-family ipv4 unicast
remove-private-AS entire-aspath neighbor 10.3.4.4
remote-as 200
description eBGP to R4 (AS 200)
address-family ipv4 unicast
send-community-ebgp
route-policy FROM-R4 in
route-policy TO-R4 out
remove-private-AS entire-aspath
soft-reconfiguration inbound always
!
!R4が見るAS_PATHは100 64512 300 65001——何も消えていません。
RP/0/RP0/CPU0:R4#show bgp
Fri Sep 11 08:01:13.204 UTC
<snip>
Status codes: s suppressed, d damped, h history, * valid, > best
i - internal, r RIB-failure, S stale, N Nexthop-discard
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 192.168.1.0/24 10.3.4.3 0 100 64512 300 65001 i
*> 192.168.2.0/24 10.3.4.3 0 100 64512 300 i
*> 192.168.3.0/24 10.3.4.3 0 0 100 i
*> 192.168.4.0/24 0.0.0.0 0 32768 i
Processed 4 prefixes, 4 pathsentire-aspathは「AS_PATH全体から取り除く」ではなく、
AS_PATH全体がプライベートのときだけ取り除くという意味です。
XRのヘルプもremove only if all ASes in the path are privateと説明しています。
混在しているこの経路では条件を満たさないので、除去そのものが行われません。
| 設定 | 混在パス64512 300 65001の扱い |
|---|---|
remove-private-AS | プライベートだけ抜き取る → 300 |
remove-private-AS entire-aspath | 条件を満たさず何もしない → 64512 300 65001 |
STEP 4:4バイトのプライベートASも対象になる
R3をremove-private-AS(オプションなし)に戻し、混ぜるASを4バイトのプライベートAS4200000001に変えます。
RP/0/RP0/CPU0:R3#show bgp
Fri Sep 11 08:05:13.578 UTC
<snip>
Status codes: s suppressed, d damped, h history, * valid, > best
i - internal, r RIB-failure, S stale, N Nexthop-discard
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 192.168.1.0/24 10.2.3.2 0 64512 4200000001 65001 i
*> 192.168.2.0/24 10.2.3.2 0 0 64512 4200000001 i
*> 192.168.3.0/24 0.0.0.0 0 32768 i
*> 192.168.4.0/24 10.3.4.4 0 0 200 i
Processed 4 prefixes, 4 pathsR4が見るAS_PATHは100だけです。4バイトのプライベートASも取り除かれています。
RP/0/RP0/CPU0:R4#show bgp
Fri Sep 11 08:06:13.562 UTC
<snip>
Status codes: s suppressed, d damped, h history, * valid, > best
i - internal, r RIB-failure, S stale, N Nexthop-discard
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 192.168.1.0/24 10.3.4.3 0 100 i
*> 192.168.2.0/24 10.3.4.3 0 100 i
*> 192.168.3.0/24 10.3.4.3 0 0 100 i
*> 192.168.4.0/24 0.0.0.0 0 32768 i
Processed 4 prefixes, 4 pathsSTEP 5:プライベートの範囲の境界
4200000001が消えただけでは、「4バイトのプライベートASと認識された」のか
「たまたまAS_PATHが全部プライベートだった」のか区別できません。
そこでプライベートの範囲の1つ手前の4199999999に変えます(プライベートは4200000000から)。
RP/0/RP0/CPU0:R3#show bgp
Fri Sep 11 08:10:04.296 UTC
<snip>
Status codes: s suppressed, d damped, h history, * valid, > best
i - internal, r RIB-failure, S stale, N Nexthop-discard
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 192.168.1.0/24 10.2.3.2 0 64512 4199999999 65001 i
*> 192.168.2.0/24 10.2.3.2 0 0 64512 4199999999 i
*> 192.168.3.0/24 0.0.0.0 0 32768 i
*> 192.168.4.0/24 10.3.4.4 0 0 200 i
Processed 4 prefixes, 4 pathsR4が見るAS_PATHは100 4199999999。範囲の外なので残りました。
RFC 6996の境界がそのまま実装されています。
RP/0/RP0/CPU0:R4#show bgp
Fri Sep 11 08:11:04.606 UTC
<snip>
Status codes: s suppressed, d damped, h history, * valid, > best
i - internal, r RIB-failure, S stale, N Nexthop-discard
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 192.168.1.0/24 10.3.4.3 0 100 4199999999 i
*> 192.168.2.0/24 10.3.4.3 0 100 4199999999 i
*> 192.168.3.0/24 10.3.4.3 0 0 100 i
*> 192.168.4.0/24 0.0.0.0 0 32768 i
Processed 4 prefixes, 4 pathsSTEP 6:設定を戻す(最終状態)
R3のremove-private-ASとR2のプリペンドを外すと、STEP 0と同じ状態に戻ります。
RP/0/RP0/CPU0:R4#show bgp
Fri Sep 11 08:15:50.763 UTC
<snip>
Status codes: s suppressed, d damped, h history, * valid, > best
i - internal, r RIB-failure, S stale, N Nexthop-discard
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 192.168.1.0/24 10.3.4.3 0 100 64512 65001 i
*> 192.168.2.0/24 10.3.4.3 0 100 64512 i
*> 192.168.3.0/24 10.3.4.3 0 0 100 i
*> 192.168.4.0/24 0.0.0.0 0 32768 i
Processed 4 prefixes, 4 paths検証のまとめ
remove-private-ASは広告するAS_PATHからプライベートASを取り除く。自分のAS番号はその後に付く(STEP 1)- グローバルASが混ざっていても、プライベートASだけが抜き取られる。
AS_PATHの長さが縮む(STEP 2) entire-aspathは「全体がプライベートのときだけ取り除く」。 混在時は何もしない(STEP 3)- 4バイトのプライベートAS(
4200000000〜4294967294)も対象で、範囲の外は残る(STEP 4・5) - 設定は
neighbor直下ではなくaddress-family配下に置く
検証Configおよびshow結果
各STEPで4台すべてから、次の3種類をルータごとに分けて取得しています。検証Configはこの..._run.txtです(最終状態はSTEP 6のもの)。
| ファイル | 内容 |
|---|---|
..._show.txt | show version / show interface description / show route / show route bgp / show bgp summary / show bgp / show bgp <プレフィックス>(4本) / show bgp neighbors / show bgp update-group / ピアごとのadvertised-routes・routes・received routes / show rpl route-policy |
..._log.txt | そのSTEPの範囲だけに絞ったshow logging |
..._run.txt | そのSTEP時点のshow running-config(=そのSTEPの検証Config) |
STEP 0:除去なし(初期状態)
| ルータ | show出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
| R3 | show | log | run |
| R4 | show | log | run |
STEP 1:R3にremove-private-AS
| ルータ | show出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
| R3 | show | log | run |
| R4 | show | log | run |
STEP 2:R2でグローバルAS300を混ぜる
| ルータ | show出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
| R3 | show | log | run |
| R4 | show | log | run |
STEP 3:R3をentire-aspathに変える
| ルータ | show出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
| R3 | show | log | run |
| R4 | show | log | run |
STEP 4:混ぜるASを4バイトのプライベート4200000001に
| ルータ | show出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
| R3 | show | log | run |
| R4 | show | log | run |
STEP 5:混ぜるASを4199999999(プライベートの範囲の1つ手前)に
| ルータ | show出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
| R3 | show | log | run |
| R4 | show | log | run |
STEP 6:STEP 1〜5を戻す(最終状態)
| ルータ | show出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
| R3 | show | log | run |
| R4 | show | log | run |
参考
| 資料 | タイトル | 概要 |
|---|---|---|
| RFC 6996 | Autonomous System (AS) Reservation for Private Use | プライベートAS番号の範囲。2バイト64512〜65534、4バイト4200000000〜4294967294 |
| RFC 4271 | A Border Gateway Protocol 4 (BGP-4) | AS_PATHとループ検出の元の仕様 |
関連記事
- BGP(Border Gateway Protocol)
- BGPメッセージ
- BGPネイバーの状態遷移
- iBGPとeBGPの違い
- BGP next-hop-self
- BGPルートリフレクタ
- BGPパス属性とベストパス選択
- BGP ORIGIN属性
- BGP AS_PATH属性
- BGP NEXT_HOP属性
- BGP LOCAL_PREF属性
- BGP MED属性
- BGP WEIGHT属性
- BGP COMMUNITY属性
- BGP経路集約(aggregate-address)
- MP-BGP(マルチプロトコル拡張)
- BGP Extended Community(拡張コミュニティ)
- BGPマルチパス(maximum-paths)
- BGPの4バイトAS番号(RFC 6793)
- BGPのプライベートAS番号の除去(remove-private-AS)