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

MPLS VPNで複数拠点が同じAS番号を使う場合(as-override)

目次

MPLS VPNで複数拠点が同じAS番号を使う場合とは

顧客が拠点ごとに別のAS番号を用意することはあまりありません。企業のネットワークなら全拠点で1つのAS番号を使うのが普通です。ところがそのままPE-CE間をeBGPにすると、相手拠点の経路が自分のサイトに届きません。

理由はBGPのAS_PATHによるループ検出です。拠点1が出した経路は、PEを通るときにプロバイダのAS番号が足され、相手拠点のCEには65001 65102というAS_PATHで届こうとします。受け取るCEのAS番号は65102なので、自分のAS番号が経路の途中に入っていることになります。

RFC 4271の9.1.2は、受け取り側の検査をこう定めています。

If the AS_PATH attribute of a BGP route contains an AS loop, the BGP route should be excluded from the Phase 2 decision function. AS loop detection is done by scanning the full AS path (as specified in the AS_PATH attribute), and checking that the autonomous system number of the local system does not appear in the AS path.

落ちているのは受け取るCEではなく、送る側のPE

対処を考えるうえで、どこで落ちているかを取り違えないことが大事です。

上のRFCの規定は受け取り側の話ですが、実際にはそこまで届きません。IOS XRのPEは、相手のAS番号がAS_PATHに入っている経路を、そのeBGPネイバーへ送りません。RFC 4271の9.2(Update-Send Process)に送信側の抑止は書かれていないので、これは実装の動作です。

この違いは実務に直結します。CE側で「自分のASが入っていても受け入れる」設定をしても、経路そのものが届かないので効きません。 直すべきはPE側です。

as-override

as-overrideはPE側の設定で、CEへ送る直前に、AS_PATHの中にある「そのネイバーのAS番号」を自分のAS番号に置き換えます。

PEの設定(IOS XR)
router bgp 65001
 vrf CUST-A
  neighbor 172.16.1.2
   address-family ipv4 unicast
    as-override
   !
  !
 !
!

置き換えたあとのAS_PATHには受け取るCEのAS番号が無くなるので、送信側の抑止に引っかからず、CE側の検査も通ります。

押さえておく点が2つあります。

点内容
ネイバー単位neighborの下に書くので、設定したネイバーへ送るときだけ効く。片方のPEだけに入れても、もう片方の拠点には届かない
置き換えるのはそのネイバーのAS番号だけAS_PATH全体を書き換えるのではない。その拠点の先にある別のAS番号はそのまま残る

2つ目は、拠点の先に別のASがぶら下がっている場合に効いてきます。たとえばCEの先にAS 65009のルータがいて、経路のAS_PATHが65001 65102 65009だったとします。as-overrideで書き換わるのは65102だけです。AS_PATHは65001 65001 65009となり、65009は残ります。

設計上の注意

as-overrideを入れるとAS_PATHが実態と変わります。経路をたどるときに見えるAS番号は、実際に通ったASとは違うものになります。障害の切り分けでshow bgpのAS_PATHを見るときは、この書き換えが入っていることを踏まえる必要があります。

もう1つは、ループ検出そのものを無効にしているという点です。AS_PATHから相手のAS番号が消えるので、経路が本当に一周して戻ってきても、CEはそれを検出できません。拠点が2つのPEにつながるマルチホーム構成では、実際にループが起こりえます。これを止めるのがSoO(Site of Origin)で、MPLS VPNのSoOで扱います。

検証構成

XRd 8台で、3拠点とも同じAS 65102にします。CE3の先だけ別のAS 65009(CE9)をぶら下げ、AS_PATHに他社のAS番号が入る経路を作ります。

ノードAS広告する経路
CE16510210.1.1.0/24(観測側)
CE26510210.1.2.0/24
CE36510210.1.3.0/24
CE96500910.1.9.0/24(CE3とeBGP。PEには直接つながらない)

CEにデフォルトルートは置いていません。 経路が届かないことがpingにそのまま出るようにするためです。PEは3台ともredistribute connectedを入れているので、PE-CE区間のサブネットはPE自身が出します。これは後で切り分けに使います。

STEP操作確かめること
0初期状態(as-override なし)PE は送っていない(advertised-routes が3本)。CE のテーブルに相手拠点の経路が無い
1PE2 にだけ as-override設定した方向だけ効く(CE2 は受け取るが CE1・CE3 はまだ)
2PE1 と PE3 にも as-override全部通る。10.1.9.0/24 は 65001 65001 65009(65009 は残る)
3as-override を全部外すSTEP 0 に戻る
4CE に allowas-in(この記事では扱わない)(本文では扱わない)
5allowas-in を外し as-override に戻す(最終状態)STEP 2 と同じ状態に戻る

STEP 0:PEは経路を持っているのに、CEへ送っていない

PE1のVRFには7本の経路が入っています。

PE1:vrf CUST-A のBGPテーブル(STEP 0)
RP/0/RP0/CPU0:PE1#show bgp vrf CUST-A
Sun Sep 27 16:18:55.337 UTC
BGP VRF CUST-A, state: Active
BGP Route Distinguisher: 65001:1
VRF ID: 0x60000002
BGP router identifier 1.1.1.1, local AS number 65001
Non-stop routing is enabled
BGP table state: Active
Table ID: 0xe0000002   RD version: 19
BGP main routing table version 19
BGP NSR Initial initsync version 6 (Reached)
BGP NSR/ISSU Sync-Group versions 0/0

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
Route Distinguisher: 65001:1 (default for vrf CUST-A)
Route Distinguisher Version: 19
*> 10.1.1.0/24        172.16.1.2               0             0 65102 i
*>i10.1.2.0/24        2.2.2.2                  0    100      0 65102 i
*>i10.1.3.0/24        4.4.4.4                  0    100      0 65102 i
*>i10.1.9.0/24        4.4.4.4                       100      0 65102 65009 i
*> 172.16.1.0/24      0.0.0.0                  0         32768 ?
*>i172.16.2.0/24      2.2.2.2                  0    100      0 ?
*>i172.16.3.0/24      4.4.4.4                  0    100      0 ?

Processed 7 prefixes, 7 paths

10.1.2.0/24も10.1.9.0/24もあります。ところが、CE1へ広告している経路を見ると3本しかありません。

PE1 → CE1 へ広告している経路(STEP 0)
RP/0/RP0/CPU0:PE1#show bgp vrf CUST-A neighbors 172.16.1.2 advertised-routes
Sun Sep 27 16:18:57.786 UTC
Network            Next Hop        From            AS Path
Route Distinguisher: 65001:1 (default for vrf CUST-A)
Route Distinguisher Version: 19
172.16.1.0/24      172.16.1.1      Local           65001?
172.16.2.0/24      172.16.1.1      2.2.2.2         65001?
172.16.3.0/24      172.16.1.1      4.4.4.4         65001?

Processed 3 prefixes, 3 paths

出ているのは172.16.x.0/24の3本だけです。これはPE自身がredistribute connectedで出している経路で、AS_PATHは65001しかありません。一方、CEが出した経路(AS_PATHに65102が入るもの)は1本も送られていません。

受け取る側から見ても同じです。

CE1が受け取った生の経路(STEP 0)
RP/0/RP0/CPU0:CE1#show bgp neighbors 172.16.1.1 received routes
Sun Sep 27 16:20:47.773 UTC
BGP router identifier 11.11.11.11, local AS number 65102
BGP generic scan interval 60 secs
Non-stop routing is enabled
BGP table state: Active
Table ID: 0xe0000000   RD version: 6
BGP main routing table version 6
BGP NSR Initial initsync version 3 (Reached)
BGP NSR/ISSU Sync-Group versions 0/0
BGP scan interval 60 secs

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
*> 172.16.1.0/24      172.16.1.1               0             0 65001 ?
*> 172.16.2.0/24      172.16.1.1                             0 65001 ?
*> 172.16.3.0/24      172.16.1.1                             0 65001 ?

Processed 3 prefixes, 3 paths

received routesは入力ポリシーを通る前の経路ですが、ここにも3本しかありません。CEに届く前に、PEが送るのをやめています。

当然、CEのBGPテーブルにも相手拠点の経路は入りません。

CE1のBGPテーブル(STEP 0)
RP/0/RP0/CPU0:CE1#show bgp
Sun Sep 27 16:20:46.907 UTC
BGP router identifier 11.11.11.11, local AS number 65102
BGP generic scan interval 60 secs
Non-stop routing is enabled
BGP table state: Active
Table ID: 0xe0000000   RD version: 6
BGP main routing table version 6
BGP NSR Initial initsync version 3 (Reached)
BGP NSR/ISSU Sync-Group versions 0/0
BGP scan interval 60 secs

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
*> 10.1.1.0/24        0.0.0.0                  0         32768 i
*> 172.16.1.0/24      172.16.1.1               0             0 65001 ?
*> 172.16.2.0/24      172.16.1.1                             0 65001 ?
*> 172.16.3.0/24      172.16.1.1                             0 65001 ?

Processed 4 prefixes, 4 paths

自分の10.1.1.0/24と、PEが出した172.16.x.0/24だけです。pingも通りません。

CE1 → 10.1.9.1 のping(STEP 0)
RP/0/RP0/CPU0:CE1#ping 10.1.9.1 source 10.1.1.1 count 10 timeout 1
Sun Sep 27 16:17:33.195 UTC
Type escape sequence to abort.
Sending 10, 100-byte ICMP Echos to 10.1.9.1 timeout is 1 seconds:
..........
Success rate is 0 percent (0/10)

STEP 1:as-overrideはネイバー単位で効く

PE2にだけ入れます。

PE2に投入した設定(STEP 1)
router bgp 65001
 vrf CUST-A
  neighbor 172.16.2.2
   address-family ipv4 unicast
    as-override
   !
  !
 !
!
end

CE2は受け取れるようになりますが、CE1は変わりません。

CE2のBGPテーブル(STEP 1)
RP/0/RP0/CPU0:CE2#show bgp
Sun Sep 27 16:27:38.538 UTC
BGP router identifier 12.12.12.12, local AS number 65102
BGP generic scan interval 60 secs
Non-stop routing is enabled
BGP table state: Active
Table ID: 0xe0000000   RD version: 9
BGP main routing table version 9
BGP NSR Initial initsync version 3 (Reached)
BGP NSR/ISSU Sync-Group versions 0/0
BGP scan interval 60 secs

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
*> 10.1.1.0/24        172.16.2.1                             0 65001 65001 i
*> 10.1.2.0/24        0.0.0.0                  0         32768 i
*> 10.1.3.0/24        172.16.2.1                             0 65001 65001 i
*> 10.1.9.0/24        172.16.2.1                             0 65001 65001 65009 i
*> 172.16.1.0/24      172.16.2.1                             0 65001 ?
*> 172.16.2.0/24      172.16.2.1               0             0 65001 ?
*> 172.16.3.0/24      172.16.2.1                             0 65001 ?

Processed 7 prefixes, 7 paths
CE1のBGPテーブル(STEP 1)
RP/0/RP0/CPU0:CE1#show bgp
Sun Sep 27 16:27:19.933 UTC
BGP router identifier 11.11.11.11, local AS number 65102
BGP generic scan interval 60 secs
Non-stop routing is enabled
BGP table state: Active
Table ID: 0xe0000000   RD version: 6
BGP main routing table version 6
BGP NSR Initial initsync version 3 (Reached)
BGP NSR/ISSU Sync-Group versions 0/0
BGP scan interval 60 secs

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
*> 10.1.1.0/24        0.0.0.0                  0         32768 i
*> 172.16.1.0/24      172.16.1.1               0             0 65001 ?
*> 172.16.2.0/24      172.16.1.1                             0 65001 ?
*> 172.16.3.0/24      172.16.1.1                             0 65001 ?

Processed 4 prefixes, 4 paths

neighborの下の設定なので、そのネイバーへ送るときにしか効きません。拠点をまたいで通すには、CEを持つPEすべてに入れる必要があります。

STEP 2:全PEに入れると通る。65009は書き換わらない

PE1とPE3にも入れます。PE1がCE1へ広告する経路は6本に増えます。

PE1 → CE1 へ広告している経路(STEP 2)
RP/0/RP0/CPU0:PE1#show bgp vrf CUST-A neighbors 172.16.1.2 advertised-routes
Sun Sep 27 16:31:13.861 UTC
Network            Next Hop        From            AS Path
Route Distinguisher: 65001:1 (default for vrf CUST-A)
Route Distinguisher Version: 19
10.1.2.0/24        172.16.1.1      2.2.2.2         65001 65102i
10.1.3.0/24        172.16.1.1      4.4.4.4         65001 65102i
10.1.9.0/24        172.16.1.1      4.4.4.4         65001 65102 65009i
172.16.1.0/24      172.16.1.1      Local           65001?
172.16.2.0/24      172.16.1.1      2.2.2.2         65001?
172.16.3.0/24      172.16.1.1      4.4.4.4         65001?

Processed 6 prefixes, 6 paths

CE1のBGPテーブルにも入りました。

CE1のBGPテーブル(STEP 2)
RP/0/RP0/CPU0:CE1#show bgp
Sun Sep 27 16:33:04.073 UTC
BGP router identifier 11.11.11.11, local AS number 65102
BGP generic scan interval 60 secs
Non-stop routing is enabled
BGP table state: Active
Table ID: 0xe0000000   RD version: 9
BGP main routing table version 9
BGP NSR Initial initsync version 3 (Reached)
BGP NSR/ISSU Sync-Group versions 0/0
BGP scan interval 60 secs

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
*> 10.1.1.0/24        0.0.0.0                  0         32768 i
*> 10.1.2.0/24        172.16.1.1                             0 65001 65001 i
*> 10.1.3.0/24        172.16.1.1                             0 65001 65001 i
*> 10.1.9.0/24        172.16.1.1                             0 65001 65001 65009 i
*> 172.16.1.0/24      172.16.1.1               0             0 65001 ?
*> 172.16.2.0/24      172.16.1.1                             0 65001 ?
*> 172.16.3.0/24      172.16.1.1                             0 65001 ?

Processed 7 prefixes, 7 paths

AS_PATHに注目してください。10.1.2.0/24と10.1.3.0/24は65001 65001で、65102が65001に置き換わっています。そして10.1.9.0/24は65001 65001 65009となり、65009はそのまま残っています。as-overrideが書き換えるのは、あくまでそのネイバーのAS番号だけです。

同じことがパケットにも出ています。添付のSTEP 2のキャプチャー(PE1-CE1間)のNo.3です。

PE1 → CE1 のUPDATE(tshark -V、10.1.9.0/24 の部分)
        Path Attribute - MP_REACH_NLRI
            Flags: 0x90, Optional, Extended-Length, Non-transitive, Complete
                1... .... = Optional: Set
                .0.. .... = Transitive: Not set
                ..0. .... = Partial: Not set
                ...1 .... = Extended-Length: Set
                .... 0000 = Unused: 0x0
            Type Code: MP_REACH_NLRI (14)
            Length: 13
            Address family identifier (AFI): IPv4 (1)
            Subsequent address family identifier (SAFI): Unicast (1)
            Next hop: 172.16.1.1
                IPv4 Address: 172.16.1.1
            Number of Subnetwork points of attachment (SNPA): 0
            Network Layer Reachability Information (NLRI)
                10.1.9.0/24
                    MP Reach NLRI prefix length: 24
                    MP Reach NLRI IPv4 prefix: 10.1.9.0
        Path Attribute - ORIGIN: IGP
            Flags: 0x40, Transitive, Well-known, Complete
                0... .... = Optional: Not set
                .1.. .... = Transitive: Set
                ..0. .... = Partial: Not set
                ...0 .... = Extended-Length: Not set
                .... 0000 = Unused: 0x0
            Type Code: ORIGIN (1)
            Length: 1
            Origin: IGP (0)
        Path Attribute - AS_PATH: 65001 65001 65009 
            Flags: 0x40, Transitive, Well-known, Complete
                0... .... = Optional: Not set
                .1.. .... = Transitive: Set
                ..0. .... = Partial: Not set
                ...0 .... = Extended-Length: Not set
                .... 0000 = Unused: 0x0
            Type Code: AS_PATH (2)
            Length: 14
            AS Path segment: 65001 65001 65009
上のtshark出力のパケット(No.3 UPDATE、書き換え後のAS_PATH)のpcapをダウンロード

疎通も通ります。

CE1 → 10.1.9.1 のping(STEP 2)
RP/0/RP0/CPU0:CE1#ping 10.1.9.1 source 10.1.1.1 count 10 timeout 1
Sun Sep 27 16:30:26.503 UTC
Type escape sequence to abort.
Sending 10, 100-byte ICMP Echos to 10.1.9.1 timeout is 1 seconds:
!!!!!!!!!!
Success rate is 100 percent (10/10), round-trip min/avg/max = 16/17/22 ms

STEP 3:外すと元に戻る

as-overrideを全部外すと、PEは再び送らなくなり、STEP 0と同じ状態に戻ります。

CE1のBGPテーブル(STEP 3)
RP/0/RP0/CPU0:CE1#show bgp
Sun Sep 27 16:39:53.186 UTC
BGP router identifier 11.11.11.11, local AS number 65102
BGP generic scan interval 60 secs
Non-stop routing is enabled
BGP table state: Active
Table ID: 0xe0000000   RD version: 12
BGP main routing table version 12
BGP NSR Initial initsync version 3 (Reached)
BGP NSR/ISSU Sync-Group versions 0/0
BGP scan interval 60 secs

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
*> 10.1.1.0/24        0.0.0.0                  0         32768 i
*> 172.16.1.0/24      172.16.1.1               0             0 65001 ?
*> 172.16.2.0/24      172.16.1.1                             0 65001 ?
*> 172.16.3.0/24      172.16.1.1                             0 65001 ?

Processed 4 prefixes, 4 paths

参考

RFCタイトル参照した節
RFC 4271A Border Gateway Protocol 4 (BGP-4)9.1.2(AS_PATHによるループ検出。受信側の検査)、9.2(Update-Send Process。送信側の抑止は規定されていない)
RFC 4364BGP/MPLS IP Virtual Private Networks (VPNs)7(PEがCEから経路を学ぶ方法)

書籍: Luc De Ghein『MPLS Fundamentals』(Cisco Press、2006)7章

検証Configおよびshow結果

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

ファイル内容
..._show.txtそのルータで動いているプロトコルの状態を一通り。PEはOSPF・LDP・MPLS転送・MP-BGP・VRF(show ospf neighbor / show mpls ldp bindings / show mpls forwarding / show bgp vpnv4 unicast など)と、ネイバーごとのadvertised-routes・routes・received routes
..._log.txtそのSTEPの範囲だけに絞ったshow logging
..._run.txtそのSTEP時点のshow running-config(=そのSTEPの検証Config)
..._ping.txtCE間のpingとtraceroute
..._trace.txtPEのshow bgp trace
..._commit.cfgそのSTEPで実際にcommitされた設定(変更したルータの分だけ)

STEP 0:初期状態(as-override なし)

ルータshow出力syslogrunning-configpingtrace投入した設定
CE1showlogrunping--
PE1showlogrunpingtrace-
P1showlogrunping--
PE2showlogrunpingtrace-
CE2showlogrunping--
PE3showlogrunpingtrace-
CE3showlogrunping--
CE9showlogrunping--

STEP 1:PE2 にだけ as-override

ルータshow出力syslogrunning-configpingtrace投入した設定
CE1showlogrunping--
PE1showlogrunpingtrace-
P1showlogrunping--
PE2showlogrunpingtracecommit
CE2showlogrunping--
PE3showlogrunpingtrace-
CE3showlogrunping--
CE9showlogrunping--

STEP 2:PE1 と PE3 にも as-override

ルータshow出力syslogrunning-configpingtrace投入した設定
CE1showlogrunping--
PE1showlogrunpingtracecommit
P1showlogrunping--
PE2showlogrunpingtrace-
CE2showlogrunping--
PE3showlogrunpingtracecommit
CE3showlogrunping--
CE9showlogrunping--

STEP 3:as-override を全部外す

ルータshow出力syslogrunning-configpingtrace投入した設定
CE1showlogrunping--
PE1showlogrunpingtracecommit
P1showlogrunping--
PE2showlogrunpingtracecommit
CE2showlogrunping--
PE3showlogrunpingtracecommit
CE3showlogrunping--
CE9showlogrunping--

STEP 4:CE に allowas-in(この記事では扱わない)

ルータshow出力syslogrunning-configpingtrace投入した設定
CE1showlogrunping-commit
PE1showlogrunpingtrace-
P1showlogrunping--
PE2showlogrunpingtrace-
CE2showlogrunping-commit
PE3showlogrunpingtrace-
CE3showlogrunping-commit
CE9showlogrunping--

STEP 5:allowas-in を外し as-override に戻す(最終状態)

ルータshow出力syslogrunning-configpingtrace投入した設定
CE1showlogrunping-commit
PE1showlogrunpingtracecommit
P1showlogrunping--
PE2showlogrunpingtracecommit
CE2showlogrunping-commit
PE3showlogrunpingtracecommit
CE3showlogrunping-commit
CE9showlogrunping--

パケットキャプチャーはSTEPごとに、PE-CE間の2区間で取得しています。

STEPPE1-CE1間PE3-CE3間
0pcappcap
1pcappcap
2pcappcap
3pcappcap
4pcappcap
5pcappcap

関連記事