MPLS VPNのSoO(Site of Origin)
SoOは、その経路がどのサイトから入ってきたかを示す印です。PEがCEから経路を受け取るときに付け、同じ印の付いた経路を、そのサイトへは広告しないために使います。
RFC 4364の7は、PEがVPN-IPv4経路を再配布する前にすることを次のように定めています。
Before a PE can redistribute a VPN-IPv4 route learned from a site, it must assign a Route Target attribute (see Section 4.3.1) to the route, and it may assign a Site of Origin attribute to the route.
RTは必須、SoOは任意です。2つは役割が違います。
| 属性 | 何を表すか | 誰が見るか |
|---|---|---|
| RT(Route Target) | どのVRFに入れるか | 経路を受け取るPE(RT(Route Target)) |
| SoO(Site of Origin) | どのサイトから来たか | 経路をCEへ広告するPE |
どちらも同じExtended Communityという属性で運ばれます。SoOはそのうちのRoute Origin(Sub-Type 0x03)です。
The Site of Origin attribute, if used, is encoded as a Route Origin Extended Community [BGP-EXTCOMM].
属性そのものの形式(8バイトの構造、Type / Sub-Type、transitiveかどうか)はBGPのExtended Communityで解説しています。
マルチホームのサイトでは、自分が出した経路が戻ってくる
1つのサイトが2つのPEにつながっている(マルチホーム)とき、そのサイトが出した経路は、もう一方のPEから同じサイトへ戻ってくる経路になりえます。RFC 4364の7は、SoOが必要な理由をこう述べています。
This attribute is needed in some cases to ensure that a route learned from a particular site via a particular PE/CE connection is not distributed back to the site through a different PE/CE connection.
通常はBGPのループ検出が止めます。eBGPでは、AS_PATHに相手のAS番号が入っている経路は、そのピアへ送りません。サイトごとに違うAS番号を使っていれば、戻ってくる経路は自然に止まります。
止まらなくなるのは、全拠点が同じAS番号を使っている場合です。この構成では相手拠点の経路も同じ理由で落ちてしまうため、PE側でas-overrideを入れてAS_PATHの顧客AS番号を書き換えます(MPLS VPNで複数拠点が同じAS番号を使う場合)。その結果、ループ検出の防護も一緒に外れます。 RFC 4364の7は、この組み合わせを前提にSoOを位置づけています。
If a site is not in a transit VPN, note that it need not have a unique Autonomous System Number (ASN). Every CE whose site is not in a transit VPN can use the same ASN. This can be chosen from the private ASN space, and it will be stripped out by the PE. Routing loops are prevented by use of the Site of Origin attribute (see below).
戻ってきた経路は、拠点内の経路より強い
経路が戻ってくること自体より、戻ってきた経路が拠点内の経路に勝ってしまうことが問題になります。
CEから見ると、拠点内の宛先への経路は2つあります。拠点内のIGPで学んだ経路と、PEから受け取ったBGP経路です。IOS XRのアドミニストレーティブディスタンスはeBGPが20、OSPFが110なので、BGPのほうが強い。拠点内の通信が、隣のCEへ直接行かずにプロバイダ網を往復します。
出口でのふるまい
SoOの付いた経路をどう扱うかは、RFC 4364の8が定めています。
We add one more restriction on the distribution of routes from PE to CE: if a route’s Site of Origin attribute identifies a particular site, that route must never be redistributed to any CE at that site.
IOS XRでは、site-of-originをPE-CEネイバーのアドレスファミリー配下に書きます。1つの設定が2つの働きをします。
| 向き | ふるまい |
|---|---|
| CEから受け取るとき | その経路にSoOを付ける |
| CEへ広告するとき | 同じ値のSoOが付いた経路を外す |
router bgp 65001
vrf CUST-A
neighbor 172.16.1.2
address-family ipv4 unicast
site-of-origin 65001:11値はサイト単位で決めます。 マルチホームのサイトなら、そのサイトがつながる全部のPEのネイバーに同じ値を入れます。判定するのは経路を広告する側のPEなので、片方のPEにしか入っていないと、そちら側からは戻ってしまいます。
検証構成
サイト1は CE-A1a と CE-A1b の2台で PE1・PE2 へつながるマルチホームの拠点です。拠点内は OSPF(area 0)で結び、各 CE は自分のLo1だけをBGPでPEへ広告します。相手のLo1は拠点内のOSPFで学びます。サイト2(CE-A2)はPE3に1本でつながります。顧客の3台はすべてAS 65102です。
| STEP | 操作 | 確かめること |
|---|---|---|
| 0 | 初期状態(as-override も SoO も無し) | 戻ってこない。 CE-A1b は拠点内の OSPF で 10.1.11.1/32 に到達する |
| 1 | PE1・PE2・PE3 に as-override | 戻ってくる。 CE-A1b が eBGP で受け取り、traceroute がプロバイダ網を往復する |
| 2 | PE1・PE2 のサイト1ネイバーに site-of-origin 65001:11 | 止まる。 CE-A1b は OSPF 経路に戻る。VPNv4 経路には SoO:65001:11 が付く |
| 3 | PE3 の CE-A2 ネイバーに site-of-origin 65001:12 | 違う SoO では止まらない。 サイト間の経路はそのまま流れる |
| 4 | PE2 のサイト1ネイバーの SoO だけ外す | また戻る。 判定しているのは出口のネイバーに設定された SoO |
| 5 | PE2 に SoO を戻す(最終状態) | STEP 2・3 と同じ状態に戻る |
初期状態では戻ってこない
PE2がCE-A1bへ広告しているのは、PEがredistribute connectedで出すPE-CE間の3本だけです。サイト1が出した10.1.11.1/32は入っていません。AS_PATHにCE-A1bのAS 65102が入っているため、PE2が送る前に落としています。
RP/0/RP0/CPU0:PE2#show bgp vrf CUST-A neighbors 172.16.2.2 advertised-routes
Mon Oct 12 00:26:16.098 UTC
Network Next Hop From AS Path
Route Distinguisher: 65001:1 (default for vrf CUST-A)
Route Distinguisher Version: 16
172.16.1.0/24 172.16.2.1 1.1.1.1 65001?
172.16.2.0/24 172.16.2.1 Local 65001?
172.16.3.0/24 172.16.2.1 4.4.4.4 65001?
Processed 3 prefixes, 3 pathsCE-A1bは拠点内のOSPFで10.1.11.1/32に到達します。
RP/0/RP0/CPU0:CE-A1b#show route 10.1.11.1/32
Mon Oct 12 00:28:03.772 UTC
Routing entry for 10.1.11.1/32
Known via "ospf 1", distance 110, metric 2, type intra area
Installed Oct 12 00:21:06.625 for 00:06:57
Routing Descriptor Blocks
10.1.1.1, from 11.11.11.11, via GigabitEthernet0/0/0/1
Route metric is 2
No advertising protos. tracerouteも隣のCE-A1aへ直接1ホップです。
RP/0/RP0/CPU0:CE-A1b#traceroute 10.1.11.1 source 10.1.12.1 timeout 1 probe 2 maxttl 6
Mon Oct 12 00:24:54.420 UTC
Type escape sequence to abort.
Tracing the route to 10.1.11.1
1 10.1.1.1 6 msec * as-overrideを入れると戻ってくる
全拠点が同じAS番号なので、サイト間の経路を通すにはas-overrideが要ります。PE1・PE2・PE3のCE向けネイバーに入れます。
router bgp 65001
vrf CUST-A
neighbor 172.16.2.2
address-family ipv4 unicast
as-override
!
!
!
!
endCE-A1bに10.1.11.1/32が届きました。AS_PATHは65001 65001で、顧客のAS 65102がPEのAS番号に書き換えられています。
RP/0/RP0/CPU0:CE-A1b#show bgp 10.1.11.1/32
Mon Oct 12 00:34:08.362 UTC
BGP routing table entry for 10.1.11.1/32
Versions:
Process bRIB/RIB SendTblVer
Speaker 8 8
Last Modified: Oct 12 00:29:09.023 for 00:04:59
Paths: (1 available, best #1)
Not advertised to any peer
Path #1: Received by speaker 0
Not advertised to any peer
65001 65001, (received & used)
172.16.2.1 from 172.16.2.1 (2.2.2.2)
Origin IGP, localpref 100, valid, external, best, group-best
Received Path ID 0, Local Path ID 1, version 8
Origin-AS validity: (disabled)受け取った経路はeBGP(距離20)なので、拠点内のOSPF経路(距離110)を押しのけてRIBに入ります。
RP/0/RP0/CPU0:CE-A1b#show route 10.1.11.1/32
Mon Oct 12 00:34:07.801 UTC
Routing entry for 10.1.11.1/32
Known via "bgp 65102", distance 20, metric 0
Tag 65001, type external
Installed Oct 12 00:29:09.251 for 00:04:58
Routing Descriptor Blocks
172.16.2.1, from 172.16.2.1, BGP external
Route metric is 0, Wt is 1
No advertising protos. 転送も変わります。隣のCE-A1aへ1ホップで行っていたものが、PE2 → P1 → PE1とMPLS VPNを回ってからCE-A1aに着きます。拠点内の通信が、プロバイダ網を往復しています。
RP/0/RP0/CPU0:CE-A1b#traceroute 10.1.11.1 source 10.1.12.1 timeout 1 probe 2 maxttl 6
Mon Oct 12 00:31:20.729 UTC
Type escape sequence to abort.
Tracing the route to 10.1.11.1
1 172.16.2.1 6 msec 5 msec
2 10.0.23.3 [MPLS: Labels 24001/24005 Exp 0] 67 msec 15 msec
3 10.0.13.1 [MPLS: Label 24005 Exp 0] 16 msec 14 msec
4 172.16.1.2 51 msec * パケットでも、PE2がCE-A1bへ10.1.11.1/32を送っています。添付のSTEP 1のキャプチャーのNo.1で、AS_PATHは65001 65001です。
Network Layer Reachability Information (NLRI)
10.1.2.1/32
MP Reach NLRI prefix length: 32
MP Reach NLRI IPv4 prefix: 10.1.2.1
10.1.11.1/32
MP Reach NLRI prefix length: 32
MP Reach NLRI IPv4 prefix: 10.1.11.1
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
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: 10
AS Path segment: 65001 65001SoOを入れると止まる
サイト1がつながるPE1とPE2の、サイト1向けネイバーに同じ値を入れます。
router bgp 65001
vrf CUST-A
neighbor 172.16.2.2
address-family ipv4 unicast
site-of-origin 65001:11
!
!
!
!
endPE2が持っているVPNv4経路にSoO:65001:11が付きました。RTと同じExtended Communityに並びます。
RP/0/RP0/CPU0:PE2#show bgp vpnv4 unicast rd 65001:1 10.1.11.1/32 detail
Mon Oct 12 00:38:15.729 UTC
BGP routing table entry for 10.1.11.1/32, Route Distinguisher: 65001:1
Versions:
Process bRIB/RIB SendTblVer
Speaker 17 17
Flags: 0x00043001+0x00000000+0x00000000
Last Modified: Oct 12 00:35:03.023 for 00:03:12
Paths: (1 available, best #1)
Not advertised to any peer
Path #1: Received by speaker 0
Flags: 0x2000000085068005+0x00, import: 0x39f
Not advertised to any peer
65102, (received & used)
1.1.1.1 (metric 3) from 1.1.1.1 (1.1.1.1), if-handle 0x00000000
Received Label 24005
Origin IGP, metric 0, localpref 100, valid, internal, best, group-best, import-candidate, imported
Received Path ID 0, Local Path ID 1, version 17
Extended community: SoO:65001:11 RT:65001:100
Source AFI: VPNv4 Unicast, Source VRF: CUST-A, Source Route Distinguisher: 65001:1パケットではRoute Origin(Sub-Type 0x03)として入ります。添付のSTEP 2のPE1-P1間のキャプチャーのNo.7です。
Path Attribute - EXTENDED_COMMUNITIES
Flags: 0xc0, Optional, Transitive, Complete
1... .... = Optional: Set
.1.. .... = Transitive: Set
..0. .... = Partial: Not set
...0 .... = Extended-Length: Not set
.... 0000 = Unused: 0x0
Type Code: EXTENDED_COMMUNITIES (16)
Length: 16
Carried extended communities: (2 communities)
Route Origin: 65001:11 [Transitive 2-Octet AS-Specific]
Type: Transitive 2-Octet AS-Specific (0x00)
0... .... = IANA Authority: Allocated on First Come First Serve Basis
.0.. .... = Transitive across ASes: Transitive
Subtype (AS2): Route Origin (0x03)
2-Octet AS: 65001
4-Octet AN: 11
Route Target: 65001:100 [Transitive 2-Octet AS-Specific]
Type: Transitive 2-Octet AS-Specific (0x00)
0... .... = IANA Authority: Allocated on First Come First Serve Basis
.0.. .... = Transitive across ASes: Transitive
Subtype (AS2): Route Target (0x02)
2-Octet AS: 65001
4-Octet AN: 100PE2がCE-A1bへ広告する経路から10.1.11.1/32が消えました。サイト2の10.1.2.1/32は残っています。止まったのは同じサイトから来た経路だけです。
RP/0/RP0/CPU0:PE2#show bgp vrf CUST-A neighbors 172.16.2.2 advertised-routes
Mon Oct 12 00:38:13.026 UTC
Network Next Hop From AS Path
Route Distinguisher: 65001:1 (default for vrf CUST-A)
Route Distinguisher Version: 18
10.1.2.1/32 172.16.2.1 4.4.4.4 65001 65102i
172.16.1.0/24 172.16.2.1 1.1.1.1 65001?
172.16.2.0/24 172.16.2.1 Local 65001?
172.16.3.0/24 172.16.2.1 4.4.4.4 65001?
Processed 4 prefixes, 4 paths取り消しはパケットにも出ています。同じ区間のSTEP 2のキャプチャーのNo.3がWITHDRAWです。
Withdrawn Routes Length: 5
Withdrawn Routes
10.1.11.1/32
Withdrawn route prefix length: 32
Withdrawn prefix: 10.1.11.1CE-A1bは拠点内のOSPF経路に戻ります。
RP/0/RP0/CPU0:CE-A1b#show route 10.1.11.1/32
Mon Oct 12 00:40:03.007 UTC
Routing entry for 10.1.11.1/32
Known via "ospf 1", distance 110, metric 2, type intra area
Installed Oct 12 00:35:13.752 for 00:04:49
Routing Descriptor Blocks
10.1.1.1, from 11.11.11.11, via GigabitEthernet0/0/0/1
Route metric is 2
No advertising protos. RP/0/RP0/CPU0:CE-A1b#traceroute 10.1.11.1 source 10.1.12.1 timeout 1 probe 2 maxttl 6
Mon Oct 12 00:37:13.649 UTC
Type escape sequence to abort.
Tracing the route to 10.1.11.1
1 10.1.1.1 15 msec * 違うSoOでは止まらない
SoOが止めるのは同じ値の経路だけです。PE3のCE-A2向けネイバーに別の値(65001:12)を入れると、サイト2の経路にはその値が付きます。
RP/0/RP0/CPU0:PE3#show bgp vpnv4 unicast rd 65001:1 10.1.2.1/32 detail
Mon Oct 12 00:44:35.403 UTC
BGP routing table entry for 10.1.2.1/32, Route Distinguisher: 65001:1
Versions:
Process bRIB/RIB SendTblVer
Speaker 20 20
Local Label: 24005 (no rewrite);
Flags: 0x013e3001+0x00000000+0x00000000
Last Modified: Oct 12 00:40:57.023 for 00:03:38
Paths: (2 available, best #1)
Advertised to update-groups (with more than one peer):
0.2
Path #1: Received by speaker 0
Flags: 0x300000000d060001+0x00, import: 0x33f
Advertised to update-groups (with more than one peer):
0.2
65102
172.16.3.2 from 172.16.3.2 (13.13.13.13), if-handle 0x00000000
Origin IGP, metric 0, localpref 100, valid, external, best, group-best, import-candidate
Received Path ID 0, Local Path ID 1, version 20
Extended community: SoO:65001:12 RT:65001:100
Path #2: Received by speaker 0
Flags: 0x3000000000024001+0x00, import: 0x020
Not advertised to any peer
65102, (received-only)
172.16.3.2 from 172.16.3.2 (13.13.13.13), if-handle 0x00000000
Origin IGP, metric 0, localpref 100, valid, external
Received Path ID 0, Local Path ID 0, version 0サイト1から見たサイト2の経路は、そのまま使えています。
RP/0/RP0/CPU0:CE-A1b#show route 10.1.2.1/32
Mon Oct 12 00:45:44.947 UTC
Routing entry for 10.1.2.1/32
Known via "bgp 65102", distance 20, metric 0
Tag 65001, type external
Installed Oct 12 00:29:09.251 for 00:16:35
Routing Descriptor Blocks
172.16.2.1, from 172.16.2.1, BGP external
Route metric is 0, Wt is 1
No advertising protos. 片方のPEだけ外すと、また戻る
PE2のサイト1向けネイバーからSoOを外します。PE1側の設定は入れたままです。
router bgp 65001
vrf CUST-A
neighbor 172.16.2.2
address-family ipv4 unicast
no site-of-origin 65001:11
!
!
!
!
end経路はまた戻ってきました。
RP/0/RP0/CPU0:CE-A1b#show route 10.1.11.1/32
Mon Oct 12 00:51:28.395 UTC
Routing entry for 10.1.11.1/32
Known via "bgp 65102", distance 20, metric 0
Tag 65001, type external
Installed Oct 12 00:46:37.715 for 00:04:50
Routing Descriptor Blocks
172.16.2.1, from 172.16.2.1, BGP external
Route metric is 0, Wt is 1
No advertising protos. RP/0/RP0/CPU0:CE-A1b#traceroute 10.1.11.1 source 10.1.12.1 timeout 1 probe 2 maxttl 6
Mon Oct 12 00:48:39.357 UTC
Type escape sequence to abort.
Tracing the route to 10.1.11.1
1 172.16.2.1 6 msec 5 msec
2 10.0.23.3 [MPLS: Labels 24001/24005 Exp 0] 22 msec 14 msec
3 10.0.13.1 [MPLS: Label 24005 Exp 0] 14 msec 21 msec
4 172.16.1.2 15 msec * PE1が付けたSoO:65001:11は経路に残っています。止まらなくなったのは、広告する側のPE2に比べる値が無くなったからです。判定は経路に付いた値と出口のネイバーに設定された値の組で行われるので、マルチホームのサイトは、つながる全部のPEに同じ値を入れる必要があります。
検証Configおよびshow結果
各STEPで7台すべてから、次の種類をルータごとに分けて取得しています。検証Configはこの..._run.txtです(最終状態は最後のSTEPのもの)。
| ファイル | 内容 |
|---|---|
..._show.txt | show version / show interface description / OSPF・LDP・BGP・VRFの各showなど |
..._log.txt | そのSTEPの範囲だけに絞ったshow logging |
..._run.txt | そのSTEP時点のshow running-config(=そのSTEPの検証Config) |
..._ping.txt | そのSTEPのpingとtraceroute |
..._trace.txt | show bgp trace(PEのみ) |
..._commit.cfg | そのSTEPで実際にcommitされた設定(変更したルータのみ) |
STEP 0:初期状態(as-override も SoO も無し)
| ルータ | show出力 | syslog | running-config | ping | trace | 投入した設定 |
|---|---|---|---|---|---|---|
| CE-A1a | show | log | run | ping | - | - |
| PE1 | show | log | run | ping | trace | - |
| P1 | show | log | run | ping | - | - |
| PE2 | show | log | run | ping | trace | - |
| CE-A1b | show | log | run | ping | - | - |
| PE3 | show | log | run | ping | trace | - |
| CE-A2 | show | log | run | ping | - | - |
STEP 1:PE1・PE2・PE3 に as-override
| ルータ | show出力 | syslog | running-config | ping | trace | 投入した設定 |
|---|---|---|---|---|---|---|
| CE-A1a | show | log | run | ping | - | - |
| PE1 | show | log | run | ping | trace | commit |
| P1 | show | log | run | ping | - | - |
| PE2 | show | log | run | ping | trace | commit |
| CE-A1b | show | log | run | ping | - | - |
| PE3 | show | log | run | ping | trace | commit |
| CE-A2 | show | log | run | ping | - | - |
STEP 2:PE1・PE2 のサイト1ネイバーに site-of-origin 65001:11
| ルータ | show出力 | syslog | running-config | ping | trace | 投入した設定 |
|---|---|---|---|---|---|---|
| CE-A1a | show | log | run | ping | - | - |
| PE1 | show | log | run | ping | trace | commit |
| P1 | show | log | run | ping | - | - |
| PE2 | show | log | run | ping | trace | commit |
| CE-A1b | show | log | run | ping | - | - |
| PE3 | show | log | run | ping | trace | - |
| CE-A2 | show | log | run | ping | - | - |
STEP 3:PE3 の CE-A2 ネイバーに site-of-origin 65001:12
| ルータ | show出力 | syslog | running-config | ping | trace | 投入した設定 |
|---|---|---|---|---|---|---|
| CE-A1a | show | log | run | ping | - | - |
| PE1 | show | log | run | ping | trace | - |
| P1 | show | log | run | ping | - | - |
| PE2 | show | log | run | ping | trace | - |
| CE-A1b | show | log | run | ping | - | - |
| PE3 | show | log | run | ping | trace | commit |
| CE-A2 | show | log | run | ping | - | - |
STEP 4:PE2 のサイト1ネイバーの SoO だけ外す
| ルータ | show出力 | syslog | running-config | ping | trace | 投入した設定 |
|---|---|---|---|---|---|---|
| CE-A1a | show | log | run | ping | - | - |
| PE1 | show | log | run | ping | trace | - |
| P1 | show | log | run | ping | - | - |
| PE2 | show | log | run | ping | trace | commit |
| CE-A1b | show | log | run | ping | - | - |
| PE3 | show | log | run | ping | trace | - |
| CE-A2 | show | log | run | ping | - | - |
STEP 5:PE2 に SoO を戻す(最終状態)
| ルータ | show出力 | syslog | running-config | ping | trace | 投入した設定 |
|---|---|---|---|---|---|---|
| CE-A1a | show | log | run | ping | - | - |
| PE1 | show | log | run | ping | trace | - |
| P1 | show | log | run | ping | - | - |
| PE2 | show | log | run | ping | trace | commit |
| CE-A1b | show | log | run | ping | - | - |
| PE3 | show | log | run | ping | trace | - |
| CE-A2 | show | log | run | ping | - | - |
パケットキャプチャーはSTEPごとに取得しています。
| STEP | PE2-CE-A1b間 | PE1-P1間 |
|---|---|---|
| 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)
- MPLS VPNのSoO(Site of Origin)