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

MPLS VPNのSoO(Site of Origin)

目次

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が付いた経路を外す
IOS XRのSoOの設定(PE側)
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 に到達する
1PE1・PE2・PE3 に as-override戻ってくる。 CE-A1b が eBGP で受け取り、traceroute がプロバイダ網を往復する
2PE1・PE2 のサイト1ネイバーに site-of-origin 65001:11止まる。 CE-A1b は OSPF 経路に戻る。VPNv4 経路には SoO:65001:11 が付く
3PE3 の CE-A2 ネイバーに site-of-origin 65001:12違う SoO では止まらない。 サイト間の経路はそのまま流れる
4PE2 のサイト1ネイバーの SoO だけ外すまた戻る。 判定しているのは出口のネイバーに設定された SoO
5PE2 に 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が送る前に落としています。

STEP 0 PE2 が CE-A1b へ広告している経路
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 paths

CE-A1bは拠点内のOSPFで10.1.11.1/32に到達します。

STEP 0 CE-A1b から見た 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ホップです。

STEP 0 CE-A1b から 10.1.11.1 への traceroute
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向けネイバーに入れます。

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

CE-A1bに10.1.11.1/32が届きました。AS_PATHは65001 65001で、顧客のAS 65102がPEのAS番号に書き換えられています。

STEP 1 CE-A1b の 10.1.11.1/32
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に入ります。

STEP 1 CE-A1b から見た 10.1.11.1/32
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に着きます。拠点内の通信が、プロバイダ網を往復しています。

STEP 1 CE-A1b から 10.1.11.1 への traceroute
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です。

STEP 1 No.1 UPDATE(PE2 → CE-A1b)の NLRI と AS_PATH(tshark -V の抜粋)
            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 65001
上のtshark出力のパケット(No.1 UPDATE、戻ってきた経路)のpcapをダウンロード

SoOを入れると止まる

サイト1がつながるPE1とPE2の、サイト1向けネイバーに同じ値を入れます。

STEP 2 PE2 に投入した設定
router bgp 65001
 vrf CUST-A
  neighbor 172.16.2.2
   address-family ipv4 unicast
    site-of-origin 65001:11
   !
  !
 !
!
end

PE2が持っているVPNv4経路にSoO:65001:11が付きました。RTと同じExtended Communityに並びます。

STEP 2 PE2 の 10.1.11.1/32(VPNv4)
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です。

STEP 2 No.7 VPNv4 UPDATE(PE1 → P1)の Extended Communities(tshark -V の抜粋)
        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: 100
上のtshark出力のパケット(No.7 VPNv4 UPDATE、SoO付き)のpcapをダウンロード

PE2がCE-A1bへ広告する経路から10.1.11.1/32が消えました。サイト2の10.1.2.1/32は残っています。止まったのは同じサイトから来た経路だけです。

STEP 2 PE2 が CE-A1b へ広告している経路
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です。

STEP 2 No.3 UPDATE(PE2 → CE-A1b)の Withdrawn Routes(tshark -V の抜粋)
    Withdrawn Routes Length: 5
    Withdrawn Routes
        10.1.11.1/32
            Withdrawn route prefix length: 32
            Withdrawn prefix: 10.1.11.1
上のtshark出力のパケット(No.3 WITHDRAW)のpcapをダウンロード

CE-A1bは拠点内のOSPF経路に戻ります。

STEP 2 CE-A1b から見た 10.1.11.1/32
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. 
STEP 2 CE-A1b から 10.1.11.1 への traceroute
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の経路にはその値が付きます。

STEP 3 PE3 の 10.1.2.1/32(VPNv4)
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の経路は、そのまま使えています。

STEP 3 CE-A1b から見た 10.1.2.1/32
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側の設定は入れたままです。

STEP 4 PE2 に投入した設定
router bgp 65001
 vrf CUST-A
  neighbor 172.16.2.2
   address-family ipv4 unicast
    no site-of-origin 65001:11
   !
  !
 !
!
end

経路はまた戻ってきました。

STEP 4 CE-A1b から見た 10.1.11.1/32
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. 
STEP 4 CE-A1b から 10.1.11.1 への traceroute
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.txtshow 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.txtshow bgp trace(PEのみ)
..._commit.cfgそのSTEPで実際にcommitされた設定(変更したルータのみ)

STEP 0:初期状態(as-override も SoO も無し)

ルータshow出力syslogrunning-configpingtrace投入した設定
CE-A1ashowlogrunping--
PE1showlogrunpingtrace-
P1showlogrunping--
PE2showlogrunpingtrace-
CE-A1bshowlogrunping--
PE3showlogrunpingtrace-
CE-A2showlogrunping--

STEP 1:PE1・PE2・PE3 に as-override

ルータshow出力syslogrunning-configpingtrace投入した設定
CE-A1ashowlogrunping--
PE1showlogrunpingtracecommit
P1showlogrunping--
PE2showlogrunpingtracecommit
CE-A1bshowlogrunping--
PE3showlogrunpingtracecommit
CE-A2showlogrunping--

STEP 2:PE1・PE2 のサイト1ネイバーに site-of-origin 65001:11

ルータshow出力syslogrunning-configpingtrace投入した設定
CE-A1ashowlogrunping--
PE1showlogrunpingtracecommit
P1showlogrunping--
PE2showlogrunpingtracecommit
CE-A1bshowlogrunping--
PE3showlogrunpingtrace-
CE-A2showlogrunping--

STEP 3:PE3 の CE-A2 ネイバーに site-of-origin 65001:12

ルータshow出力syslogrunning-configpingtrace投入した設定
CE-A1ashowlogrunping--
PE1showlogrunpingtrace-
P1showlogrunping--
PE2showlogrunpingtrace-
CE-A1bshowlogrunping--
PE3showlogrunpingtracecommit
CE-A2showlogrunping--

STEP 4:PE2 のサイト1ネイバーの SoO だけ外す

ルータshow出力syslogrunning-configpingtrace投入した設定
CE-A1ashowlogrunping--
PE1showlogrunpingtrace-
P1showlogrunping--
PE2showlogrunpingtracecommit
CE-A1bshowlogrunping--
PE3showlogrunpingtrace-
CE-A2showlogrunping--

STEP 5:PE2 に SoO を戻す(最終状態)

ルータshow出力syslogrunning-configpingtrace投入した設定
CE-A1ashowlogrunping--
PE1showlogrunpingtrace-
P1showlogrunping--
PE2showlogrunpingtracecommit
CE-A1bshowlogrunping--
PE3showlogrunpingtrace-
CE-A2showlogrunping--

パケットキャプチャーはSTEPごとに取得しています。

STEPPE2-CE-A1b間PE1-P1間
0pcappcap
1pcappcap
2pcappcap
3pcappcap
4pcappcap
5pcappcap

まとめ