メインコンテンツへスキップ
  1. ネットワーク 記事一覧/
  2. BGP記事一覧/

BGPのプライベートAS番号の除去(remove-private-AS)

目次

なぜプライベートAS番号を除去するのか

AS番号には、組織内で自由に使えるプライベートAS番号の範囲があります。

空間範囲
2バイト6451265534
4バイト42000000004294967294

範囲を定めているのは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番号が混ざっている場合です。

混在した AS_PATH の例
64512 65001            すべてプライベート  -> 単純に全部消せる
64512 300 65001        グローバルAS 300 が挟まっている  -> どこまで消す?

すべてプライベートなら全部消して問題ありません。しかしグローバルASが挟まっていると、 そのグローバルASより手前のプライベートASを消すとAS_PATHの順序が壊れ、 経路長も変わります。この場合に何もしない実装と、プライベートASだけを抜き取る実装があります。

この記事では、IOS XRが実際にどちらの動作をするかを実機で確かめます。

IOS XRでの設定

remove-private-ASはネイバーのaddress-family配下に置きます。 neighborの直下では受け付けません。

上流ピアへプライベートASを渡さない
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-aspathAS_PATHがすべてプライベートのときだけ取り除く。名前に反して「経路全体から取り除く」という意味ではない
remove-private-AS inbound受信したUPDATEから取り除く
show bgp neighbors <ピア> advertised-routes実際に広告しているAS_PATHを確認する

実機での検証

XRd 26.1.1のルータ4台で確認します。

remove-private-ASの検証トポロジ
  • 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番号種別役割
R165001プライベート顧客。192.168.1.0/24を出す
R264512プライベート顧客の上流(同じくプライベート)
R3100グローバルISP。ここで除去する
R4200グローバル上流。ここでAS_PATHを観測する

各STEPの概要

STEP操作R3が受け取るAS_PATHR4が見るAS_PATH
0除去なし(初期状態)64512 65001100 64512 65001漏れている
1R3にremove-private-AS64512 65001100
2R2でグローバルAS300を混ぜる64512 300 65001100 300
3R3をentire-aspathに変える64512 300 65001100 64512 300 65001
4混ぜるASを4バイトのプライベート420000000164512 4200000001 65001100
5混ぜるASを4199999999(プライベートの範囲の1つ手前)に64512 4199999999 65001100 4199999999
6STEP 1〜5を戻す(最終状態)64512 65001100 64512 65001

STEP 0:プライベートASが漏れている状態

R4のBGPテーブルには、R1の65001とR2の64512がそのまま入っています。

R4 show bgp(STEP 0)
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 paths

R3がR4へ広告している内容でも同じです。

R3 show bgp neighbors 10.3.4.4 advertised-routes(STEP 0)
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 paths

STEP 1:remove-private-ASを適用する

R3のR4向けネイバーに設定します。address-family配下です。

R3
router bgp 100
 neighbor 10.3.4.4
  address-family ipv4 unicast
   remove-private-AS
R3 show running-config(STEP 1)
 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から6451265001が消え、R3自身の100だけになりました。

R3 show bgp neighbors 10.3.4.4 advertised-routes(STEP 1)
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 paths

R4のテーブルにも100だけが入ります。

R4 show bgp(STEP 1)
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 paths

STEP 2:グローバルASが混ざるとどうなるか

AS_PATHの途中にグローバルASを入れて、混在した状態を作ります。R2の出方向ポリシーで300をプリペンドします。

R2
route-policy TO-R3
  prepend as-path 300 1
  pass
end-policy
R2 show rpl route-policy TO-R3(STEP 2)
RP/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_PATH64512 300 65001——プライベートの間にグローバルASが挟まった形です。

R3 show bgp(STEP 2)
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 paths

R4が見るAS_PATH100 300です。 グローバルASが挟まっていても、プライベートASだけが抜き取られました。

R4 show bgp(STEP 2)
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 paths

AS_PATHの長さが3から1に縮んでいる点にも注意してください。 除去は経路長を変えるので、ベストパス選択の結果が変わることがあります。

STEP 3:entire-aspathは名前と動作が違う

同じ混在パスのまま、R3のオプションをentire-aspathに変えます。

R3
router bgp 100
 neighbor 10.3.4.4
  address-family ipv4 unicast
   remove-private-AS entire-aspath
R3 show running-config(STEP 3)
 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_PATH100 64512 300 65001——何も消えていません

R4 show bgp(STEP 3)
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 paths

entire-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に変えます。

R3 show bgp(STEP 4)
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 paths

R4が見るAS_PATH100だけです。4バイトのプライベートASも取り除かれています。

R4 show bgp(STEP 4)
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 paths

STEP 5:プライベートの範囲の境界

4200000001が消えただけでは、「4バイトのプライベートASと認識された」のか 「たまたまAS_PATHが全部プライベートだった」のか区別できません。 そこでプライベートの範囲の1つ手前4199999999に変えます(プライベートは4200000000から)。

R3 show bgp(STEP 5)
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 paths

R4が見るAS_PATH100 4199999999範囲の外なので残りました。 RFC 6996の境界がそのまま実装されています。

R4 show bgp(STEP 5)
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 paths

STEP 6:設定を戻す(最終状態)

R3のremove-private-ASとR2のプリペンドを外すと、STEP 0と同じ状態に戻ります。

R4 show bgp(最終状態)
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(42000000004294967294)も対象で、範囲の外は残る(STEP 4・5)
  • 設定はneighbor直下ではなくaddress-family配下に置く

検証Configおよびshow結果

各STEPで4台すべてから、次の3種類をルータごとに分けて取得しています。検証Configはこの..._run.txtです(最終状態はSTEP 6のもの)。

ファイル内容
..._show.txtshow 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-routesroutesreceived routes / show rpl route-policy
..._log.txtそのSTEPの範囲だけに絞ったshow logging
..._run.txtそのSTEP時点のshow running-config(=そのSTEPの検証Config)

STEP 0:除去なし(初期状態)

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun
R4showlogrun

STEP 1:R3にremove-private-AS

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun
R4showlogrun

STEP 2:R2でグローバルAS300を混ぜる

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun
R4showlogrun

STEP 3:R3をentire-aspathに変える

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun
R4showlogrun

STEP 4:混ぜるASを4バイトのプライベート4200000001

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun
R4showlogrun

STEP 5:混ぜるASを4199999999(プライベートの範囲の1つ手前)に

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun
R4showlogrun

STEP 6:STEP 1〜5を戻す(最終状態)

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun
R4showlogrun

参考

資料タイトル概要
RFC 6996Autonomous System (AS) Reservation for Private UseプライベートAS番号の範囲。2バイト64512〜65534、4バイト4200000000〜4294967294
RFC 4271A Border Gateway Protocol 4 (BGP-4)AS_PATHとループ検出の元の仕様

関連記事