When I decided to start studying for CCIE SP, I was a lilttle bit nervous because I thought MPLS would be very difficult and complex. I am not saying that it is easy but if you understand the basic concept, you problably can solve more complex scenarios.
In simple words, MPLS was designed to avoid running BGP everywhere in a network. These days, the internet is composed by over 250k routes, so it would not be very scalable to run BGP in everywhere in your AS. Basically, MPLS will provide transport end-to-end for BGP routes.
In R&S world there are 3 ways you can do this:
1 – Run BGP everywhere
2 – Redistribute BGP into IGP
3 – Run a GRE tunnel from PE to PE
Obviously, none of these solutions are very scaleable for any big network, so the option here would be
4 – Run a MPLS free BGP core
First of all, we are going to enable OSPF in the links and advertise the loopbacks into OSPF and then enable BGP on R1 and R3 and advertise the LAN’s into BGP. Assume that all loopbacks are in the format 1.1.1.1, 2.2.2.2, etc. At this point, forget MPLS. We just want to build our network and test ip reachability. Just as a side note, if you are using OSPF in the network, you must always use a single area.
The network:

After we have enabled OSPF we should have reachability from R3 loopback to R1 loopback, let’s test it
R3#ping 1.1.1.1 source lo0
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 1.1.1.1, timeout is 2 seconds:
Packet sent with a source address of 3.3.3.3
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/2/4 ms
Now, we can safely enable BGP on R1 and R3 and advertise the LAN’s
R1
router bgp 10
no synchronization
bgp log-neighbor-changes
network 10.10.1.0 mask 255.255.255.0
neighbor 3.3.3.3 remote-as 10
neighbor 3.3.3.3 update-source Loopback0
no auto-summary
R1#sh ip bgp
BGP table version is 3, local router ID is 10.10.1.1
Status codes: s suppressed, d damped, h history, * valid, > best, i – internal,
r RIB-failure, S Stale
Origin codes: i – IGP, e – EGP, ? – incomplete
Network Next Hop Metric LocPrf Weight Path
*> 10.10.1.0/24 0.0.0.0 0 32768 i
*>i10.10.3.0/24 3.3.3.3 0 100 0 i
R3
router bgp 10
no synchronization
bgp log-neighbor-changes
network 10.10.3.0 mask 255.255.255.0
neighbor 1.1.1.1 remote-as 10
neighbor 1.1.1.1 update-source Loopback0
no auto-summary
R3#sh ip bgp
BGP table version is 3, local router ID is 10.10.3.3
Status codes: s suppressed, d damped, h history, * valid, > best, i – internal,
r RIB-failure, S Stale
Origin codes: i – IGP, e – EGP, ? – incomplete
Network Next Hop Metric LocPrf Weight Path
*>i10.10.1.0/24 1.1.1.1 0 100 0 i
*> 10.10.3.0/24 0.0.0.0 0 32768 i
Now the problem that we run into here, is that for example R3 will not have ip reachability to R1’s LAN 10.10.1.0/24 (Remember that we need to source traffic from R3’s LAN, otherwise R1 will not have a route back)
Rack1R3#ping 10.10.1.1 source lo1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.10.1.1, timeout is 2 seconds:
Packet sent with a source address of 10.10.3.3
…..
Success rate is 0 percent (0/5)
The reason we cannot ping is that, R2 will not have a route installed for R1 and R3’s LAN, let’s check
R2#sh ip route ospf
1.0.0.0/32 is subnetted, 1 subnets
O 1.1.1.1 [110/2] via 172.16.12.1, 00:13:51, FastEthernet0/0
3.0.0.0/32 is subnetted, 1 subnets
O 3.3.3.3 [110/2] via 172.16.23.3, 00:13:51, FastEthernet0/1
R2 only provides transport for R1 and R3 to be able to peer via BGP
In part 2, we will see how can we solve this problem implementing the option “4-Run a MPLS free BGP core”, being R2 the core of the network. We will also take a closer look of the MPLS labeling process.