今回は、vJunos-routerを使ってInter-AS Option CによるL3VPNの検証をしたいと思います。
「Inter-AS Option C」とは、ASを跨いでVPNを実現するソリューションの一つです。
(Option 「C」なので、AやBもあります)
複数の異なるSP(Service Provider)を経由してL2VPNやL3VPNを行うようなイメージです。
IOSでの設定例は数あれど、Junosの設定例はほぼ無いので、書き記します。
公式ドキュメントの設定例はRR(Route Reflector)がなく微妙な構成なので、RR有りな現実的なトポロジーで構築します。
例によって用語の詳しい説明は行いません。わからない用語は各自でググってください。
今回行うOption Cは、C-Plane(経路情報の広告)とD-Plane(実際のトラフィック)のパケットフローやLabel構造がとてもややこしいです。
特にD-Planeについては3重ものLabelが付与され転送処理が行われます。
概要を知りたい方は、ChrisさんのBlog記事の前半部分を一読するのをオススメします。
また、D-PlaneのLabel構造については同じくChrisさんのBlogの絵がわかりやすいです。
では、いつもの通り構成より詳しく書いていきます。
1. Inter-AS Option C L3VPN 構成
トポロジーは以下のとおりです。

前述した通り、異なるSPを経由するので、2つSP網を用意しそれぞれCEをつなげています。
今回はSP Aを自AS、SP Bを相手方の対向ASとして見立てます。
Routing Protocolとしては、SP網のUnderlayにてIS-ISを使用し、PEとCE間ではOSPFを使います。AS内とAS間で当然BGPも使います。
Label配布ProtocolはRSVPを使用します。
そしてOption Cの特徴として、ASBR間ではBGP-LU(Labeled-Unicast)によるPeeringを行い、かつRR間でPeeringを行いVPNv4 Prefixを交換します。
ゴールとしては、VPN-01のSite-AとSite-BのVPC間(vPC-01とvPC-02間)でL3VPNによる通信ができることです。
追記: 構成図の解像度が低いので、Xに高解像度の構成図をアップしました。
2. Inter-AS Option C L3VPN 設定
それでは設定していきます。
今回は尺の都合でSP A側の設定のみ記載しています。
IP Addressの設定は完了していることとします。
まず、SP網内でUnderlayとなるIS-ISを設定し、AS内のLoopback Addressをお互い広報します。
例としてP-01のみconfigを記載します。
//P-01
set interfaces ge-0/0/0 unit 0 family iso
set interfaces ge-0/0/1 unit 0 family iso
set interfaces ge-0/0/2 unit 0 family iso
set interfaces lo0 unit 0 family iso address 49.0001.0000.0000.0002.00
set protocols isis interface ge-0/0/0.0 level 2 disable
set protocols isis interface ge-0/0/1.0 level 2 disable
set protocols isis interface ge-0/0/2.0 level 2 disable
set protocols isis interface lo0.0 passive
他の機器はIS-ISを有効にするインターフェイスやLo0.0のNSAP Addressが異なる程度なので、ほぼコピペとなります。
参考に、今回は下記のパラメーターにて設定してます。
| 機器名 |
Lo0.0 NSAP Address |
IS-ISを有効にするインターフェイス |
| PE-01 |
49.0001.0000.0000.0001.00 |
ge-0/0/0.0, lo0.0 |
| P-01 |
49.0001.0000.0000.0002.00 |
ge-0/0/0.0, ge-0/0/1.0, ge-0/0/2.0, lo0.0 |
| ASBR-01 |
49.0001.0000.0000.0003.00 |
ge-0/0/0.0, lo0.0 |
| RR-01 |
49.0001.0000.0000.0004.00 |
ge-0/0/0.0, lo0.0 |
続いてMPLSとRSVPを設定します。
Labeled-Unicatをするので、RRもMPLSを動作させます。
RSVPについては、PE-01、ASBR-01、RR-01は他の2つのデバイス宛のPathを定義します。
//PE-01
set protocols mpls label-switched-path TO_ASBR-01 to 172.16.1.3
set protocols mpls label-switched-path TO_RR-01 to 172.16.1.4
set protocols mpls interface ge-0/0/0.0
set protocols mpls interface lo0.0
set protocols rsvp interface ge-0/0/0.0
//P-01
set interfaces ge-0/0/0 unit 0 family mpls
set interfaces ge-0/0/1 unit 0 family mpls
set interfaces ge-0/0/2 unit 0 family mpls
set protocols mpls interface ge-0/0/0.0
set protocols mpls interface ge-0/0/1.0
set protocols mpls interface lo0.0
set protocols mpls interface ge-0/0/2.0
set protocols rsvp interface ge-0/0/0.0
set protocols rsvp interface ge-0/0/1.0
set protocols rsvp interface ge-0/0/2.0
//ASBR-01
set interfaces ge-0/0/0 unit 0 family mpls
set protocols mpls label-switched-path TO_PE-01 to 172.16.1.1
set protocols mpls label-switched-path TO_RR-01 to 172.16.1.4
set protocols mpls interface ge-0/0/0.0
set protocols mpls interface lo0.0
set protocols rsvp interface ge-0/0/0.0
//RR-01
set interfaces ge-0/0/0 unit 0 family mpls
set protocols mpls label-switched-path TO_ASBR-01 to 172.16.1.3
set protocols mpls label-switched-path TO_PE-01 to 172.16.1.1
set protocols mpls interface ge-0/0/0.0
set protocols rsvp interface ge-0/0/0.0
続いて、InternalなBGP部分を設定します。
今回はL3VPNでの通信だけなので、family inet-vpn (VPNv4)のみを有効にします。
RRについては「cluster」を設定します。
cluster設定されているBGP groupでのPeerは全てRoute Reflector Clientになります。
なお、P-01に設定は必要ありません。
また、一部の設定については後ほど追加します。
//PE-01
set routing-options autonomous-system 65001
set protocols bgp group INT type internal
set protocols bgp group INT local-address 172.16.1.1
set protocols bgp group INT family inet-vpn unicast
set protocols bgp group INT neighbor 172.16.1.4
//ASBR-01
set routing-options autonomous-system 65001
set protocols bgp group INT type internal
set protocols bgp group INT local-address 172.16.1.3
set protocols bgp group INT neighbor 172.16.1.4
//RR-01
set routing-options autonomous-system 65001
set protocols bgp group INT type internal
set protocols bgp group INT local-address 172.16.1.4
set protocols bgp group INT family inet-vpn unicast
set protocols bgp group INT cluster 172.16.1.4
set protocols bgp group INT neighbor 172.16.1.1
set protocols bgp group INT neighbor 172.16.1.3
続いて、L3VPNの設定をします。
前述の通り、PEとCE間はOSPFにて経路広報を行います。
今回はSP毎にRT(Route Target)を変えてるので、vrf-importとvrf-exportを個別に設定します。
SP Aは「target:65001:1」を付与してVPNv4 Prefixを送信し、SP Bは「target:65002:1」を付与してVPNv4 Prefixを送信するテイとします。
なので、SP AのPE-01において受信時は「target:65002:1」のRTを持つVPNv4 Prefixを受け入れる設定をします。
(SP BのPE-02は「target:65001:1」のRTを持つVPNv4 Prefixを受け入れる設定となります)
あと、BGPで受信したVPNv4 PrefixをVRFのOSPFドメインに広報する際はexportの設定が必要になります。意外と忘れがちな設定です。
//PE-01
set policy-options community AS65001_VPN01 members target:65001:1
set policy-options community AS65002_VPN01 members target:65002:1
set policy-options policy-statement VRF_BGP_to_OSPF term 0011 from protocol bgp
set policy-options policy-statement VRF_BGP_to_OSPF term 0011 then accept
set policy-options policy-statement VPN01_VRF_EXPORT term 0011 from protocol ospf
set policy-options policy-statement VPN01_VRF_EXPORT term 0011 then community set AS65001_VPN01
set policy-options policy-statement VPN01_VRF_EXPORT term 0011 then accept
set policy-options policy-statement VPN01_VRF_EXPORT term 9991 then reject
set policy-options policy-statement VPN01_VRF_IMPORT term 0011 from community AS65002_VPN01
set policy-options policy-statement VPN01_VRF_IMPORT term 0011 then accept
set policy-options policy-statement VPN01_VRF_IMPORT term 9991 then reject
set routing-instances VPN_01 instance-type vrf
set routing-instances VPN_01 protocols ospf area 0.0.0.0 interface ge-0/0/6.0
set routing-instances VPN_01 protocols ospf export VRF_BGP_to_OSPF
set routing-instances VPN_01 interface ge-0/0/6.0
set routing-instances VPN_01 route-distinguisher 172.16.1.1:65001
set routing-instances VPN_01 vrf-import VPN01_VRF_IMPORT
set routing-instances VPN_01 vrf-export VPN01_VRF_EXPORT
//CE-01
set protocols ospf area 0.0.0.0 interface ge-0/0/6.0 passive
set protocols ospf area 0.0.0.0 interface ge-0/0/0.0
最後に、Inter-AS Option Cに関わる設定を追加します。
具体的には以下3点の設定をします。
1. ASBR-01にて、External BGP-LU Peeringの設定
2. RR-01にて、External BGP Peeringの設定
3. PE-01、ASBR-01、RR-01にて、Internal BGP(AS65001内)におけるBGP-LUの設定
まず、1. ですが、ASBR間でeBGP-LUでPeeringをします。
その際、自ASのRRおよびPEのLoopback Address((BGP) Protocol Next-hopとなり得るIP Address)を広報します。
広報されてきた対向のRRのLoopback Addressの学習によって2. のPeeringが可能となります。
次に、2. について、RR間にてPEから学習したVPNv4アドレスを広報します。よってfamilyはinet-vpnを定義します。
また、RRで対向PEのProtocol Next-hopの解決はinet.3で解決する必要があります。
RRに「family inet labeled-unicast」といった設定をするのですが、この設定だとinet.0のみでのlookupとなりRR間での通信は実現できるものの、対向PE宛のMPLS Pathを自ASのPEへ広報できない状態となります。なので、inet.3にてlookupを行う必要があります。
方法はいくつかあるのですが、今回は一番簡単なinet.3へstatic routeを設定してゴリ押しでNext-hop解決させます。
さらに、PEへ対向のVPNv4 Prefixを広報する際、Defaultでは通常のIPv4 Unicast(SAFI=1)ルートと同様にProtocol Next-hopを自身のLoopbackに書き換えます。
そうなった場合、実トラフィックはRRを経由する形となり効率的ではありません。そのため、multihop設定にて"no-nexthop-change"というオプションを追加することにより、Protocol Next-hopを自身のLoopbackに書き換えず対向のPEのままで広報します。
最後に、3. については、AS内でLabeled-Unicastを広報できるように「set protocols bgp group INT 〜」配下に追加します。
PE、ASBR、RRによって微妙にコマンドが異なります。
なお、全てBGPに関わる設定なのでP-01については設定は必要ありません。
//PE-01
set protocols bgp group INT family inet labeled-unicast resolve-vpn
//ASBR-01
set interfaces ge-0/0/2 unit 0 family mpls
set protocols mpls interface ge-0/0/2.0
set policy-options policy-statement BGP_ASBR_EXPORT term 0011 from route-filter 172.16.1.4/32 exact
set policy-options policy-statement BGP_ASBR_EXPORT term 0011 from route-filter 172.16.1.1/32 exact
set policy-options policy-statement BGP_ASBR_EXPORT term 0011 then accept
set policy-options policy-statement BGP_ASBR_EXPORT term 9991 then reject
set protocols bgp group INT family inet labeled-unicast rib inet.3
set protocols bgp group ASBR type external
set protocols bgp group ASBR family inet labeled-unicast rib inet.3
set protocols bgp group ASBR neighbor 10.1.35.1 export BGP_ASBR_EXPORT
set protocols bgp group ASBR neighbor 10.1.35.1 peer-as 65002
//RR-01
set routing-options rib inet.3 static route 0.0.0.0/0 receive
set protocols bgp group INT family inet labeled-unicast
set protocols bgp group RR_PEER type external
set protocols bgp group RR_PEER multihop ttl 10
set protocols bgp group RR_PEER multihop no-nexthop-change
set protocols bgp group RR_PEER local-address 172.16.1.4
set protocols bgp group RR_PEER family inet-vpn unicast
set protocols bgp group RR_PEER neighbor 172.16.1.8 peer-as 65002
設定は以上となります。
3. Inter-AS Option C L3VPN 確認
それでは設定の確認をします。
まずはサクッとIS-ISとMPLS(RSVP)を確認します。
//PE-01
lab@PE-01# run show route table inet.0 protocol isis 172.16.1/24
inet.0: 14 destinations, 14 routes (14 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
172.16.1.2/32 *[IS-IS/15] 01:30:02, metric 10
> to 10.1.12.1 via ge-0/0/0.0
172.16.1.3/32 *[IS-IS/15] 01:29:34, metric 20
> to 10.1.12.1 via ge-0/0/0.0
172.16.1.4/32 *[IS-IS/15] 01:29:37, metric 20
> to 10.1.12.1 via ge-0/0/0.0
lab@PE-01# run show route table inet.3 protocol rsvp
inet.3: 4 destinations, 4 routes (4 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
172.16.1.3/32 *[RSVP/7/1] 01:32:17, metric 20
> to 10.1.12.1 via ge-0/0/0.0, label-switched-path TO_ASBR-01
172.16.1.4/32 *[RSVP/7/1] 01:32:17, metric 20
> to 10.1.12.1 via ge-0/0/0.0, label-switched-path TO_RR-01//P-01
lab@P-01# run show route table inet.0 protocol isis 172.16.1/24
inet.0: 12 destinations, 12 routes (12 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
172.16.1.1/32 *[IS-IS/15] 01:30:37, metric 10
> to 10.1.12.0 via ge-0/0/0.0
172.16.1.3/32 *[IS-IS/15] 01:30:09, metric 10
> to 10.1.23.1 via ge-0/0/1.0
172.16.1.4/32 *[IS-IS/15] 01:30:12, metric 10
> to 10.1.24.1 via ge-0/0/2.0//ASBR-01
lab@ASBR-01# run show route table inet.0 protocol isis 172.16.1/24
inet.0: 12 destinations, 12 routes (12 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
172.16.1.1/32 *[IS-IS/15] 01:30:32, metric 20
> to 10.1.23.0 via ge-0/0/0.0
172.16.1.2/32 *[IS-IS/15] 01:30:41, metric 10
> to 10.1.23.0 via ge-0/0/0.0
172.16.1.4/32 *[IS-IS/15] 01:30:32, metric 20
> to 10.1.23.0 via ge-0/0/0.0
lab@ASBR-01# run show route table inet.3 protocol rsvp
inet.3: 4 destinations, 4 routes (4 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
172.16.1.1/32 *[RSVP/7/1] 01:32:32, metric 20
> to 10.1.23.0 via ge-0/0/0.0, label-switched-path TO_PE-01
172.16.1.4/32 *[RSVP/7/1] 01:32:32, metric 20
> to 10.1.23.0 via ge-0/0/0.0, label-switched-path TO_RR-01//RR-01
lab@RR-01# run show route table inet.0 protocol isis 172.16.1/24
inet.0: 12 destinations, 12 routes (12 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
172.16.1.1/32 *[IS-IS/15] 01:31:04, metric 20
> to 10.1.24.0 via ge-0/0/0.0
172.16.1.2/32 *[IS-IS/15] 01:31:13, metric 10
> to 10.1.24.0 via ge-0/0/0.0
172.16.1.3/32 *[IS-IS/15] 01:31:10, metric 20
> to 10.1.24.0 via ge-0/0/0.0
lab@RR-01# run show route table inet.3 protocol rsvp
inet.3: 3 destinations, 3 routes (3 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
172.16.1.1/32 *[RSVP/7/1] 01:32:28, metric 20
> to 10.1.24.0 via ge-0/0/0.0, label-switched-path TO_PE-01
172.16.1.3/32 *[RSVP/7/1] 01:32:28, metric 20
> to 10.1.24.0 via ge-0/0/0.0, label-switched-path TO_ASBR-01各機器にて、互いのLoopback Addressを学習し、かつRSVP PathがActive Routeになっています。
続いて、CE-PE間のOSPFのネイバー状況を確認します。
ついでにCEネットワークの経路情報(203.0.113.0/29)を受信できているか確認します。
//PE-01
lab@PE-01# run show ospf neighbor instance VPN_01
Address Interface State ID Pri Dead
192.168.1.1 ge-0/0/6.0 Full 192.168.1.1 128 34
lab@PE-01# run show route table VPN_01.inet.0 protocol ospf
VPN_01.inet.0: 5 destinations, 5 routes (5 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
203.0.113.0/29 *[OSPF/10] 01:38:40, metric 2
> to 192.168.1.1 via ge-0/0/6.0
224.0.0.5/32 *[OSPF/10] 01:43:39, metric 1
MultiRecv//CE-01
lab@CE-01# run show ospf neighbor
Address Interface State ID Pri Dead
192.168.1.0 ge-0/0/0.0 Full 192.168.1.0 128 33
問題なくネイバー確立され、CEネットワークの経路情報を学習できてます。
続いて、RR-01にてCEネットワークのVPNv4 Prefixを受信できているか確認します。
//RR-01
lab@RR-01# run show route receive-protocol bgp 172.16.1.1 table bgp.l3vpn.0
bgp.l3vpn.0: 2 destinations, 2 routes (2 active, 0 holddown, 0 hidden)
Prefix Nexthop MED Lclpref AS path
172.16.1.1:65001:203.0.113.0/29
* 172.16.1.1 2 100 I
[edit]
lab@RR-01# run show route table bgp.l3vpn.0 match-prefix "*203.0.113.0*"
bgp.l3vpn.0: 2 destinations, 2 routes (2 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
172.16.1.1:65001:203.0.113.0/29
*[BGP/170] 01:03:56, MED 2, localpref 100, from 172.16.1.1
AS path: I, validation-state: unverified
> to 10.1.24.0 via ge-0/0/0.0, label-switched-path TO_PE-01VPNv4 Prefix(172.16.1.1:65001:203.0.113.0/29)を受信して、ルーティングテーブルに反映されています。
続いて、RR-01がRR-02にVPNv4 Prefixを送信してるか確認…をする前に、そもそもRR間でネイバーが張れてるか確認します。
丁寧に見ていきたいので、まずASBR-01で、RR-02とPE-02のLo0.0の経路情報を受信できているか確認します。
//ASBR-01
lab@ASBR-01# run show bgp summary group ASBR
Threading mode: BGP I/O
Default eBGP mode: advertise - accept, receive - accept
Groups: 2 Peers: 2 Down peers: 0
Table Tot Paths Act Paths Suppressed History Damp State Pending
inet.3
2 2 0 0 0 0
Peer AS InPkt OutPkt OutQ Flaps Last Up/Dwn State|#Active/Received/Accepted/Damped...
10.1.35.1 65002 65 63 0 0 27:26 Establ
inet.3: 2/2/2/0
[edit]
lab@ASBR-01# run show route receive-protocol bgp 10.1.35.1
inet.0: 12 destinations, 12 routes (12 active, 0 holddown, 0 hidden)
inet.3: 4 destinations, 4 routes (4 active, 0 holddown, 0 hidden)
Prefix Nexthop MED Lclpref AS path
* 172.16.1.7/32 10.1.35.1 20 65002 I
* 172.16.1.8/32 10.1.35.1 20 65002 I
iso.0: 1 destinations, 1 routes (1 active, 0 holddown, 0 hidden)
mpls.0: 10 destinations, 10 routes (10 active, 0 holddown, 0 hidden)ASBR-02(10.1.35.1)間にて、StateがEstablishedでネイバー確立しており、かつRR-02とPE-02のLo0.0の経路情報(172.16.1.8/32と172.16.1.7/32)を受信しています。
なおASBR-01において、RR-02とPE-02の経路情報はinet.3にエントリーさせる必要があります。
続いて、RR-01にてASBR-01よりRR-02とPE-02の経路情報を受信しているか確認します。
//RR-01
lab@RR-01# run show route receive-protocol bgp 172.16.1.3
inet.0: 12 destinations, 12 routes (12 active, 0 holddown, 0 hidden)
Prefix Nexthop MED Lclpref AS path
* 172.16.1.7/32 172.16.1.3 20 100 65002 I
* 172.16.1.8/32 172.16.1.3 20 100 65002 I
inet.3: 3 destinations, 3 routes (3 active, 0 holddown, 0 hidden)
iso.0: 1 destinations, 1 routes (1 active, 0 holddown, 0 hidden)
mpls.0: 6 destinations, 6 routes (6 active, 0 holddown, 0 hidden)
bgp.l3vpn.0: 2 destinations, 2 routes (2 active, 0 holddown, 0 hidden)
ASBR-01(172.16.1.3)よりRR-02とPE-02の経路情報を受信しています。
なおRR-01においては(ASBR-01と違って)RR-02の経路情報はinet.0にエントリーさせる必要があります。この辺の細かな違いが難しい…。
ちなみに、Labeled-Unicastの場合はNext-hopが自動で書き替わります(ASBR-01にてNext-hop Selfの設定はいりません)
RR-01にてRR-02の経路情報がエントリーされているので、RR間でPeeringできそうです。
(逆もしかりでASBR-01よりASBR-02へRR-01とPE-01のLo0.0の経路情報を送信している必要があります。ASBR-01から送信できてるかの確認は今回は省略します)
では、RR-01にてRR-02とのネイバー状態を確認します。
//RR-01
lab@RR-01# run show bgp summary group RR_PEER
Threading mode: BGP I/O
Default eBGP mode: advertise - accept, receive - accept
Groups: 2 Peers: 3 Down peers: 0
Table Tot Paths Act Paths Suppressed History Damp State Pending
inet.0
2 2 0 0 0 0
bgp.l3vpn.0
2 2 0 0 0 0
Peer AS InPkt OutPkt OutQ Flaps Last Up/Dwn State|#Active/Received/Accepted/Damped...
172.16.1.8 65002 202 201 0 0 1:30:03 Establ
bgp.l3vpn.0: 1/1/1/0StateがEstablishedとなっており、RR間でネイバーが張れています!
続いて経路の送受信状況を確認します。
//RR-01
lab@RR-01# run show route advertising-protocol bgp 172.16.1.8
bgp.l3vpn.0: 2 destinations, 2 routes (2 active, 0 holddown, 0 hidden)
Prefix Nexthop MED Lclpref AS path
172.16.1.1:65001:203.0.113.0/29
* 172.16.1.1 I
[edit]
lab@RR-01# run show route receive-protocol bgp 172.16.1.8
inet.0: 12 destinations, 12 routes (12 active, 0 holddown, 0 hidden)
inet.3: 3 destinations, 3 routes (3 active, 0 holddown, 0 hidden)
iso.0: 1 destinations, 1 routes (1 active, 0 holddown, 0 hidden)
mpls.0: 6 destinations, 6 routes (6 active, 0 holddown, 0 hidden)
bgp.l3vpn.0: 2 destinations, 2 routes (2 active, 0 holddown, 0 hidden)
Prefix Nexthop MED Lclpref AS path
172.16.1.7:1:203.0.113.8/29
* 172.16.1.7 65002 I
自ASのCEネットワークのVPNv4 Prefix(172.16.1.1:65001:203.0.113.0/29)を送信しています。
また、対向のCEネットワークのVPNv4 Prefix(172.16.1.7:1:203.0.113.8/29)を受信しています。
L3VPN通信のための経路情報を送り合っているので、問題なさそうです。
RR-01にて受信した対向のCEネットワークのVPNv4 PrefixがPE-01でも受信しているか確認します。
//PE-01
lab@PE-01# run show route table bgp.l3vpn.0
bgp.l3vpn.0: 1 destinations, 1 routes (1 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
172.16.1.7:1:203.0.113.8/29
*[BGP/170] 00:12:49, localpref 100, from 172.16.1.4
AS path: 65002 I, validation-state: unverified
> to 10.1.12.1 via ge-0/0/0.0, label-switched-path TO_ASBR-01
[edit]
lab@PE-01# run show route table VPN_01.inet.0 203.0.113.08/29
VPN_01.inet.0: 5 destinations, 5 routes (5 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
203.0.113.8/29 *[BGP/170] 00:13:23, localpref 100, from 172.16.1.4
AS path: 65002 I, validation-state: unverified
> to 10.1.12.1 via ge-0/0/0.0, label-switched-path TO_ASBR-01VPNv4 PrefixをRR-01から受信していますね。
また、VRFのルーティングテーブルである「VPN_01.inet.0」に対向のCEネットワーク(203.0.113.8/29)がエントリーされています。
正しく経路情報を学習しています!!
最後にCE-01において、OSPFにて対向のCEネットワークを学習しているか確認します。
//CE-01
lab@CE-01# run show route protocol ospf 203.0.113.8/29
inet.0: 6 destinations, 6 routes (6 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
203.0.113.8/29 *[OSPF/150] 00:19:34, metric 0, tag 3489725929
> to 192.168.1.0 via ge-0/0/0.0CE-01にて対向CEネットワークの経路情報を学習できています!
PE-01についても対向CEネットワーク宛はASBR-01へLabel Switchingされる様になっているので、少なくとも自ASにて対向のCEネットワーク宛のパケットはお相手のASに転送されそうです!!
(ルーティングテーブルの詳細確認はこの後行います)
では、PingにてvPC間で通信できるか確認します。
//VPC-01
VPC-01> ping 203.0.113.9
84 bytes from 203.0.113.9 icmp_seq=1 ttl=56 time=5.601 ms
84 bytes from 203.0.113.9 icmp_seq=2 ttl=56 time=5.144 ms
84 bytes from 203.0.113.9 icmp_seq=3 ttl=56 time=5.285 ms
84 bytes from 203.0.113.9 icmp_seq=4 ttl=56 time=5.214 ms
84 bytes from 203.0.113.9 icmp_seq=5 ttl=56 time=6.441 ms
対向のVPC(vPC-02)へPing疎通できました!!やったー!
という訳で一旦、ゴールであるL3VPNによるVPC間の疎通は無事できました。
とは言え、せっかくなのでパケットが各機器に届いた際、どんな処理を行なってるか詳しく見ていきましょう。
4. Inter-AS Option C L3VPN 詳細確認
ここから各機器の詳細な経路情報と実際のパケットを見ていきます。
最初に書いた、ChrisさんのBlogの絵と比較しながら読むとわかりやすいと思います。
まず、vPC-01(203.0.113.1)からvPC-02(203.0.113.9)宛のICMP Echo Request(以下、Echo Req)を送信します。
Echo Reqが届いたCE-01は、OSPFにて学習した経路情報に沿ってPE-01(192.168.1.0)へ転送します。
//CE-01
lab@CE-01# run show route protocol ospf 203.0.113.8/29
inet.0: 6 destinations, 6 routes (6 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
203.0.113.8/29 *[OSPF/150] 00:19:34, metric 0, tag 3489725929
> to 192.168.1.0 via ge-0/0/0.0CE-01〜PE-01間のパケットキャプチャーを見ます。

EthernetヘッダーがあってIPヘッダーが付いてる、まあ普通のパケット構造ですね。
続いて、PE-01の詳細な経路情報を見ます。
VRFなインターフェイスにて受信しているので、作成したRouting-Instanceのテーブル(VPN_01.inet.0)にて確認します。
//PE-01
lab@PE-01# run show route 203.0.113.8/29 table VPN_01.inet.0 extensive
VPN_01.inet.0: 5 destinations, 5 routes (5 active, 0 holddown, 0 hidden)
203.0.113.8/29 (1 entry, 1 announced)
<snip>
Next hop: 10.1.12.1 via ge-0/0/0.0, selected
Label-switched-path TO_ASBR-01
Label operation: Push 299776, Push 299808, Push 299856(top)
<snip>出力結果より、Label-switched-pathの項目より「TO_ASBR-01」のPathを使ってパケット転送する様になっています。
また、Label operationの項目より「Push 299776, Push 299808, Push 299856」と3重でLabelが付くようになっています。
そして、Next hopの項目より「10.1.12.1」へ、つまりP-01に転送しています。
実際にPE-01〜P-01間のパケットキャプチャーを見て、確認します。

EthernetヘッダーとIPヘッダーの間に、経路情報の通り、上から299856、299808、299776のLabelが挿入されてますね。
続いて、P-01の詳細な経路情報を見ます。
TopなLabel 299856をlookupして処理するため、Labelを指定して確認します。
//P-01
lab@P-01# run show route label 299856
mpls.0: 18 destinations, 18 routes (18 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
299856 *[RSVP/7/1] 00:27:39, metric 1
> to 10.1.23.1 via ge-0/0/1.0, label-switched-path TO_ASBR-01
299856(S=0) *[RSVP/7/1] 00:27:39, metric 1
> to 10.1.23.1 via ge-0/0/1.0, label-switched-path TO_ASBR-01
[edit]
lab@P-01# run show route label 299856 extensive
mpls.0: 18 destinations, 18 routes (18 active, 0 holddown, 0 hidden)
<snip>
299856(S=0) (1 entry, 1 announced)
<snip>
Next hop: 10.1.23.1 via ge-0/0/1.0, selected
Label-switched-path TO_ASBR-01
Label operation: Pop
<snip>299856について、「299856」と「299856(S=0) 」がありますが、パケットにLabelが3つスタックされているため、「299856(S=0)」のエントリーをlookupします。
出力結果より、Top LebelがPop(削除)され、 10.1.23.1(ASBR-01)へ転送される様になっています。
なので、3重となっているLabelが1つ削除され、2重になってASBR-01へ転送されることとなります。
実際にP-01〜 ASBR-01間のパケットキャプチャーを見て、確認します。

経路情報の通り、299856のLabelが削除され、299808、299776のLabelが残ってますね。
続いて、ASBR-01の詳細な経路情報を見ます。
TopなLabel 299808をlookupして処理するため、Labelを指定して確認します。
//ASBR-01
lab@ASBR-01# run show route label 299808 extensive
mpls.0: 10 destinations, 10 routes (10 active, 0 holddown, 0 hidden)
299808 (1 entry, 1 announced)
<snip>
Next hop: 10.1.35.1 via ge-0/0/2.0, selected
Label operation: Swap 299776
<snip>出力結果より、Top Lebelが299776にSwap(付け替え)され、 10.1.35.1(ASBR-02)へ転送される様になっています。
なのでAS間にてLabel Switchingによってパケット転送されることとなります。
実際にASBR-01〜ASBR-02間のパケットキャプチャーを見て、確認します。

経路情報の通り、299808が299776に替わり、かつ(元々あった)299776のLabelが残ってますね。
少なくとも自ASについては、正しくOption Cとしてのパケット転送が動作してそうです。
せっかくなので、対向ASのASBR-02に届いた後のパケットの処理も見ていきましょう。
対向ASも自ASと同じく、RSVP PathによるLabel switchingを行なっています。
ASBR-02の詳細な経路情報を見ます。
TopなLabel 299776をlookupして処理するため、Labelを指定して確認します。
//ASBR-02
lab@ASBR-02# run show route label 299776 extensive
mpls.0: 10 destinations, 10 routes (10 active, 0 holddown, 0 hidden)
299776 (1 entry, 1 announced)
<snip>
Next hop: 10.1.56.1 via ge-0/0/0.0, selected
Label-switched-path TO_PE-02
Label operation: Swap 299808
<snip>出力結果より、Label-switched-pathの項目より「TO_PE-02」のPathを使ってパケット転送する様になっています。
また、Label operationの項目より、299776が299808にSwapする様になっています。
そして、Next hopの項目より10.1.56.1(P-02)に転送しています。
実際にASBR-02〜P-02間のパケットキャプチャーを見て、確認します。

経路情報の通り、299776が299808に替わり、かつ(元々あった)299776のLabelが残ってますね。
続いて、P-02の詳細な経路情報を見ます。
TopなLabel 299808をlookupして処理するため、Labelを指定して確認します。
//P-02
lab@P-02# run show route label 299808
mpls.0: 18 destinations, 18 routes (18 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
299808 *[RSVP/7/1] 01:02:19, metric 1
> to 10.1.67.1 via ge-0/0/0.0, label-switched-path TO_PE-02
299808(S=0) *[RSVP/7/1] 01:02:19, metric 1
> to 10.1.67.1 via ge-0/0/0.0, label-switched-path TO_PE-02
[edit]
lab@P-02# run show route label 299808 extensive
mpls.0: 18 destinations, 18 routes (18 active, 0 holddown, 0 hidden)
299808(S=0) (1 entry, 1 announced)
<snip>
Next hop: 10.1.67.1 via ge-0/0/0.0, selected
Label-switched-path TO_PE-02
Label operation: Pop
<snip>299808について、「299808」と「299808(S=0) 」がありますが、パケットにLabelが2つスタックされているため、「299808(S=0)」のエントリーをlookupします。
出力結果より、Top LebelがPopされ、 10.1.67.1(PE-02)へ転送される様になっています。
なので、2重となっているLabelが1つ削除され、1つのみとなってPE-02へ転送されることとなります。
実際にP-02〜 PE-02間のパケットキャプチャーを見て、確認します。

経路情報の通り、299808のLabelが削除され、299776のLabelのみ残ってますね。
続いてPE-02の詳細な経路情報を見ます。
Label 299776をlookupして処理するため、Labelを指定して確認します。
//PE-02
lab@PE-02# run show route label 299776 extensive
mpls.0: 7 destinations, 7 routes (7 active, 0 holddown, 0 hidden)
299776 (1 entry, 1 announced)
<snip>
Next hop: 192.168.11.1 via ge-0/0/6.0, selected
Label operation: Pop
<snip>出力結果より、LabelがPopされ192.168.11.1(CE-02)へ転送される様になっています。
最後のLabelがPopされるため、Ethernetヘッダーの上にIPヘッダーが付いた普通のパケット構造になります。
PE-02〜CE-02間のパケットキャプチャーを見ます。

経路情報の通り、Labelが無くなっていますね。
最後に、おまけでCE-02のルーティングテーブルも見ます。
//CE-02
lab@CE-02# run show route 203.0.113/24
inet.0: 6 destinations, 6 routes (6 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
203.0.113.0/29 *[OSPF/150] 07:47:29, metric 0, tag 3489725930
> to 192.168.11.0 via ge-0/0/0.0
203.0.113.8/29 *[Direct/0] 07:47:34
> via ge-0/0/6.0
203.0.113.14/32 *[Local/0] 07:47:34
Local via ge-0/0/6.0(当たり前ですが)直接接続な203.0.113.8/29のネットワークが存在してます。
Echo Reqパケットはge-0/0/6から送出され、vPC-02に届いてることでしょう。
また、CE-02から見た対向のCEネットワーク情報(203.0.113.0/29)をOSPFで学習しています。
Echo Replayパケットは、このルーティングテーブルに沿ってパケット転送されてることでしょう。
無事、複数のASを跨いでL3VPNな通信ができていることが証明できました。
という訳でInter-AS Option Cの構築が無事できました!
今回は以上になります!!
ここまでお読みいただき、ありがとうございました!!!!!
… 尺の都合で対向AS側(PE-02、P-02、ASBR-02、RR-02)の機器の設定例は載せてませんが、要望多ければ載せます。
ぜひ参考にしたい!という方はご連絡をw
5. 参考資料
書籍 O'Reilly 「MPLS in the SDN Era: Interoperable Scenarios to Make Networks Scale to New Services」
Juniper Documentation - Layer 3 VPNs User Guide for Routing Devices - Interprovider VPNswww.juniper.net
NETWORK FUNTIME - INTERPROVIDER OPTION C, ON JUNIPER JUNOS ROUTERS – PART 1www.networkfuntimes.com