Overview
Virtual Routing and Forwarding (VRF) is one of the most powerful โ and most misused โ tools in the network engineer's toolkit. At its core, a VRF creates an isolated routing table on a single physical device, allowing multiple tenants, security zones, or services to coexist without traffic leakage. Done right, VRF enables clean multi-tenant architectures, granular policy enforcement, and scalable MPLS VPN services. Done wrong, it creates routing black holes, accidental route leaks, and support nightmares.
This guide covers VRF design principles, VRF-Lite deployment, controlled route leaking, MPLS VPN integration, and a systematic troubleshooting approach.
Part 1 โ VRF Fundamentals and Design Principles
1.1 โ What a VRF Actually Does
A VRF instance gives a router a separate Routing Information Base (RIB), Cisco Express Forwarding (CEF) table, and set of interfaces. Traffic entering a VRF-bound interface is looked up only in that VRF's routing table โ it cannot reach the global table or another VRF unless you explicitly configure it to do so.
Key distinction: VRF-Lite runs VRFs on a single device without MPLS. MPLS VPN (RFC 4364) uses VRFs at the PE layer with BGP VPNv4 to carry routes across a provider core.
1.2 โ When to Use VRF
Use VRF when you need hard routing-plane separation between traffic classes. Common use cases:
- Multi-tenant hosting โ isolate customer routing tables on shared PE hardware
- Security zone separation โ separate management, production, and guest traffic without additional hardware
- Overlapping IP address spaces โ two customers both using 192.168.1.0/24 coexist without conflict
- Out-of-band management โ dedicate a VRF to network management traffic so it never traverses the production forwarding path
- Internet edge + internal zones โ keep internet-facing and internal routing tables completely separate
Do not use VRF as a substitute for proper firewall policy. VRF provides routing separation, not stateful security.
1.3 โ VRF Naming Convention
Consistent naming prevents confusion in multi-VRF environments:
# Format: FUNCTION-IDENTIFIER or CUSTOMER-SHORTNAME
# Good examples:
vrf definition CUST-ACME
vrf definition CUST-GLOBEX
vrf definition MGMT
vrf definition INTERNET
vrf definition PROD
vrf definition DMZ
# Avoid: VRF1, VRF2, TEST, TEMP โ impossible to audit later
Part 2 โ VRF-Lite Configuration
VRF-Lite is the simplest form of VRF โ no MPLS required. Each VRF gets its own set of interfaces and runs its own routing protocol instances.
Step 1 โ Define the VRF
# IOS-XE syntax (vrf definition โ preferred over legacy ip vrf)
R1(config)# vrf definition CUST-ACME
R1(config-vrf)# rd 65001:100
R1(config-vrf)# address-family ipv4
R1(config-vrf-af)# exit-address-family
R1(config)# vrf definition CUST-GLOBEX
R1(config-vrf)# rd 65001:200
R1(config-vrf)# address-family ipv4
R1(config-vrf-af)# exit-address-family
# Legacy syntax (IOS 12.x) โ still valid but avoid for new deployments
# ip vrf CUST-ACME
# rd 65001:100
Step 2 โ Assign Interfaces to VRFs
# Assign physical or subinterface to a VRF BEFORE setting the IP
# Adding vrf forwarding to an interface CLEARS the IP address automatically
R1(config)# interface GigabitEthernet0/1
R1(config-if)# vrf forwarding CUST-ACME
R1(config-if)# ip address 10.1.0.2 255.255.255.252
R1(config-if)# no shutdown
R1(config)# interface GigabitEthernet0/2
R1(config-if)# vrf forwarding CUST-GLOBEX
R1(config-if)# ip address 10.2.0.2 255.255.255.252
R1(config-if)# no shutdown
# Subinterfaces โ one physical link, multiple VRFs (dot1q trunking)
R1(config)# interface GigabitEthernet0/0.100
R1(config-subif)# encapsulation dot1Q 100
R1(config-subif)# vrf forwarding CUST-ACME
R1(config-subif)# ip address 10.1.0.2 255.255.255.252
R1(config)# interface GigabitEthernet0/0.200
R1(config-subif)# encapsulation dot1Q 200
R1(config-subif)# vrf forwarding CUST-GLOBEX
R1(config-subif)# ip address 10.2.0.2 255.255.255.252
Step 3 โ VRF-Aware Routing
Each VRF runs its own routing protocol instance. Use address-family ipv4 vrf under BGP, or separate OSPF/EIGRP process IDs per VRF.
# BGP โ VRF address families (most common for PE-CE)
R1(config)# router bgp 65001
R1(config-router)# address-family ipv4 vrf CUST-ACME
R1(config-router-af)# neighbor 10.1.0.1 remote-as 65100
R1(config-router-af)# neighbor 10.1.0.1 activate
R1(config-router-af)# exit-address-family
R1(config-router)# address-family ipv4 vrf CUST-GLOBEX
R1(config-router-af)# neighbor 10.2.0.1 remote-as 65200
R1(config-router-af)# neighbor 10.2.0.1 activate
R1(config-router-af)# exit-address-family
# OSPF โ separate process per VRF
R1(config)# router ospf 100 vrf CUST-ACME
R1(config-router)# network 10.1.0.0 0.0.0.3 area 0
# Static routes in a VRF
R1(config)# ip route vrf CUST-ACME 0.0.0.0 0.0.0.0 10.1.0.1
R1(config)# ip route vrf CUST-GLOBEX 192.168.99.0 255.255.255.0 10.2.0.1
Part 3 โ Route Leaking Between VRFs
Route leaking allows selective sharing of routes between VRFs โ for example, giving all customers access to a shared DNS server in the MGMT VRF without merging their routing tables.
โ ๏ธ Route leaking creates explicit cross-VRF reachability. Always document and audit every leak โ uncontrolled leaking defeats the purpose of VRF segmentation.
Method 1 โ Import/Export Route Targets (MPLS/BGP environments)
# Define route targets โ RT:export tags routes leaving a VRF, RT:import accepts them
R1(config)# vrf definition CUST-ACME
R1(config-vrf)# rd 65001:100
R1(config-vrf)# address-family ipv4
R1(config-vrf-af)# route-target export 65001:100
R1(config-vrf-af)# route-target import 65001:100
R1(config-vrf-af)# route-target import 65001:999 ! import shared services from MGMT VRF
R1(config)# vrf definition MGMT
R1(config-vrf)# rd 65001:999
R1(config-vrf)# address-family ipv4
R1(config-vrf-af)# route-target export 65001:999
R1(config-vrf-af)# route-target import 65001:999
Method 2 โ Static Route Leak (VRF-Lite without MPLS)
# Leak a specific route from MGMT into CUST-ACME using global next-hop
# The "global" keyword means next-hop is resolved in the global routing table
R1(config)# ip route vrf CUST-ACME 10.99.0.0 255.255.255.0 GigabitEthernet0/3 10.99.0.1 global
# Or leak from one VRF into another directly
R1(config)# ip route vrf CUST-ACME 10.99.0.10 255.255.255.255 vrf MGMT 10.99.0.1
Method 3 โ BGP-Based Route Leaking (IOS-XE 16.x+)
# Use BGP import/export between local VRFs โ most scalable for large deployments
R1(config)# router bgp 65001
R1(config-router)# address-family ipv4 vrf CUST-ACME
R1(config-router-af)# import path from vrf MGMT
R1(config-router-af)# import path limit 10
Part 4 โ VRF Best Practices
4.1 โ Always Use Route Distinguishers
Even in VRF-Lite (no MPLS), always configure an RD. It enables easier migration to MPLS later and avoids issues with tools that expect RDs.
# RD format: ASN:nn or IP:nn
# Convention: ASN:customer-id or router-loopback-ip:vrf-id
R1(config)# vrf definition CUST-ACME
R1(config-vrf)# rd 65001:100
4.2 โ Dedicate a Management VRF
Always run out-of-band management (SSH, SNMP, NTP, syslog) in a dedicated MGMT VRF. This ensures management access survives a production routing failure and prevents management traffic from traversing customer paths.
R1(config)# vrf definition MGMT
R1(config-vrf)# rd 65001:999
R1(config-vrf)# address-family ipv4
# Bind management interface to MGMT VRF
R1(config)# interface GigabitEthernet0/0
R1(config-if)# vrf forwarding MGMT
R1(config-if)# ip address 10.99.0.2 255.255.255.0
# Bind SSH and HTTP to MGMT VRF
R1(config)# ip ssh source-interface GigabitEthernet0/0
R1(config)# ip http source-interface GigabitEthernet0/0
4.3 โ Use VRF-Aware Services
Every service that needs to reach across VRFs must be explicitly made VRF-aware. Forgetting this is the most common VRF misconfiguration.
# DNS
R1(config)# ip name-server vrf MGMT 10.99.0.53
# NTP
R1(config)# ntp server vrf MGMT 10.99.0.123
# Syslog
R1(config)# logging source-interface GigabitEthernet0/0
R1(config)# logging host 10.99.0.200 vrf MGMT
# SNMP
R1(config)# snmp-server trap-source GigabitEthernet0/0
# Ping and traceroute in a specific VRF
R1# ping vrf CUST-ACME 192.168.1.1
R1# traceroute vrf CUST-ACME 192.168.1.1
4.4 โ Control Plane Separation
Ensure routing protocols are not accidentally leaking between VRFs through redistribution.
# Never redistribute between VRF routing instances without a route-map filter
# Bad โ leaks all routes between VRFs:
# redistribute ospf 100
# Good โ only redistribute specific prefixes:
R1(config)# route-map LEAK-TO-ACME permit 10
R1(config-route-map)# match ip address prefix-list SHARED-SERVICES
R1(config)# router bgp 65001
R1(config-router)# address-family ipv4 vrf CUST-ACME
R1(config-router-af)# redistribute connected route-map LEAK-TO-ACME
Part 5 โ Troubleshooting VRF Issues
Step 1 โ Verify VRF Existence and Interface Assignments
# List all VRFs and their interfaces
R1# show vrf
R1# show vrf detail CUST-ACME
# Check interface VRF assignment
R1# show interfaces GigabitEthernet0/1 | include VRF
# View VRF routing table
R1# show ip route vrf CUST-ACME
R1# show ip route vrf CUST-ACME 192.168.1.0
Step 2 โ Check CEF Forwarding Table
# CEF must have the route for actual forwarding to work
R1# show ip cef vrf CUST-ACME
R1# show ip cef vrf CUST-ACME 192.168.1.0 detail
# If CEF shows "no route" but routing table has the prefix โ CEF inconsistency
R1# clear ip cef vrf CUST-ACME
Step 3 โ Verify BGP VRF Neighbors
# Check BGP neighbors per VRF
R1# show bgp vpnv4 unicast vrf CUST-ACME summary
R1# show bgp vpnv4 unicast vrf CUST-ACME neighbors 10.1.0.1
# View prefixes advertised/received per VRF
R1# show bgp vpnv4 unicast vrf CUST-ACME
R1# show bgp vpnv4 unicast all
Step 4 โ Test Connectivity Within a VRF
# Always specify vrf for ping/traceroute in a VRF context
R1# ping vrf CUST-ACME 10.1.0.1
R1# ping vrf CUST-ACME 192.168.1.1 source 10.1.0.2
R1# traceroute vrf CUST-ACME 192.168.1.1 source 10.1.0.2
# Confirm ARP entries are VRF-scoped
R1# show arp vrf CUST-ACME
Step 5 โ Diagnose Route Leak Problems
# Check route targets are correctly configured
R1# show vrf detail CUST-ACME | include import|export
# Verify leaked routes appear in destination VRF
R1# show ip route vrf CUST-ACME 10.99.0.0
# Check BGP RIB for VPNv4 routes with correct RTs
R1# show bgp vpnv4 unicast all 10.99.0.0/24
Quick Reference โ Common VRF Issues
VRF Hardening Checklist
Before deploying a VRF in production, verify each of the following:
- Every VRF has a route distinguisher (
rd) configured - All management services (SSH, SNMP, NTP, syslog) are bound to the MGMT VRF
- Route leaks are documented, minimal, and filtered with prefix-lists or route-maps
- No unintended redistribution exists between VRF routing protocol instances
ip route vrfstatic routes use the correct VRF keyword and next-hop- CEF is enabled globally (
ip cef) โ VRF forwarding requires CEF - All interfaces verify their VRF assignment with
show interfaces | include VRF - VRF-aware ACLs are applied where inter-VRF traffic is permitted via route leaks