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番号に置き換えます。
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 | 広告する経路 |
|---|---|---|
| CE1 | 65102 | 10.1.1.0/24(観測側) |
| CE2 | 65102 | 10.1.2.0/24 |
| CE3 | 65102 | 10.1.3.0/24 |
| CE9 | 65009 | 10.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 のテーブルに相手拠点の経路が無い |
| 1 | PE2 にだけ as-override | 設定した方向だけ効く(CE2 は受け取るが CE1・CE3 はまだ) |
| 2 | PE1 と PE3 にも as-override | 全部通る。10.1.9.0/24 は 65001 65001 65009(65009 は残る) |
| 3 | as-override を全部外す | STEP 0 に戻る |
| 4 | CE に allowas-in(この記事では扱わない) | (本文では扱わない) |
| 5 | allowas-in を外し as-override に戻す(最終状態) | STEP 2 と同じ状態に戻る |
STEP 0:PEは経路を持っているのに、CEへ送っていない
PE1のVRFには7本の経路が入っています。
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 paths10.1.2.0/24も10.1.9.0/24もあります。ところが、CE1へ広告している経路を見ると3本しかありません。
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本も送られていません。
受け取る側から見ても同じです。
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 pathsreceived routesは入力ポリシーを通る前の経路ですが、ここにも3本しかありません。CEに届く前に、PEが送るのをやめています。
当然、CEのBGPテーブルにも相手拠点の経路は入りません。
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も通りません。
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にだけ入れます。
router bgp 65001
vrf CUST-A
neighbor 172.16.2.2
address-family ipv4 unicast
as-override
!
!
!
!
endCE2は受け取れるようになりますが、CE1は変わりません。
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 pathsRP/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 pathsneighborの下の設定なので、そのネイバーへ送るときにしか効きません。拠点をまたいで通すには、CEを持つPEすべてに入れる必要があります。
STEP 2:全PEに入れると通る。65009は書き換わらない
PE1とPE3にも入れます。PE1がCE1へ広告する経路は6本に増えます。
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 pathsCE1のBGPテーブルにも入りました。
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 pathsAS_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です。
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疎通も通ります。
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 msSTEP 3:外すと元に戻る
as-overrideを全部外すと、PEは再び送らなくなり、STEP 0と同じ状態に戻ります。
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 4271 | A Border Gateway Protocol 4 (BGP-4) | 9.1.2(AS_PATHによるループ検出。受信側の検査)、9.2(Update-Send Process。送信側の抑止は規定されていない) |
| RFC 4364 | BGP/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.txt | CE間のpingとtraceroute |
..._trace.txt | PEのshow bgp trace |
..._commit.cfg | そのSTEPで実際にcommitされた設定(変更したルータの分だけ) |
STEP 0:初期状態(as-override なし)
| ルータ | show出力 | syslog | running-config | ping | trace | 投入した設定 |
|---|---|---|---|---|---|---|
| CE1 | show | log | run | ping | - | - |
| PE1 | show | log | run | ping | trace | - |
| P1 | show | log | run | ping | - | - |
| PE2 | show | log | run | ping | trace | - |
| CE2 | show | log | run | ping | - | - |
| PE3 | show | log | run | ping | trace | - |
| CE3 | show | log | run | ping | - | - |
| CE9 | show | log | run | ping | - | - |
STEP 1:PE2 にだけ as-override
| ルータ | show出力 | syslog | running-config | ping | trace | 投入した設定 |
|---|---|---|---|---|---|---|
| CE1 | show | log | run | ping | - | - |
| PE1 | show | log | run | ping | trace | - |
| P1 | show | log | run | ping | - | - |
| PE2 | show | log | run | ping | trace | commit |
| CE2 | show | log | run | ping | - | - |
| PE3 | show | log | run | ping | trace | - |
| CE3 | show | log | run | ping | - | - |
| CE9 | show | log | run | ping | - | - |
STEP 2:PE1 と PE3 にも as-override
| ルータ | show出力 | syslog | running-config | ping | trace | 投入した設定 |
|---|---|---|---|---|---|---|
| CE1 | show | log | run | ping | - | - |
| PE1 | show | log | run | ping | trace | commit |
| P1 | show | log | run | ping | - | - |
| PE2 | show | log | run | ping | trace | - |
| CE2 | show | log | run | ping | - | - |
| PE3 | show | log | run | ping | trace | commit |
| CE3 | show | log | run | ping | - | - |
| CE9 | show | log | run | ping | - | - |
STEP 3:as-override を全部外す
| ルータ | show出力 | syslog | running-config | ping | trace | 投入した設定 |
|---|---|---|---|---|---|---|
| CE1 | show | log | run | ping | - | - |
| PE1 | show | log | run | ping | trace | commit |
| P1 | show | log | run | ping | - | - |
| PE2 | show | log | run | ping | trace | commit |
| CE2 | show | log | run | ping | - | - |
| PE3 | show | log | run | ping | trace | commit |
| CE3 | show | log | run | ping | - | - |
| CE9 | show | log | run | ping | - | - |
STEP 4:CE に allowas-in(この記事では扱わない)
| ルータ | show出力 | syslog | running-config | ping | trace | 投入した設定 |
|---|---|---|---|---|---|---|
| CE1 | show | log | run | ping | - | commit |
| PE1 | show | log | run | ping | trace | - |
| P1 | show | log | run | ping | - | - |
| PE2 | show | log | run | ping | trace | - |
| CE2 | show | log | run | ping | - | commit |
| PE3 | show | log | run | ping | trace | - |
| CE3 | show | log | run | ping | - | commit |
| CE9 | show | log | run | ping | - | - |
STEP 5:allowas-in を外し as-override に戻す(最終状態)
| ルータ | show出力 | syslog | running-config | ping | trace | 投入した設定 |
|---|---|---|---|---|---|---|
| CE1 | show | log | run | ping | - | commit |
| PE1 | show | log | run | ping | trace | commit |
| P1 | show | log | run | ping | - | - |
| PE2 | show | log | run | ping | trace | commit |
| CE2 | show | log | run | ping | - | commit |
| PE3 | show | log | run | ping | trace | commit |
| CE3 | show | log | run | ping | - | commit |
| CE9 | show | log | run | ping | - | - |
パケットキャプチャーはSTEPごとに、PE-CE間の2区間で取得しています。
| STEP | PE1-CE1間 | PE3-CE3間 |
|---|---|---|
| 0 | pcap | pcap |
| 1 | pcap | pcap |
| 2 | pcap | pcap |
| 3 | pcap | pcap |
| 4 | pcap | pcap |
| 5 | pcap | pcap |
関連記事
- MPLS VPN(L3VPN)とは
- MPLS VPNのVRF(Virtual Routing and Forwarding)
- MPLS VPNのRD(Route Distinguisher)
- MPLS VPNのRT(Route Target)
- MPLS VPNのMP-BGP(VPNv4経路の伝搬)
- MPLS VPNのVPNラベルの割り当て(per-prefix / per-CE / per-VRF)
- MPLS VPNの2段ラベルの転送(トランスポートラベルとVPNラベル)
- MPLS VPNのPE-CEルーティング(スタティック)
- MPLS VPNのPE-CEルーティング(eBGP)
- MPLS VPNで複数拠点が同じAS番号を使う場合(as-override)