Blog

IP Infusion 6.0: L3VPN and 6VPE interop with Juniper

IP Infusion 6.0: L3VPN and 6VPE interop with Juniper

by | Sep 4, 2022

A while back we published a blog on ip infusion‘s OcNOS and MikroTik interop with segment routing mpls and LDP. Today we are going to build on the fundamentals learned there to test VPNv4 and VPNv6 interoperability with Juniper.

We’re going to start with the same topology from the previous post but with juniper instead of mikrotik. Of course juniper could run isis end to end to eliminate the redistribution but we’re going to continue to use OSPF and LDP. OSPF and LDP are largely deployed and it is likely you will come across this scenario in your path towards SR-MPLS.

MPLS/IGP Setup

The first thing to accomplish is end to end reachability between the provider edge (PE) routers.

MPLS only requires the /32s of the loopbacks for functionality so redistribution is limited to the /32 loopbacks of the PE routers. If we ran isis end to end we would not have to perform this redistribution.

ipi-2.lab.jan1.us.ipa.net#
ip prefix-list LDP-PE-LOOPBACKS
 seq 10 permit 100.127.2.0/24 eq 32
!
ip prefix-list SR-PE-LOOPBACKS
 seq 10 permit 100.127.0.0/24 eq 32
!
route-map REDIS-OSPF-TO-ISIS permit 10
 match ip address prefix-list LDP-PE-LOOPBACKS
!
route-map REDIS-ISIS-TO-OSPF permit 10
 match ip address prefix-list SR-PE-LOOPBACKS
!
router isis UNDERLAY
 is-type level-1-2
 metric-style wide
 mpls traffic-eng router-id 100.127.0.2
 mpls traffic-eng level-1
 mpls traffic-eng level-2
 capability cspf
 dynamic-hostname
 fast-reroute ti-lfa level-1 proto ipv4
 fast-reroute ti-lfa level-2 proto ipv4
 net 49.0015.1001.2700.0002.00
 redistribute ospf level-1-2 route-map REDIS-OSPF-TO-ISIS
 segment-routing mpls
!
router ospf
 ospf router-id 100.127.0.2
 redistribute isis UNDERLAY route-map REDIS-ISIS-TO-OSPF
 passive-interface lo enable
 network 100.126.0.0/29 area 0.0.0.0
 network 100.126.0.8/29 area 0.0.0.0
 network 100.127.0.2/32 area 0.0.0.0
!
ipi-1.lab.jan1.us.ipa.net#ping 100.127.2.2 source-ip 100.127.0.1
Press CTRL+C to exit
PING 100.127.2.2 (100.127.2.2) from 100.127.0.1 : 56(84) bytes of data.
64 bytes from 100.127.2.2: icmp_seq=1 ttl=63 time=6.30 ms
64 bytes from 100.127.2.2: icmp_seq=2 ttl=63 time=2.09 ms
64 bytes from 100.127.2.2: icmp_seq=3 ttl=63 time=5.83 ms

Now that we have loopback to loopback reachability we will stitch together the LDP and segment routing (SR) domains.

IPI-1 is going to server as a segment routing mapping server. This will assign labels to the routes in the LDP label space and distribute them to through the SR domain so we can have an end to end label switched path enabling the use of MPLS services.

segment-routing
 mpls sr-prefer
 global block 16000 23999
 mapping-server
  srms preference 100
  prefix-sid-map address-family ipv4
   100.127.2.0/32 4000 range 256
  exit-ms-af
 exit-ms

This will start with prefix 100.127.2.0/32 add 4000 to the segment routing global block starting point (16000 as defined) and be able to label the next 256 routes in order. i.e. 100.127.2.1/32 gets the node sid 20001. IPI-2 shows the stitching in action.

Let’s look at the label space.

ipi-2.lab.jan1.us.ipa.net#show mpls ilm-table
Codes: > - installed ILM, * - selected ILM, p - stale ILM
        K - CLI ILM, T - MPLS-TP, s - Stitched ILM
       S - SNMP, L - LDP, R - RSVP, C - CRLDP
       B - BGP , K - CLI , V - LDP_VC, I - IGP_SHORTCUT
       O - OSPF/OSPF6 SR, i - ISIS SR, k - SR CLI
       P - SR Policy, U - unknown

Code    FEC/VRF/L2CKT    ILM-ID      In-Label    Out-Label   In-Intf    Out-Intf
/VRF       Nexthop                   LSP-Type
   i>   100.127.0.1/32     4           16101       3           N/A        xe48
           100.126.0.1               LSP_DEFAULT
   B>   evpn:1             3           17          Nolabel     N/A        N/A
           127.0.0.1                 LSP_DEFAULT
   B>   evpn:2             1           16          Nolabel     N/A        N/A
           127.0.0.1                 LSP_DEFAULT
   B>   evpn:1             2           640         Nolabel     N/A        N/A
           127.0.0.1                 LSP_DEFAULT
   L>   100.127.0.1/32     8           24961       3           N/A        xe48
           100.126.0.1               LSP_DEFAULT
 s i>   100.127.2.2/32     9           20002       3           N/A        xe47.1
           100.126.0.10              LSP_DEFAULT
   i>   100.127.0.2/32     5           16102       Nolabel     N/A        N/A
           127.0.0.1                 LSP_DEFAULT
   i>   100.126.0.1/32     6           25600       3           N/A        xe48
           100.126.0.1               LSP_DEFAULT
   L>   100.127.2.2/32     10          24962       3           N/A        xe47.1
           100.126.0.10              LSP_DEFAULT

The highlighted label above shows the stitching in action as denoted by the s. IMPORTANT mpls lsp-stitching needs to be enabled on any router in the SR and LDP domain.

IPI-1 only sees isis-sr labels and QFX-2 only sees LDP labels as shown below.

ipi-1.lab.jan1.us.ipa.net#show mpls ilm-table
Codes: > - installed ILM, * - selected ILM, p - stale ILM
        K - CLI ILM, T - MPLS-TP, s - Stitched ILM
       S - SNMP, L - LDP, R - RSVP, C - CRLDP
       B - BGP , K - CLI , V - LDP_VC, I - IGP_SHORTCUT
       O - OSPF/OSPF6 SR, i - ISIS SR, k - SR CLI
       P - SR Policy, U - unknown

Code    FEC/VRF/L2CKT    ILM-ID      In-Label    Out-Label   In-Intf    Out-Intf
/VRF       Nexthop                   LSP-Type
   i>   100.127.0.1/32     4           16101       Nolabel     N/A        N/A
           127.0.0.1                 LSP_DEFAULT
   B>   evpn:1             3           17          Nolabel     N/A        N/A
           127.0.0.1                 LSP_DEFAULT
   B>   evpn:100           1           16          Nolabel     N/A        N/A
           127.0.0.1                 LSP_DEFAULT
   B>   evpn:1             2           640         Nolabel     N/A        N/A
           127.0.0.1                 LSP_DEFAULT
   P>   100.127.0.2/32     7           20          3           N/A        xe48
           100.126.0.2               LSP_DEFAULT
   i>   100.127.2.2/32     8           20002       20002       N/A        xe48
           100.126.0.2               LSP_DEFAULT
   i>   100.127.0.2/32     6           16102       3           N/A        xe48
           100.126.0.2               LSP_DEFAULT
   i>   100.126.0.2/32     5           26240       3           N/A        xe48
           100.126.0.2               LSP_DEFAULT
   B>   VOICE              9           24960       Nolabel     N/A        VOICE
           N/A                       LSP_DEFAULT
[email protected]# run show route table inet.3

inet.3: 3 destinations, 3 routes (3 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both

100.126.0.0/29     *[LDP/9] 01:14:11, metric 1
                    >  to 100.126.0.9 via xe-0/0/47.0
100.127.0.1/32     *[LDP/9] 01:14:11, metric 1
                    >  to 100.126.0.9 via xe-0/0/47.0, Push 24961
100.127.0.2/32     *[LDP/9] 01:14:11, metric 1
                    >  to 100.126.0.9 via xe-0/0/47.0

L3VPN

It is common to place a voice services into a layer 3 vpn. So first we’ll setup a VPNv4 session. Then build the vrf and test end to end reachability.

ipi-1.lab.jan1.us.ipa.net

ip vrf VOICE
 rd 100.127.0.1:12
 route-target both 65000:12
!
interface xe46
 speed 10g
 ip vrf forwarding VOICE
 ip address 172.16.0.1/24
 ipv6 address 2001:db8::1/64
!
router bgp 65000
 neighbor 100.127.2.2 remote-as 65000
 neighbor 100.127.2.2 update-source lo
 !
 address-family vpnv4 unicast
 neighbor 100.127.2.2 activate
 exit-address-family
!
 address-family ipv4 vrf VOICE
 redistribute connected
 exit-address-family
 !
[email protected]# show routing-instances
VOICE {
    instance-type vrf;
    interface xe-0/0/47.10;
    interface xe-0/0/47.100;
    route-distinguisher 100.127.2.2:1;
    vrf-target target:65000:12;
    vrf-table-label;
}
[email protected]# show interfaces xe-0/0/47
vlan-tagging;
unit 0 {
    vlan-id 1;
    family inet {
        address 100.126.0.10/29;
    }
    family iso;
    family mpls;
}
unit 10 {
    vlan-id 10;
    family inet {
        address 172.16.2.1/24;
    }
    family inet6 {
        address 2001:db8:0:1::1/64;
    }
}
[email protected]# show protocols bgp
group VPN {
    family inet-vpn {
        unicast;
    }
    family inet6-vpn {
        unicast;
    }
    export PS-DIRECT;
    peer-as 65000;
    neighbor 100.127.0.1;
}
local-address 100.127.2.2;
local-as 65000;

We are building the vrf VOICE with route-target import and export 65000:12 for membership.

ipi-1.lab.jan1.us.ipa.net#show ip bgp vpnv4 all summary
BGP router identifier 100.127.0.1, local AS number 65000
BGP table version is 2
1 BGP AS-PATH entries
0 BGP community entries

Neighbor                 V   AS   MsgRcv    MsgSen TblVer   InQ   OutQ    Up/Down   State/PfxRcd
100.127.2.2              4 65000  368        354       2      0      0  02:09:07               2


Total number of neighbors 1

Total number of Established sessions 1
[email protected]# run show bgp summary
Threading mode: BGP I/O
Groups: 1 Peers: 1 Down peers: 0
Table          Tot Paths  Act Paths Suppressed    History Damp State    Pending
bgp.l3vpn.0
                       1          1          0          0          0          0
bgp.l3vpn-inet6.0
                       1          1          0          0          0          0
Peer                     AS      InPkt     OutPkt    OutQ   Flaps Last Up/Dwn State|#Active/Received/Accepted/Damped...
100.127.0.1           65000        319        313       0       7     2:14:50 Establ
  bgp.l3vpn.0: 1/1/1/0
  bgp.l3vpn-inet6.0: 1/1/1/0
  VOICE.inet.0: 1/1/1/0
  VOICE.inet6.0: 1/1/1/0
ipi-1.lab.jan1.us.ipa.net#show ip bgp vrf VOICE
BGP table version is 1, local router ID is 172.16.0.1
Status codes: s suppressed, d damped, h history, a add-path, * valid, > best, i - internal,
              l - labeled, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete

    Network          Next Hop            Metric    LocPrf   Weight Path
*> l 172.16.0.0/24    0.0.0.0              0        100       32768  ?
*>i  172.16.2.0/24    100.127.2.2          0        100       0    i
*>i  192.168.0.0      100.127.2.2          0        100       0    i

Total number of prefixes 3
[email protected]# run show route table VOICE.inet.0

VOICE.inet.0: 5 destinations, 5 routes (5 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both

172.16.0.0/24      *[BGP/170] 01:35:07, localpref 100, from 100.127.0.1
                      AS path: ?, validation-state: unverified
                    >  to 100.126.0.9 via xe-0/0/47.0, Push 24960, Push 24961(top)
172.16.2.0/24      *[Direct/0] 02:08:32
                    >  via xe-0/0/47.10
172.16.2.1/32      *[Local/0] 02:08:32
                       Local via xe-0/0/47.10
192.168.0.0/24     *[Direct/0] 1w0d 00:03:04
                    >  via xe-0/0/47.100
192.168.0.2/32     *[Local/0] 1w0d 00:03:04
                       Local via xe-0/0/47.100

We can see that we are receiving three prefixes from QFX-2 and reachability is confirmed below.

ipi-1.lab.jan1.us.ipa.net#ping 172.16.2.1 vrf VOICE
Press CTRL+C to exit
PING 172.16.2.1 (172.16.2.1) 56(84) bytes of data.
64 bytes from 172.16.2.1: icmp_seq=1 ttl=64 time=3.02 ms
64 bytes from 172.16.2.1: icmp_seq=2 ttl=64 time=6.87 ms

6VPE

6VPE is a great way to take advantage of your already deployed and operational MPLS core. Here we’re going to use the sr-mpls/LDP setup to build an IPv6 service on top, again for vrf VOICE.

Most of the configuration elements are the same except for utilizing VPNv6 and IPv6 addressing. Let’s look specifically at those portions.

ipi-1.lab.jan1.us.ipa.net#show run bgp
!
router bgp 65000
 neighbor 100.127.2.2 remote-as 65000
 neighbor 100.127.2.2 update-source lo
 !
 address-family vpnv6 unicast
 neighbor 100.127.2.2 activate
 exit-address-family
 !
 address-family ipv6 vrf VOICE
 redistribute connected
 exit-address-family
!
[email protected]# show protocols bgp
group VPN {
    family inet-vpn {
        unicast;
    }
    family inet6-vpn {
        unicast;
    }
    export PS-DIRECT;
    peer-as 65000;
    neighbor 100.127.0.1;
}
local-address 100.127.2.2;
local-as 65000;
[email protected]# show protocols mpls
ipv6-tunneling;

I will draw attention to the ipv6-tunneling command on QFX-2 above. This is required to tunnel the IPv6 packets over the MPLS core. Without this you will end up with an unusable next hop.

ipi-1.lab.jan1.us.ipa.net#show ip bgp vpnv6 all summary
BGP router identifier 100.127.0.1, local AS number 65000
BGP table version is 2
1 BGP AS-PATH entries
0 BGP community entries

Neighbor                 V   AS   MsgRcv    MsgSen TblVer   InQ   OutQ    Up/Down   State/PfxRcd
100.127.2.2              4 65000  393        380       2      0      0  02:20:07               1

Total number of neighbors 1

Total number of Established sessions 1
[email protected]# run show bgp summary
Threading mode: BGP I/O
Groups: 1 Peers: 1 Down peers: 0
Table          Tot Paths  Act Paths Suppressed    History Damp State    Pending
bgp.l3vpn.0
                       1          1          0          0          0          0
bgp.l3vpn-inet6.0
                       1          1          0          0          0          0
Peer                     AS      InPkt     OutPkt    OutQ   Flaps Last Up/Dwn State|#Active/Received/Accepted/Damped...
100.127.0.1           65000        319        313       0       7     2:14:50 Establ
  bgp.l3vpn.0: 1/1/1/0
  bgp.l3vpn-inet6.0: 1/1/1/0
  VOICE.inet.0: 1/1/1/0
  VOICE.inet6.0: 1/1/1/0
ipi-1.lab.jan1.us.ipa.net#show ip bgp vpnv6 vrf VOICE
Status codes: s suppressed, d damped, h history, a add-path, * valid, > best, i - internal, l - lab
eled
              S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete

     Network          Next Hop                    Metric    LocPrf      Weight       Path
Route Distinguisher: 100.127.0.1:12 (Default for VRF VOICE)
*> l 2001:db8::/64    ::                            0        100       32768  ?
*>i  2001:db8:0:1::/64
                      ::ffff:100.127.2.2            0        100       0    i
 Announced routes count = 1
 Accepted routes count = 1
[email protected]# run show route table VOICE.inet6.0

VOICE.inet6.0: 5 destinations, 5 routes (5 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both

2001:db8::/64      *[BGP/170] 01:43:15, localpref 100, from 100.127.0.1
                      AS path: ?, validation-state: unverified
                    >  to 100.126.0.9 via xe-0/0/47.0, Push 24960, Push 24961(top)
2001:db8:0:1::/64  *[Direct/0] 01:49:56
                    >  via xe-0/0/47.10
2001:db8:0:1::1/128*[Local/0] 01:49:56
                       Local via xe-0/0/47.10
fe80::86c1:c100:a32:5032/128
                   *[Local/0] 01:49:56
                       Local via xe-0/0/47.10
ff02::2/128        *[INET6/0] 1w2d 20:22:10
                       MultiRecv

{master:0}[edit]

Now that we have all over our routes and signaling setup lets verify reachability.

ipi-1.lab.jan1.us.ipa.net#ping ipv6 2001:db8:0:1::1 vrf VOICE
Press CTRL+C to exit
PING 2001:db8:0:1::1(2001:db8:0:1::1) 56 data bytes
64 bytes from 2001:db8:0:1::1: icmp_seq=1 ttl=64 time=2.80 ms
64 bytes from 2001:db8:0:1::1: icmp_seq=2 ttl=64 time=3.84 ms

Conclusion

With the new features and support in IP Infusion GA 6.0 stability and interop between vendors is becoming better. This paves the way for deployments of segment-routing while migrating the LDP segments all while maintaining current VPNs.

The 6VPE support allows for rapid adoption of IPv6 utilizing the core already in place.

We’ll be working on more interop testing to include L2VPN with both LDP signaled VPLS and BGP signaled VPLS. Be sure to come back for more.