今回から二回に渡り、vJunos-routerを使ってLDPによるMPLSの検証をしたいと思います。
今回の「その1」はLDPまで設定して、MPLSによるIPv4パケット転送を確認します。
次回の「その2」は6PEを使ったIPv6 over IPv4を確認したいと思います。
主にJunosの設定と確認について書き記します。
例によって用語の詳しい説明は行いません。わからない用語は各自でググってください。
- 1. MPLS LDP 構成
- 2-1. MPLS LDP - OSPF 設定・確認
- 2-2. MPLS LDP - BGP 設定・確認
- 2-3. MPLS LDP - LDP 設定・確認
- 3. 参考資料
1. MPLS LDP 構成
トポロジーは以下の通りです。

MPLSを動かすネットワーク(疑似Service-Provider(疑似SP)網)を中心に、Customer Edge(CE)なSiteを2つ用意します。
疑似SP網でMPLSにてパケット転送を行った上で、CE RouterのLoopback Address間で通信できることがゴールとなります。
CEとProvider Edge(PE) RouterでIPv4とIPv6によるeBGP Peeringを行います(IPv6によるCE間通信を行うのは次回ですが)
また、疑似SP網内はRoute-Reflector(RR)によってBGPの経路を広報します。
2-1. MPLS LDP - OSPF 設定・確認
それでは設定していきます。
IP(v4、v6) Addressの設定は完了していることとします。
まず、疑似SP網内でUnderlayとなるOSPFを設定し、R2~R6のLoopback Addressをお互い広報します。
//R2 set routing-options router-id 172.16.1.2 set protocols ospf area 0.0.0.0 interface ge-0/0/1.0 set protocols ospf area 0.0.0.0 interface lo0.0 passive
//R3 set routing-options router-id 172.16.1.3 set protocols ospf area 0.0.0.0 interface ge-0/0/1.0 set protocols ospf area 0.0.0.0 interface ge-0/0/0.0 set protocols ospf area 0.0.0.0 interface lo0.0 passive set protocols ospf area 0.0.0.0 interface ge-0/0/6.0
//R4 set routing-options router-id 172.16.1.4 set protocols ospf area 0.0.0.0 interface ge-0/0/0.0 set protocols ospf area 0.0.0.0 interface lo0.0 passive set protocols ospf area 0.0.0.0 interface ge-0/0/6.0 set protocols ospf area 0.0.0.0 interface ge-0/0/1.0
//R5 set routing-options router-id 172.16.1.5 set protocols ospf area 0.0.0.0 interface ge-0/0/0.0 set protocols ospf area 0.0.0.0 interface lo0.0 passive
//R6 set routing-options router-id 172.16.1.6 set protocols ospf area 0.0.0.0 interface lo0.0 passive set protocols ospf area 0.0.0.0 interface ge-0/0/1.0 set protocols ospf area 0.0.0.0 interface ge-0/0/2.0
OSPF設定で特筆すべき点は…特にないですw
R2~R6でお互いのLoopback Addressを学習できてるか確認します。
念のため、OSPFを動かしているIFでAdjacencyが確立してるかも見ましょう。
BlogではR6のみ確認します(実際はR2~R5でも確認してます)
//R6
lab@R6# run show ospf neighbor
Address Interface State ID Pri Dead
10.1.36.3 ge-0/0/1.0 Full 172.16.1.3 128 31
10.1.46.4 ge-0/0/2.0 Full 172.16.1.4 128 34
lab@R6# run show route protocol ospf 172.16.1/24
inet.0: 13 destinations, 13 routes (13 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
172.16.1.2/32 *[OSPF/10] 00:05:09, metric 2
> to 10.1.36.3 via ge-0/0/1.0
172.16.1.3/32 *[OSPF/10] 00:05:09, metric 1
> to 10.1.36.3 via ge-0/0/1.0
172.16.1.4/32 *[OSPF/10] 00:04:59, metric 1
> to 10.1.46.4 via ge-0/0/2.0
172.16.1.5/32 *[OSPF/10] 00:04:59, metric 2
> to 10.1.46.4 via ge-0/0/2.0neighbor Stateが「Full」となっており、かつR2~R5のLoopback Addressを学習していますね。
OSPFの設定は以上です。
2-2. MPLS LDP - BGP 設定・確認
続いて、BGPの設定をしていきます。
CEなR1とR7はeBGPの設定、PEなR2とR5はeBGPとiBGPの設定、PなR3とR4はiBGPの設定、R6は文字通りRRの設定をします。
前述の通り、eBGPはIPv4に加えてIPv6でのPeeringも行います。
R1(R7)は自身のLoopback AddressをR2(R5)に広報します。
R2~R5は(R6がRRなので)R6のみとiBGP Peeringします。
//R1 set policy-options policy-statement BGP_R2_V4_EXPORT term 0011 from protocol direct set policy-options policy-statement BGP_R2_V4_EXPORT term 0011 from route-filter 172.16.1.1/32 exact set policy-options policy-statement BGP_R2_V4_EXPORT term 0011 then accept set policy-options policy-statement BGP_R2_V4_EXPORT term 9991 then reject set policy-options policy-statement BGP_R2_V6_EXPORT term 0011 from protocol direct set policy-options policy-statement BGP_R2_V6_EXPORT term 0011 from route-filter 3fff::1/128 exact set policy-options policy-statement BGP_R2_V6_EXPORT term 0011 then accept set policy-options policy-statement BGP_R2_V6_EXPORT term 9991 then reject set routing-options router-id 172.16.1.1 set routing-options autonomous-system 65001 set protocols bgp group EXTERNAL type external set protocols bgp group EXTERNAL neighbor 10.1.12.2 export BGP_R2_V4_EXPORT set protocols bgp group EXTERNAL neighbor 10.1.12.2 peer-as 65002 set protocols bgp group EXTERNAL neighbor 2001:db8:1:12::2 export BGP_R2_V6_EXPORT set protocols bgp group EXTERNAL neighbor 2001:db8:1:12::2 peer-as 65002
//R2 set policy-options policy-statement BGP_R6_EXPORT term 0011 from protocol bgp set policy-options policy-statement BGP_R6_EXPORT term 0011 then next-hop self set policy-options policy-statement BGP_R6_EXPORT term 0011 then accept set policy-options policy-statement BGP_R6_EXPORT term 9991 then reject set routing-options autonomous-system 65002 set protocols bgp group INTERNAL type internal set protocols bgp group INTERNAL local-address 172.16.1.2 set protocols bgp group INTERNAL neighbor 172.16.1.6 export BGP_R6_EXPORT set protocols bgp group EXTERNAL type external set protocols bgp group EXTERNAL neighbor 10.1.12.1 peer-as 65001 set protocols bgp group EXTERNAL neighbor 2001:db8:1:12::1 peer-as 65001
//R3 set routing-options autonomous-system 65002 set protocols bgp group INTERNAL type internal set protocols bgp group INTERNAL local-address 172.16.1.3 set protocols bgp group INTERNAL neighbor 172.16.1.6
//R4 set routing-options autonomous-system 65002 set protocols bgp group INTERNAL type internal set protocols bgp group INTERNAL local-address 172.16.1.4 set protocols bgp group INTERNAL neighbor 172.16.1.6
//R5 set policy-options policy-statement BGP_R6_EXPORT term 0011 from protocol bgp set policy-options policy-statement BGP_R6_EXPORT term 0011 then next-hop self set policy-options policy-statement BGP_R6_EXPORT term 0011 then accept set policy-options policy-statement BGP_R6_EXPORT term 9991 then reject set routing-options autonomous-system 65002 set protocols bgp group EXTERNAL type external set protocols bgp group EXTERNAL neighbor 10.1.57.7 peer-as 65007 set protocols bgp group EXTERNAL neighbor 2001:db8:1:57::7 peer-as 65007 set protocols bgp group INTERNAL type internal set protocols bgp group INTERNAL local-address 172.16.1.5 set protocols bgp group INTERNAL neighbor 172.16.1.6 export BGP_R6_EXPORT
//R6 set routing-options autonomous-system 65002 set protocols bgp group INTERNAL type internal set protocols bgp group INTERNAL local-address 172.16.1.6 set protocols bgp group INTERNAL cluster 172.16.1.6 set protocols bgp group INTERNAL neighbor 172.16.1.2 set protocols bgp group INTERNAL neighbor 172.16.1.3 set protocols bgp group INTERNAL neighbor 172.16.1.4 set protocols bgp group INTERNAL neighbor 172.16.1.5
//R7 set policy-options policy-statement BGP_R5_V4_EXPORT term 0011 from protocol direct set policy-options policy-statement BGP_R5_V4_EXPORT term 0011 from route-filter 172.16.1.7/32 exact set policy-options policy-statement BGP_R5_V4_EXPORT term 0011 then accept set policy-options policy-statement BGP_R5_V4_EXPORT term 9991 then reject set policy-options policy-statement BGP_R5_V6_EXPORT term 0011 from protocol direct set policy-options policy-statement BGP_R5_V6_EXPORT term 0011 from route-filter 3fff::7/128 exact set policy-options policy-statement BGP_R5_V6_EXPORT term 0011 then accept set policy-options policy-statement BGP_R5_V6_EXPORT term 9991 then reject set routing-options router-id 172.16.1.7 set routing-options autonomous-system 65007 set protocols bgp group EXTERNAL type external set protocols bgp group EXTERNAL neighbor 10.1.57.5 export BGP_R5_V4_EXPORT set protocols bgp group EXTERNAL neighbor 10.1.57.5 peer-as 65002 set protocols bgp group EXTERNAL neighbor 2001:db8:1:57::5 export BGP_R5_V6_EXPORT set protocols bgp group EXTERNAL neighbor 2001:db8:1:57::5 peer-as 65002
R1とR7はIPv4とIPv6のLoopback Addressを広報する設定をしています。
R6はRoute-Reflectorとなるため、clusterオプションを設定しています。
clusterオプションが入っているgroupのネイバーはRoute-Reflector Clientとなります。
また、PEのR2とR5についてはnext-hop self設定を行い、BGPにおけるネクストホップ(Protocol next hop)を変更しています。
BGPの確認をしていきます。
まず、R2にてPeering状況と、R1よりIPv4とIPv6の経路情報(Loopback Address)が広報されているか確認します。
//R2
lab@R2# run show bgp summary
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
inet6.0
1 1 0 0 0 0
Peer AS InPkt OutPkt OutQ Flaps Last Up/Dwn State|#Active/Received/Accepted/Damped...
10.1.12.1 65001 13 11 0 0 4:18 Establ
inet.0: 1/1/1/0
172.16.1.6 65002 10 10 0 0 3:20 Establ
inet.0: 1/1/1/0
2001:db8:1:12::1 65001 13 11 0 0 4:08 Establ
inet6.0: 1/1/1/0
[edit]
lab@R2# run show route table inet.0 receive-protocol bgp 10.1.12.1
inet.0: 18 destinations, 18 routes (18 active, 0 holddown, 0 hidden)
Prefix Nexthop MED Lclpref AS path
* 172.16.1.1/32 10.1.12.1 65001 I
[edit]
lab@R2# run show route table inet6.0 receive-protocol bgp 2001:db8:1:12::1
inet6.0: 5 destinations, 5 routes (5 active, 0 holddown, 0 hidden)
Prefix Nexthop MED Lclpref AS path
* 3fff::1/128 2001:db8:1:12::1 65001 I
lab@R2# run show route advertising-protocol bgp 172.16.1.6
inet.0: 18 destinations, 18 routes (18 active, 0 holddown, 0 hidden)
Prefix Nexthop MED Lclpref AS path
* 172.16.1.1/32 Self 100 65001 I「run show bgp summary 」コマンドにて10.1.12.1(R1 IPv4)、172.16.1.6(R6)、2001:db8:1:12::1(R1 IPv6)とBGPネイバーが確立(Establ)していますね。
また、「run show route table inet.0(inet6.0) receive-protocol bgp~」コマンドでR1のLoopback Address(172.16.1.1/32、3fff::1/128)の経路情報を受信していることが確認できます。
最後の「run show route table inet.0 advertising-protocol bgp~」コマンドでR6(172.16.1.6)へ(R1のIPv4 Loopback Addressな)経路情報を広報していることが確認できます。
ちなみに、この時点ではR1のIPv6 Loopback Addressは広報できません。
次に、RRであるR6を見ていきます。
//R6
lab@R6# run show bgp summary
Threading mode: BGP I/O
Default eBGP mode: advertise - accept, receive - accept
Groups: 1 Peers: 4 Down peers: 0
Table Tot Paths Act Paths Suppressed History Damp State Pending
inet.0
2 2 0 0 0 0
Peer AS InPkt OutPkt OutQ Flaps Last Up/Dwn State|#Active/Received/Accepted/Damped...
172.16.1.2 65002 35 32 0 0 14:08 Establ
inet.0: 1/1/1/0
172.16.1.3 65002 35 34 0 0 14:22 Establ
inet.0: 0/0/0/0
172.16.1.4 65002 31 30 0 0 12:36 Establ
inet.0: 0/0/0/0
172.16.1.5 65002 30 27 0 0 11:52 Establ
inet.0: 1/1/1/0
[edit]
lab@R6# run show route table inet.0 receive-protocol bgp 172.16.1.2
inet.0: 17 destinations, 17 routes (17 active, 0 holddown, 0 hidden)
Prefix Nexthop MED Lclpref AS path
* 172.16.1.1/32 172.16.1.2 100 65001 I
[edit]
lab@R6# run show route table inet.0 advertising-protocol bgp 172.16.1.5
inet.0: 17 destinations, 17 routes (17 active, 0 holddown, 0 hidden)
Prefix Nexthop MED Lclpref AS path
* 172.16.1.1/32 172.16.1.2 100 65001 IR2~R5とBGPネイバーが確立していますね。
また、R2(172.16.1.2)から経路情報を受信し、「run show route table inet.0 advertising-protocol bgp~」コマンドでR5(172.16.1.5)へ広報していることが確認できます。
ちなみに、(run) show bgp neighbor~コマンドにて、対向のRouterをRoute-Reflector Clientとして見なしているか確認できます。
//R6 lab@R6# run show bgp neighbor 172.16.1.2 Peer: 172.16.1.2+179 AS 65002 Local: 172.16.1.6+54043 AS 65002 Group: INTERNAL Routing-Instance: master Forwarding routing-instance: master Type: Internal State: Established (route reflector client)Flags: <Sync> <snip>
次に、R5にて確認します。
//R5
lab@R5# run show bgp summary
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
inet6.0
1 1 0 0 0 0
Peer AS InPkt OutPkt OutQ Flaps Last Up/Dwn State|#Active/Received/Accepted/Damped...
10.1.57.7 65007 66 64 0 0 28:15 Establ
inet.0: 1/1/1/0
172.16.1.6 65002 63 62 0 0 27:19 Establ
inet.0: 1/1/1/0
2001:db8:1:57::7 65007 66 63 0 0 28:04 Establ
inet6.0: 1/1/1/0
[edit]
lab@R5# run show route receive-protocol bgp 172.16.1.6
inet.0: 18 destinations, 18 routes (18 active, 0 holddown, 0 hidden)
Prefix Nexthop MED Lclpref AS path
* 172.16.1.1/32 172.16.1.2 100 65001 I
inet6.0: 5 destinations, 5 routes (5 active, 0 holddown, 0 hidden)
[edit]
lab@R5# run show route advertising-protocol bgp 10.1.57.7
inet.0: 18 destinations, 18 routes (18 active, 0 holddown, 0 hidden)
Prefix Nexthop MED Lclpref AS path
* 172.16.1.1/32 Self 65001 IRRのR6(172.16.1.6)およびCEのR7(IPv4: 10.1.57.7 、IPv6: 2001:db8:1:57::7)とBGPネイバー確立していることが確認できます。
また、R6から経路情報を受信しており、R7へ広報していることが確認できます。
最後にR7にてR1のLoopback Addressな経路情報を受信しているか確認します。
//R7
[edit]
lab@R7# run show route receive-protocol bgp 10.1.57.5
inet.0: 6 destinations, 6 routes (6 active, 0 holddown, 0 hidden)
Prefix Nexthop MED Lclpref AS path
* 172.16.1.1/32 10.1.57.5
lab@R7# run show route 172.16.1.1/32
inet.0: 6 destinations, 6 routes (6 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
172.16.1.1/32 *[BGP/170] 00:45:39, localpref 100
AS path: 65002 65001 I, validation-state: unverified
> to 10.1.57.5 via ge-0/0/0.0R5から経路情報を受信し、ルーティングテーブルにR1のLoopback Address(172.16.1.1)がエントリーされていることが確認できました。
これで、CE Site1からの経路情報はCE Site 2へ広報されました!!
同様の観点でCE Site 2の経路情報(R7のLoopback Address)もCE Site1へ広報されているか確認する必要がありますが、今回は省略します。
この時点でR1とR7のLoopback Address間でPing疎通はできます。
//R1 lab@R1# run ping 172.16.1.7 source 172.16.1.1 rapid PING 172.16.1.7 (172.16.1.7): 56 data bytes !!!!! --- 172.16.1.7 ping statistics --- 5 packets transmitted, 5 packets received, 0% packet loss round-trip min/avg/max/stddev = 2.876/3.212/3.877/0.355 ms
MPLSの設定をまだしていないので、疑似SP網ではIPヘッダー(宛先 IP Address)によるルーティングを行っています。
2-3. MPLS LDP - LDP 設定・確認
では、疑似SP網内でMPLSでパケット転送する設定をしていきます。
今回はLDPを使ってLabel配布を行います。
//R2 set interfaces ge-0/0/1 unit 0 family mpls set protocols mpls interface ge-0/0/1.0 set protocols ldp interface ge-0/0/1.0
//R3 set interfaces ge-0/0/0 unit 0 family mpls set interfaces ge-0/0/1 unit 0 family mpls set protocols mpls interface ge-0/0/1.0 set protocols mpls interface ge-0/0/0.0 set protocols ldp interface ge-0/0/0.0 set protocols ldp interface ge-0/0/1.0
//R4 set interfaces ge-0/0/0 unit 0 family mpls set interfaces ge-0/0/1 unit 0 family mpls set protocols mpls interface ge-0/0/0.0 set protocols mpls interface ge-0/0/1.0 set protocols ldp interface ge-0/0/0.0 set protocols ldp interface ge-0/0/1.0
//R5 set interfaces ge-0/0/0 unit 0 family mpls set protocols mpls interface ge-0/0/0.0 set protocols ldp interface ge-0/0/0.0
物理IF配下でfamily mplsを有効にして、protocols mplsとldpで対象IFを定義すればいいだけです。
わざわざfamily mplsを有効にするコマンドは必要なのか…
ちなみにMPLSで転送したいIFのみを対象とすればよいので、R6やR6間のリンクに対して設定は必要ありません。
動作確認ですが、かなりややこしいです。ある程度のBGPの知識が必要になります。
まず、各Router間でLDPネイバーが確立してるか確認します。
//R2 lab@R2# run show ldp session Address State Connection Hold time Adv. Mode 172.16.1.3 Operational Open 23 DU
//R3 lab@R3# run show ldp session Address State Connection Hold time Adv. Mode 172.16.1.2 Operational Open 28 DU 172.16.1.4 Operational Open 28 DU
//R4 lab@R4# run show ldp session Address State Connection Hold time Adv. Mode 172.16.1.3 Operational Open 20 DU 172.16.1.5 Operational Open 20 DU
//R5 lab@R5# run show ldp session Address State Connection Hold time Adv. Mode 172.16.1.4 Operational Open 27 DU
「State」がOperational、「Connection 」がOpenとなっていればLDPネイバー確立しています。
R2~R5いずれも確立していますね。
続いて、LDP(MPLS)を有効にして作成されたinet.3テーブルを確認します。
inet.3テーブルはMPLSによってパケット転送を行うためのルーティングテーブルになります。
詳しい説明は後ほどします。
//R2
lab@R2# run show route table inet.3
inet.3: 3 destinations, 3 routes (3 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
172.16.1.3/32 *[LDP/9] 00:18:19, metric 1
> to 10.1.23.3 via ge-0/0/1.0
172.16.1.4/32 *[LDP/9] 00:17:54, metric 1
> to 10.1.23.3 via ge-0/0/1.0, Push 299792
172.16.1.5/32 *[LDP/9] 00:17:24, metric 1
> to 10.1.23.3 via ge-0/0/1.0, Push 299808//R3
lab@R3# run show route table inet.3
inet.3: 3 destinations, 3 routes (3 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
172.16.1.2/32 *[LDP/9] 00:23:44, metric 1
> to 10.1.23.2 via ge-0/0/0.0
172.16.1.4/32 *[LDP/9] 00:23:19, metric 1
> to 10.1.34.4 via ge-0/0/1.0
172.16.1.5/32 *[LDP/9] 00:22:48, metric 1
> to 10.1.34.4 via ge-0/0/1.0, Push 299808//R4
lab@R4# run show route table inet.3
inet.3: 3 destinations, 3 routes (3 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
172.16.1.2/32 *[LDP/9] 00:23:39, metric 1
> to 10.1.34.3 via ge-0/0/0.0, Push 299776
172.16.1.3/32 *[LDP/9] 00:23:39, metric 1
> to 10.1.34.3 via ge-0/0/0.0
172.16.1.5/32 *[LDP/9] 00:23:08, metric 1
> to 10.1.45.5 via ge-0/0/1.0//R5
lab@R5# run show route table inet.3
inet.3: 3 destinations, 3 routes (3 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
172.16.1.2/32 *[LDP/9] 00:23:32, metric 1
> to 10.1.45.4 via ge-0/0/0.0, Push 299792
172.16.1.3/32 *[LDP/9] 00:23:32, metric 1
> to 10.1.45.4 via ge-0/0/0.0, Push 299776
172.16.1.4/32 *[LDP/9] 00:23:32, metric 1
> to 10.1.45.4 via ge-0/0/0.0いずれのRouterも他のRouterのLoopback Addressを学習しています。
これはJunosの仕様で、Defaultでは自身のLoopback Address(正確にはRouter ID)に対するLabelを広報します。
BGPでの通信においてProtocol next hopの解決時、大抵はLoopback Addressであることを見越した実装となっているようです。
BGP Protocol next hopの解決時はinet.0とinet.3テーブルをlookupし、inet.3テーブルによったパケット転送を行うのであれば、定義されたLabelを付与する動作となっています。
その辺のマニアックな話はココに書いてあります(JunosにおけるMPLS動作を理解する点ではメッチャ重要だったりする…)
…まあ文章書いてる自分でも良く分からんので、動作確認しながら説明します。
前述のとおり、LDPはBGPによる通信が前提となっています。
このネットワークでは、CE Site(R1とR7のLoopback Address)間で通信する際にMPLSが使われます。
まずR2にて、CE Site2なR7宛の経路情報を見ていきます。
//R2
lab@R2# run show route 172.16.1.7
inet.0: 19 destinations, 19 routes (19 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
172.16.1.7/32 *[BGP/170] 00:51:25, localpref 100, from 172.16.1.6
AS path: 65007 I, validation-state: unverified
> to 10.1.23.3 via ge-0/0/1.0, Push 299808エントリーの最後に「Push 299808」があり、Label 299808が付与されて転送されることが確認できます。
これは172.16.1.7/32のProtocol next hopがinet.3内のエントリーに該当するため、Label(Shimヘッダー)が付与されることを意味しています。
172.16.1.7/32の詳細を見ます。
//R2
lab@R2# run show route 172.16.1.7 extensive
inet.0: 19 destinations, 19 routes (19 active, 0 holddown, 0 hidden)
172.16.1.7/32 (1 entry, 1 announced)
<snip>
Protocol next hop: 172.16.1.5
<snip>
lab@R2# run show route table inet.3 172.16.1.5
inet.3: 3 destinations, 3 routes (3 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
172.16.1.5/32 *[LDP/9] 01:03:22, metric 1
> to 10.1.23.3 via ge-0/0/1.0, Push 299808Protocol next hopが172.16.1.5(next-hop self設定したR5)となっており、このAddressはinet.3テーブルにエントリーされています。
そのため、LDPによって定義されたLabel 299808が付与されて10.1.23.3(R3)へパケット転送を行う動作となります。
実際にR1からR7へPingを飛ばし、R2とR3間のパケットキャプチャーも見てみます。

R7宛なEcho Requestパケットに、Shimヘッダー(MPLS Header)が挿入されてR3へ転送されています。
R2のルーティングテーブルに沿ってLabel 299808となっています。
続いて、R3のルーティングテーブルを確認します。
R3はShimヘッダーが付与された状態でパケットを受信するため、見るべきテーブルはmpls.0テーブルになります。
MPLSで通信すると言っても、Routerによって確認するテーブルが異なります(この辺がMPLSを理解する上で、とっつきにくい箇所だと思っている…)
//R3
lab@R3# run show route table mpls.0 | no-more
mpls.0: 11 destinations, 11 routes (11 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
0 *[MPLS/0] 06:03:57, metric 1
to table inet.0
0(S=0) *[MPLS/0] 06:03:57, metric 1
to table mpls.0
1 *[MPLS/0] 06:03:57, metric 1
Receive
2 *[MPLS/0] 06:03:57, metric 1
to table inet6.0
2(S=0) *[MPLS/0] 06:03:57, metric 1
to table mpls.0
13 *[MPLS/0] 06:03:57, metric 1
Receive
299776 *[LDP/9] 06:03:56, metric 1
> to 10.1.23.2 via ge-0/0/0.0, Pop
299776(S=0) *[LDP/9] 06:03:56, metric 1
> to 10.1.23.2 via ge-0/0/0.0, Pop
299792 *[LDP/9] 06:03:31, metric 1
> to 10.1.34.4 via ge-0/0/1.0, Pop
299792(S=0) *[LDP/9] 06:03:31, metric 1
> to 10.1.34.4 via ge-0/0/1.0, Pop
299808 *[LDP/9] 06:03:00, metric 1
> to 10.1.34.4 via ge-0/0/1.0, Swap 299808一番下に299808がありますね。
エントリーを見ると「Swap 299808」より(同じLabel値ですが)299808にSwapし、「to 10.1.34.4」よりこのAddressを持つR4へ転送することがわかります。
R3とR4間のパケットキャプチャーも見てみます。

(パッと見、さっきとほぼ一緒ですが)R3のmpls.0テーブルのとおり、Label 299808にてR4に転送されています。
続いてR4のルーティングテーブルを確認します。
Shimヘッダーが付与されているのでmpls.0テーブルを見ます。
ちなみに、「show route label xxx」コマンドで対象のLabel値のエントリーのみ表示されます。
//R4
lab@R4# run show route label 299808
mpls.0: 11 destinations, 11 routes (11 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
299808 *[LDP/9] 00:00:45, metric 1
> to 10.1.34.3 via ge-0/0/0.0, Pop
299808(S=0) *[LDP/9] 00:00:45, metric 1
> to 10.1.34.3 via ge-0/0/0.0, PopLabel 299808は2種類ありますね。
今回のパケットのBottom of Stackビットは1なので前者のエントリーが選択されます(どっちもPop処理ですが)
Popなので、Shimヘッダーを外してL2ヘッダー && L3ヘッダーな構造のパケットへと戻します。
これはPHP(Penultimate Hop Poping)という動作になります。
(R4は(MPLSネットワークの最後のRouterとなる)Egress LERなR5の1つ手前のRouterなので、Shimヘッダーが外されます。
PHPについては色々なWebページで説明があるので、詳しくはググってください)
R4とR5間のパケットキャプチャーも見てみます。

Shimヘッダーが外されてR5に転送されています。
後はR5にて宛先 IP Addressを見てパケットがR7へルーティングされる…といった具合でR7へ届く動作となります。
R7からR1へのEcho Replyも同様に
・R5はinet.3テーブルを参照してShimヘッダーを挿入してR4へ転送
・R4はmpls.0テーブルを参照してLabelをSwapしてR3へ転送
・R3はmpls.0テーブルを参照して(PHP動作にて)ShimヘッダーをPopしてR2へ転送
・R2はinet.0テーブルを参照して(宛先 IP Addressによって)R1へ転送
といった動作になります。
(Shimヘッダーを挿入する)Ingress LERはinet.3テーブルを参照し、他のMPLS enableなRouterはmpls.0テーブルを参照してパケット転送する…というところがミソでしょうか。
最後にCE Site間でPingが通ることを改めて確認します。
なお、TracerouteをすることによってLabel値がわかります。
//R1
lab@R1> ping 172.16.1.7 source 172.16.1.1 rapid
PING 172.16.1.7 (172.16.1.7): 56 data bytes
!!!!!
lab@R1> traceroute 172.16.1.7 source 172.16.1.1
traceroute to 172.16.1.7 (172.16.1.7) from 172.16.1.1, 30 hops max, 52 byte packets
1 10.1.12.2 (10.1.12.2) 1.244 ms 0.882 ms 0.805 ms
2 10.1.23.3 (10.1.23.3) 1.847 ms 1.592 ms 1.778 ms
MPLS Label=299840 CoS=0 TTL=1 S=1
3 10.1.34.4 (10.1.34.4) 2.082 ms 2.124 ms 1.658 ms
MPLS Label=299776 CoS=0 TTL=1 S=1
4 10.1.45.5 (10.1.45.5) 2.580 ms 2.597 ms 3.026 ms
5 172.16.1.7 (172.16.1.7) 3.607 ms 3.636 ms 4.208 ms他ASからMPLSを使っていることがわかってしまうので、わからないようにする設定もあります。
という訳でLDPを使ったMPLSの検証が無事できました!!!
JunosにおけるLabel Switching動作の確認方法(ルーティングテーブルの追っかけ方)について、できる限り詳しく書いてみたつもりです。
用語の理解や参考資料も併用して読み進めれば、貴方も脱MPLS初心者!!
次回は続きとしてこのトポロジーにて6PEを使った通信を検証したいと思います!!!
ここまで読んでくださりありがとうございました!!!!
3. 参考資料
Juniper Documentation - MPLS Applications User Guide - LDP Overviewwww.juniper.net
Juniper Documentation - LSP Routeswww.juniper.net
NETWORK FUNTIME - JUNOS ROUTERS: WHAT DOES THE INET.3 TABLE ACTUALLY DO?www.networkfuntimes.com
JPNIC 資料 - MPLS~基礎、実現するサービス、そして最新動向~