JUNOSで(CE間はBGPによる)L3VPNを設定する機会があり、イイ感じにネットや書籍に整理されていないのでまとめてみました。
せっかくなのでOverlayのconfigurationからやっていきます。
トポロジーは以下の通りです。
R1だけはCiscoルーターとなっています。
(色々流用してるので「R1 - R2 - R4 - R3」という並びだったりポート番号も飛び飛びで構築しています…)
■ルーティング構成

まず前提として(UnderlayなIGPであるOSPFでR2とR4のLoopback間のIP疎通性を確保しておき)
疑似Service Provider網のPE(R2とR4)のLoopback間でMPLS Label Switchingできるようにしておきます。
今回はRSVP-TEを使ってLabel Switchingをしています。
気を付けるべきはOSPFでtraffic-engineeringのconfigurationをしないといけないところでしょうか。
//R2
set interfaces ge-0/0/2 unit 0 family mpls
set protocols mpls interface ge-0/0/2.0
set protocols mpls label-switched-path R2_to_R4 to 4.4.4.4
set protocols rsvp interface ge-0/0/2.0
set protocols ospf traffic-engineering
//R4
set interfaces ge-0/0/0 unit 0 family mpls
set protocols mpls interface ge-0/0/0.0
set protocols mpls label-switched-path R4_to_R2 to 2.2.2.2
set protocols rsvp interface ge-0/0/0.0
set protocols ospf traffic-engineering
//確認
lab@R2# run show route table inet.3
//snip
4.4.4.4/32 *[RSVP/7/1] 01:59:55, metric 1
> to 24.24.24.4 via ge-0/0/2.0, label-switched-path R2_to_R4
lab@R4# run show route table inet.3
//snip
2.2.2.2/32 *[RSVP/7/1] 01:58:33, metric 1
> to 24.24.24.2 via ge-0/0/0.0, label-switched-path R4_to_R2
続いてCEのBGP周りをconfigurationします。
それぞれ自身のLoopbackを広報する様にしています。
//R1 ip prefix-list LOOP1 seq 11 permit 1.1.1.1/32 ! route-map ONLY_LOOP1 permit 10 match ip address prefix-list LOOP1 ! route-map ONLY_LOOP1 deny 65000 ! router bgp 64699 neighbor 12.12.12.2 remote-as 24 address-family ipv4 network 1.1.1.1 mask 255.255.255.255 neighbor 12.12.12.2 activate neighbor 12.12.12.2 soft-reconfiguration inbound neighbor 12.12.12.2 route-map ONLY_LOOP1 out exit-address-family ! //R3 set policy-options policy-statement EXPORT_BGP term 0011 from protocol direct set policy-options policy-statement EXPORT_BGP term 0011 from route-filter 3.3.3.3/32 exact set policy-options policy-statement EXPORT_BGP term 0011 then accept set policy-options policy-statement EXPORT_BGP term 9991 then reject set routing-options autonomous-system 64699 set protocols bgp group EBGP type external set protocols bgp group EBGP neighbor 34.34.34.4 export EXPORT_BGP set protocols bgp group EBGP neighbor 34.34.34.4 peer-as 24
続いてPE側のconfigurationをしていきます。
内容としては大きく3つあります。
・PE間のMP-BGP設定
・routing-instance設定
・CE向けBGP設定
//R2
set routing-options autonomous-system 24
set protocols bgp group IBGP type internal
set protocols bgp group IBGP local-address 2.2.2.2
set protocols bgp group IBGP family inet-vpn unicast
set protocols bgp group IBGP neighbor 4.4.4.4
set routing-instances VPN_A instance-type vrf
set routing-instances VPN_A interface ge-0/0/0.0
set routing-instances VPN_A route-distinguisher 24:2
set routing-instances VPN_A vrf-target target:24:24
set routing-instances VPN_A protocols bgp group EBGP type external
set routing-instances VPN_A protocols bgp group EBGP neighbor 12.12.12.1 peer-as 64699
//R4
set routing-options autonomous-system 24
set protocols bgp group IBGP type internal
set protocols bgp group IBGP local-address 4.4.4.4
set protocols bgp group IBGP family inet-vpn unicast
set protocols bgp group IBGP neighbor 2.2.2.2
set routing-instances VPN_A instance-type vrf
set routing-instances VPN_A interface ge-0/0/1.0
set routing-instances VPN_A route-distinguisher 24:4
set routing-instances VPN_A vrf-target target:24:24
set routing-instances VPN_A protocols bgp group EBGP type external
set routing-instances VPN_A protocols bgp group EBGP neighbor 34.34.34.3 peer-as 64699
//確認
lab@R2# run show bgp summary
//snip
bgp.l3vpn.0
2 2 0 0 0 0
Peer AS InPkt OutPkt OutQ Flaps Last Up/Dwn State|#Active/Received/Accepted/Damped...
4.4.4.4 24 101 101 0 0 43:51 Establ
bgp.l3vpn.0: 2/2/2/0
VPN_A.inet.0: 2/2/2/0
12.12.12.1 64699 102 101 0 0 44:56 Establ
VPN_A.inet.0: 1/1/1/0
lab@R4# run show bgp summary
//snip
bgp.l3vpn.0
2 2 0 0 0 0
Peer AS InPkt OutPkt OutQ Flaps Last Up/Dwn State|#Active/Received/Accepted/Damped...
2.2.2.2 24 104 101 0 0 45:02 Establ
bgp.l3vpn.0: 2/2/2/0
VPN_A.inet.0: 2/2/2/0
34.34.34.3 64699 104 101 0 0 45:08 Establ
VPN_A.inet.0: 1/1/1/0
他にCEがいる時、VRF Instance(VPN_A)にてvrf-import / vrf-exportでfilterする必要がありますが、今回は割愛します。
興味ある方は調べてみてください。
各ルーター間でEstablished状態だからR1-R3のLoopback間で通信できる!…と思いきやこれでは通信できません。
R1とR3は同じAS番号なのでR2からR1、R4からR3に広報した際、経路Loopとみなされ受信した経路を破棄します。
(JUNOSの場合は、そもそも対向Peerに対して重複しているAS番号があった場合、経路情報を広報しません)
解決策は3つあります。1つずつ検証していきたいと思います。
■解決策①
1つ目はPEでプライベートAS番号を上書きして経路情報を広報する方法です。
個人的にはこれが一番わかりやすいと思ったり。
//R2
set routing-instances VPN_A protocols bgp group EBGP neighbor 12.12.12.1 as-override
//R4
set routing-instances VPN_A protocols bgp group EBGP neighbor 34.34.34.3 as-override
//R3で確認
lab@R3# run show route 1.1.1.1
//snip
1.1.1.1/32 *[BGP/170] 00:01:31, localpref 100
AS path: 24 24 I, validation-state: unverified
> to 34.34.34.4 via ge-1/0/1.0
//AS Pathで64699が24に上書きされている
■解決策②
2つ目は重複しているAS番号があってもPEで経路を広報&CEで受信する方法です。
IOSはallowas-in、JUNOSはloopsオプションでAS番号が重複しても設定値によって受信を許容します。
ネット上ではこれが一番よく紹介されてます(当社調べ)
//R1
router bgp 64699
address-family ipv4
neighbor 12.12.12.2 allowas-in 5
exit-address-family
//R2
set routing-instances VPN_A protocols bgp group EBGP neighbor 12.12.12.1 advertise-peer-as
//R4
set routing-instances VPN_A protocols bgp group EBGP neighbor 34.34.34.3 advertise-peer-as
//R3
set routing-options autonomous-system loops 2
//R3で確認
lab@R3#run clear bgp neighbor 34.34.34.4
//session clearが必要
lab@R3# run show route 1.1.1.1
//snip
1.1.1.1/32 *[BGP/170] 00:00:14, localpref 100
AS path: 24 64699 I, validation-state: unverified
> to 34.34.34.4 via ge-1/0/1.0
//AS Pathで自身の64699があるがルーティングテーブルに登録されている。
■解決策③
3つ目はプライベートAS番号を消去する方法です。
PE間で経路情報を広報する際に消去します。
//R2
set protocols bgp group IBGP neighbor 4.4.4.4 remove-private
//R4
set protocols bgp group IBGP neighbor 2.2.2.2 remove-private
//R3で確認
lab@R3# run show route 1.1.1.1
//snip
1.1.1.1/32 *[BGP/170] 01:17:47, localpref 100
AS path: 24 I, validation-state: unverified
> to 34.34.34.4 via ge-1/0/1.0
//AS Pathで64699の情報が無くなっている。
この3つの(いずれかの)解決策でCE間で通信ができるようになりました!
lab@R3# run ping 1.1.1.1 source 3.3.3.3 PING 1.1.1.1 (1.1.1.1): 56 data bytes 64 bytes from 1.1.1.1: icmp_seq=0 ttl=253 time=3.063 ms 64 bytes from 1.1.1.1: icmp_seq=1 ttl=253 time=3.189 ms 64 bytes from 1.1.1.1: icmp_seq=2 ttl=253 time=3.307 ms 64 bytes from 1.1.1.1: icmp_seq=3 ttl=253 time=3.267 ms
それぞれの解決策でAS Pathの付き方が変わるので、ケースバイケースでどの解決策を使うか検討する必要がありそうです。
長くなりましたが、今回は以上です!!
