Tuesday, 27 September 2011

Interdomain Multicast using MSDP

This post is talking about using MSDP to join multicast domains together.

The topology here is very simple even if it does consist of 6 routers.

R1-R2-R3---------R4-R5-R6


Multicast Domain 1
R1, R2 and R3 use EIGRP as their IGP

AutoRP is used for RP election and R3 will be the RP

Multicast Domain 2
R4, R5 and R6 use OSPF as their IGP
AutoRP is used for RP election and R4 will be the RP


Both Multicast Domains are connected using BGP (R3 AS 3) and (R4 AS 4)
All routers have their loopback0 interfaces and interconnecting interfaces running PIM sparse-mode so we are using "ip pim autorp listener"

Note: AutoRP advertisements are blocked between R3 and R4 on their corresponding interfaces "ip multicast boundary 1" is applied where the 1 refers to an access list which blocks AutoRP rp candidate and mapping agent advertisements but allows all other multicast traffic

The base configurations are shown below

R1
hostname R1
!
no ip domain lookup
ip multicast-routing
!
interface Loopback0
 ip address 1.1.1.1 255.255.255.255
 ip pim sparse-mode
!
interface Serial0/0
 description FR Switch
 no ip address
 encapsulation frame-relay
!
interface Serial0/0.12 point-to-point
 description PVC to R2
 ip address 10.1.12.1 255.255.255.0
 ip pim sparse-mode
 frame-relay interface-dlci 102
!
router eigrp 123
 network 1.1.1.1 0.0.0.0
 network 10.1.12.1 0.0.0.0
 no auto-summary
!
ip pim autorp listener

R2
hostname R2
!
no ip domain lookup
ip multicast-routing
!
interface Loopback0
 ip address 2.2.2.2 255.255.255.255
 ip pim sparse-mode
!
interface Loopback23
 ip address 23.23.23.2 255.255.255.255
!
interface Serial0/0
 description FR Switch
 no ip address
 encapsulation frame-relay
!
interface Serial0/0.21 point-to-point
 description PVC to R1
 ip address 10.1.12.2 255.255.255.0
 ip pim sparse-mode
 frame-relay interface-dlci 201
!
interface Serial0/0.23 point-to-point
 description PVC to R3
 ip address 10.1.23.2 255.255.255.0
 ip pim sparse-mode
 frame-relay interface-dlci 203
!
router eigrp 123
 network 2.2.2.2 0.0.0.0
 network 10.1.12.2 0.0.0.0
 network 10.1.23.2 0.0.0.0
 no auto-summary
!
ip pim autorp listener

R3
hostname R3
!
no ip domain lookup
ip multicast-routing
!
interface Loopback0
 ip address 3.3.3.3 255.255.255.255
 ip pim sparse-mode
!
interface Loopback34
 ip address 34.34.34.3 255.255.255.255
!
interface Serial0/0
 description FR Switch
 no ip address
 encapsulation frame-relay
!
interface Serial0/0.32 point-to-point
 description PVC to R2
 ip address 10.1.23.3 255.255.255.0
 ip pim sparse-mode
 frame-relay interface-dlci 302
!
interface Serial0/0.34 point-to-point
 description PVC to R4
 ip address 10.1.34.3 255.255.255.0
 ip pim sparse-mode
 frame-relay interface-dlci 304
 ip multicast boundary 1
!
router eigrp 123
 network 3.3.3.3 0.0.0.0
 network 10.1.23.3 0.0.0.0
 no auto-summary
!
router bgp 3
 no synchronization
 bgp log-neighbor-changes
 network 34.34.34.3 mask 255.255.255.255
 neighbor 10.1.34.4 remote-as 4
 no auto-summary
!
ip pim autorp listener
ip pim send-rp-announce Loopback0 scope 3
ip pim send-rp-discovery Loopback0 scope 3
ip msdp peer 34.34.34.4 connect-source Loopback34
!
access-list 1 deny   224.0.1.39
access-list 1 deny   224.0.1.40
access-list 1 permit any

R4
hostname R4
!
no ip domain lookup
ip multicast-routing
!
interface Loopback0
 ip address 4.4.4.4 255.255.255.255
 ip pim sparse-mode
!
interface Loopback34
 ip address 34.34.34.4 255.255.255.255
!
interface Serial0/0
 description FR Switch
 no ip address
 encapsulation frame-relay
!
interface Serial0/0.43 point-to-point
 description PVC to R3
 ip address 10.1.34.4 255.255.255.0
 ip pim sparse-mode
 frame-relay interface-dlci 403
 ip multicast boundary 1
!
interface Serial0/0.45 point-to-point
 description PVC to R5
 ip address 10.1.45.4 255.255.255.0
 ip pim sparse-mode
 frame-relay interface-dlci 405
!
router ospf 1
 network 4.4.4.4 0.0.0.0 area 0
 network 10.1.45.4 0.0.0.0 area 0
!
router bgp 4
 no synchronization
 bgp log-neighbor-changes
 network 34.34.34.4 mask 255.255.255.255
 neighbor 10.1.34.3 remote-as 3
 no auto-summary
!
ip pim autorp listener
ip pim send-rp-announce Loopback0 scope 3
ip pim send-rp-discovery Loopback0 scope 3
ip msdp peer 34.34.34.3 connect-source Loopback34
!
access-list 1 deny   224.0.1.39
access-list 1 deny   224.0.1.40
access-list 1 permit any

R5
hostname R5
!
no ip domain lookup
ip multicast-routing
!
interface Loopback0
 ip address 5.5.5.5 255.255.255.255
 ip pim sparse-mode
!
interface Serial0/0
 no ip address
 encapsulation frame-relay
 no frame-relay inverse-arp
!
interface Serial0/0.54 point-to-point
 ip address 10.1.45.5 255.255.255.0
 ip pim sparse-mode
 frame-relay interface-dlci 504
!
interface Serial0/0.56 point-to-point
 ip address 10.1.56.5 255.255.255.0
 ip pim sparse-mode
 frame-relay interface-dlci 506
!
router ospf 1
 log-adjacency-changes
 network 5.5.5.5 0.0.0.0 area 0
 network 10.1.45.5 0.0.0.0 area 0
 network 10.1.56.5 0.0.0.0 area 0
!
ip pim autorp listener

R6
hostname R6
!
no ip domain lookup
ip multicast-routing
!
interface Loopback0
 ip address 6.6.6.6 255.255.255.255
 ip pim sparse-mode
!
interface Serial0/0
 no ip address
 encapsulation frame-relay
 no frame-relay inverse-arp
!
interface Serial0/0.65 point-to-point
 ip address 10.1.56.6 255.255.255.0
 ip pim sparse-mode
 frame-relay interface-dlci 605
!
router ospf 1
 log-adjacency-changes
 network 6.6.6.6 0.0.0.0 area 0
 network 10.1.56.6 0.0.0.0 area 0
!
ip pim autorp listener

Quick verification of RP Mappings

R1/R2/R3 should have R3 as the RP:

R1#sh ip pim rp map
PIM Group-to-RP Mappings

Group(s) 224.0.0.0/4
  RP 3.3.3.3 (?), v2v1
    Info source: 3.3.3.3 (?), elected via Auto-RP
         Uptime: 00:13:05, expires: 00:02:45

R2#sh ip pim rp map
PIM Group-to-RP Mappings

Group(s) 224.0.0.0/4
  RP 3.3.3.3 (?), v2v1
    Info source: 3.3.3.3 (?), elected via Auto-RP
         Uptime: 00:13:25, expires: 00:02:23

R3#sh ip pim rp map
PIM Group-to-RP Mappings
This system is an RP (Auto-RP)
This system is an RP-mapping agent (Loopback0)

Group(s) 224.0.0.0/4
  RP 3.3.3.3 (?), v2v1
    Info source: 3.3.3.3 (?), elected via Auto-RP
         Uptime: 00:14:41, expires: 00:02:17


R4/R5/R6 will use R4 as their RP:

R4#sh ip pim rp map
PIM Group-to-RP Mappings
This system is an RP (Auto-RP)
This system is an RP-mapping agent (Loopback0)

Group(s) 224.0.0.0/4
  RP 4.4.4.4 (?), v2v1
    Info source: 4.4.4.4 (?), elected via Auto-RP
         Uptime: 00:11:28, expires: 00:02:45

R5#sh ip pim rp map
PIM Group-to-RP Mappings

Group(s) 224.0.0.0/4
  RP 4.4.4.4 (?), v2v1
    Info source: 4.4.4.4 (?), elected via Auto-RP
         Uptime: 00:04:49, expires: 00:02:11

R6#sh ip pim rp map
PIM Group-to-RP Mappings

Group(s) 224.0.0.0/4
  RP 4.4.4.4 (?), v2v1
    Info source: 4.4.4.4 (?), elected via Auto-RP
         Uptime: 00:05:04, expires: 00:02:55

R3 and R4 each have loopback34 advertised into BGP and use this for MSDP peering.  MSDP is used to transmit the knowledge of multicast sources between domains.  PIM does not need to be run on these interfaces

R3#sh ip msdp peer
MSDP Peer 34.34.34.4 (?), AS 4
  Connection status:
    State: Up, Resets: 0, Connection source: Loopback34 (34.34.34.3)
    Uptime(Downtime): 00:04:40, Messages sent/received: 5/5
    Output messages discarded: 0
    Connection and counters cleared 00:16:10 ago
  SA Filtering:
    Input (S,G) filter: none, route-map: none
    Input RP filter: none, route-map: none
    Output (S,G) filter: none, route-map: none
    Output RP filter: none, route-map: none
  SA-Requests:
    Input filter: none
  Peer ttl threshold: 0
  SAs learned from this peer: 0
  Input queue size: 0, Output queue size: 0
  MD5 signature protection on MSDP TCP connection: not enabled

R4#sh ip msdp peer
MSDP Peer 34.34.34.3 (?), AS 3
  Connection status:
    State: Up, Resets: 0, Connection source: Loopback34 (34.34.34.4)
    Uptime(Downtime): 00:04:51, Messages sent/received: 5/5
    Output messages discarded: 0
    Connection and counters cleared 00:12:34 ago
  SA Filtering:
    Input (S,G) filter: none, route-map: none
    Input RP filter: none, route-map: none
    Output (S,G) filter: none, route-map: none
    Output RP filter: none, route-map: none
  SA-Requests:
    Input filter: none
  Peer ttl threshold: 0
  SAs learned from this peer: 0
  Input queue size: 0, Output queue size: 0
  MD5 signature protection on MSDP TCP connection: not enabled

So with everything looking ok, our objective is to verify multicast traffic can traverse the domains by having  R1 Loopback0 join multicast group 239.1.1.1 with R6 receive a response when it pings that group

R1#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
R1(config)#int loopback0
R1(config-if)#ip igmp join-group 239.1.1.1

Lets enable a debug to see if check ping packets arrive (we could use debug ip icmp however that presents less detail):

R1(config-if)#access-list 101 permit icmp any any
R1(config)#do deb ip pack detail 101
IP packet debugging is on (detailed) for access list 101
R1#end
*Mar  1 00:25:49.379: %SYS-5-CONFIG_I: Configured from console by console

R1#sh ip mroute | s 239.1.1.1
(*, 239.1.1.1), 00:05:42/00:02:14, RP 3.3.3.3, flags: SJCL
  Incoming interface: Serial0/0.12, RPF nbr 10.1.12.2
  Outgoing interface list:
    Loopback0, Forward/Sparse, 00:05:42/00:02:14

R1 has R2 as the RPF neighbor for *,239.1.1.1

R2#sh ip mroute | s 239.1.1.1
(*, 239.1.1.1), 00:04:01/00:03:25, RP 3.3.3.3, flags: S
  Incoming interface: Serial0/0.23, RPF nbr 10.1.23.3
  Outgoing interface list:
    Serial0/0.21, Forward/Sparse, 00:04:01/00:03:25

R2 has R3 as the RPF neighbor for *,239.1.1.1

R3#sh ip mroute | s 239.1.1.1
(*, 239.1.1.1), 00:04:27/00:02:57, RP 3.3.3.3, flags: S
  Incoming interface: Null, RPF nbr 0.0.0.0
  Outgoing interface list:
    Serial0/0.32, Forward/Sparse, 00:04:27/00:02:57

R3 has nothing as the RPF neighbor for *,239.1.1.1

When R6 pings 239.1.1.1 it's RP (R4) will discover it as a new multicast source and advertise it to its MSDP peer (R3)

R3#sh ip msdp sa-cache
MSDP Source-Active Cache - 0 entries
R3#deb ip msdp routes
MSDP Routes debugging is on

R6#ping 239.1.1.1

Type escape sequence to abort.
Sending 1, 100-byte ICMP Echos to 239.1.1.1, timeout is 2 seconds:
.


Well that was unsuccessful let's see if R3 learnt about our multicast sources:

R3#
*Mar  1 00:04:42.431: MSDP(0): (6.6.6.6/32, 239.1.1.1), accepted
*Mar  1 00:04:42.479: MSDP(0): (10.1.56.6/32, 239.1.1.1), accepted

Yes it did - what did we see on R1?

R1#
*Mar  1 00:04:50.315: IP: s=10.1.12.1 (local), d=6.6.6.6, len 100, unroutable
*Mar  1 00:04:50.319:     ICMP type=0, code=0
*Mar  1 00:04:50.379: IP: s=10.1.12.1 (local), d=10.1.56.6, len 100, unroutable
*Mar  1 00:04:50.379:     ICMP type=0, code=0

We can see that R1 must have recieved the ping because it's attempting to respond, however R6 didn't obtain a reply since R1 doesn't know how to get back to it

R1#sh ip mroute | s 239.1.1.1
(*, 239.1.1.1), 00:07:35/00:02:42, RP 3.3.3.3, flags: SJCL
  Incoming interface: Serial0/0.12, RPF nbr 10.1.12.2
  Outgoing interface list:
    Loopback0, Forward/Sparse, 00:07:35/00:02:19
(10.1.56.6, 239.1.1.1), 00:00:17/00:02:42, flags: LJ
  Incoming interface: Null, RPF nbr 0.0.0.0
  Outgoing interface list:
    Loopback0, Forward/Sparse, 00:00:17/00:02:42
(6.6.6.6, 239.1.1.1), 00:00:17/00:02:42, flags: LJ
  Incoming interface: Null, RPF nbr 0.0.0.0
  Outgoing interface list:
    Loopback0, Forward/Sparse, 00:00:17/00:02:42

We can even see that R1 is trying to build a specific path to get to the multicast sources 10.1.56.6 (R6 S0/0.65) and 6.6.6.6 (R6 Lo0) but is failing the RPF checks

R2#sh ip mroute | s 239.1.1.1
(*, 239.1.1.1), 00:05:39/00:03:11, RP 3.3.3.3, flags: S
  Incoming interface: Serial0/0.23, RPF nbr 10.1.23.3
  Outgoing interface list:
    Serial0/0.21, Forward/Sparse, 00:05:39/00:02:46

R2 is able to use R3 as its RPF neighbor and pass traffic destined to 239.1.1.1 out to R1

R3#sh ip mroute | s 239.1.1.1
(*, 239.1.1.1), 00:05:41/00:03:02, RP 3.3.3.3, flags: S
  Incoming interface: Null, RPF nbr 0.0.0.0
  Outgoing interface list:
    Serial0/0.32, Forward/Sparse, 00:05:41/00:02:41

R3 knows that someone at R2 or further downstream is subscribed to group 239.1.1.1

R3#sh ip msdp sa-cache
MSDP Source-Active Cache - 2 entries
(6.6.6.6, 239.1.1.1), RP 4.4.4.4, BGP/AS 0, 00:02:20/00:05:10, Peer 34.34.34.4
(10.1.56.6, 239.1.1.1), RP 4.4.4.4, BGP/AS 0, 00:02:20/00:05:10, Peer 34.34.34.4

So R3 knows about the sources and that the RP is Lo0 on R4 but doesn't know where the sources came from (BGP/AS 0)

Lets fix this by putting the sources into BGP

R4#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
R4(config)#router bgp 4
R4(config-router)#redistribute ospf 1
R4(config-router)#end

Let's see if that's resolved things:

R3#sh ip msdp sa-cache
MSDP Source-Active Cache - 2 entries
(6.6.6.6, 239.1.1.1), RP 4.4.4.4, BGP/AS 4, 00:05:40/00:05:31, Peer 34.34.34.4
(10.1.56.6, 239.1.1.1), RP 4.4.4.4, BGP/AS 4, 00:05:40/00:05:31, Peer 34.34.34.4

R3 has determined these source are via BGP and can establish paths back to the sources

R3#sh ip mroute | s 239.1.1.1
(*, 239.1.1.1), 00:08:03/00:03:17, RP 3.3.3.3, flags: S
  Incoming interface: Null, RPF nbr 0.0.0.0
  Outgoing interface list:
    Serial0/0.32, Forward/Sparse, 00:08:03/00:03:17
(6.6.6.6, 239.1.1.1), 00:00:19/00:02:40, flags: M
  Incoming interface: Serial0/0.34, RPF nbr 10.1.34.4
  Outgoing interface list:
    Serial0/0.32, Forward/Sparse, 00:00:19/00:03:17
(10.1.56.6, 239.1.1.1), 00:00:19/00:02:40, flags: M
  Incoming interface: Serial0/0.34, RPF nbr 10.1.34.4
  Outgoing interface list:
    Serial0/0.32, Forward/Sparse, 00:00:19/00:03:17

This doesn't work for R1 though as it's not aware of how to get to these sources (RPF nbr 0.0.0.0)

R1#sh ip mroute | s 239.1.1.1
(*, 239.1.1.1), 00:07:35/00:02:42, RP 3.3.3.3, flags: SJCL
  Incoming interface: Serial0/0.12, RPF nbr 10.1.12.2
  Outgoing interface list:
    Loopback0, Forward/Sparse, 00:07:35/00:02:19
(10.1.56.6, 239.1.1.1), 00:00:17/00:02:42, flags: LJ
  Incoming interface: Null, RPF nbr 0.0.0.0
  Outgoing interface list:
    Loopback0, Forward/Sparse, 00:00:17/00:02:42
(6.6.6.6, 239.1.1.1), 00:00:17/00:02:42, flags: LJ
  Incoming interface: Null, RPF nbr 0.0.0.0
  Outgoing interface list:
    Loopback0, Forward/Sparse, 00:00:17/00:02:42

So we need to redistribute those routes into eigrp

R3#conf t
R3(config)#router eigrp 123
R3(config-router)#redistribute bgp 3 metric 1 1 1 1 1
R3(config-router)#end

This should give us a return route for the ping and resolve the RPF for the shortest path to the sources


R1#sh ip route eigrp | i EX 
D EX    34.34.34.3 [170/2561024256] via 10.1.12.2, 01:33:57, Serial0/0.12
D EX    34.34.34.4 [170/2561024256] via 10.1.12.2, 01:33:57, Serial0/0.12
D EX    6.6.6.6 [170/2561024256] via 10.1.12.2, 01:33:57, Serial0/0.12
D EX    10.1.56.0 [170/2561024256] via 10.1.12.2, 01:33:57, Serial0/0.12
R1#sh ip mroute | s 239.1.1.1
(*, 239.1.1.1), 00:13:44/stopped, RP 3.3.3.3, flags: SJCL
  Incoming interface: Serial0/0.12, RPF nbr 10.1.12.2
  Outgoing interface list:
    Loopback0, Forward/Sparse, 00:13:44/00:02:18
(10.1.56.6, 239.1.1.1), 00:00:05/00:02:56, flags: LJT
  Incoming interface: Serial0/0.12, RPF nbr 10.1.12.2
  Outgoing interface list:
    Loopback0, Forward/Sparse, 00:00:05/00:02:54
(6.6.6.6, 239.1.1.1), 00:00:05/00:02:56, flags: LJT
  Incoming interface: Serial0/0.12, RPF nbr 10.1.12.2
  Outgoing interface list:
    Loopback0, Forward/Sparse, 00:00:05/00:02:54

So lets give it another shot:

R6#ping 239.1.1.1

Type escape sequence to abort.
Sending 1, 100-byte ICMP Echos to 239.1.1.1, timeout is 2 seconds:

Reply to request 0 from 10.1.12.1, 32 ms
Reply to request 0 from 10.1.12.1, 32 ms

On R1 we see
R1#
*Mar  1 00:12:47.815: IP: tableid=0, s=10.1.12.1 (local), d=10.1.56.6 (Serial0/0.12), routed via FIB
*Mar  1 00:12:47.815: IP: s=10.1.12.1 (local), d=10.1.56.6 (Serial0/0.12), len 100, sending
*Mar  1 00:12:47.815:     ICMP type=0, code=0
*Mar  1 00:12:47.823: IP: tableid=0, s=10.1.12.1 (local), d=6.6.6.6 (Serial0/0.12), routed via FIB
*Mar  1 00:12:47.827: IP: s=10.1.12.1 (local), d=6.6.6.6 (Serial0/0.12), len 100, sending
*Mar  1 00:12:47.827:     ICMP type=0, code=0

Success!

1 comment:

  1. Good example. I'll try this in a lab next days when I'll get some free time.

    ReplyDelete