Allow SD-WAN rules to steer IPv6 multicast traffic
SD-WAN rules can now steer IPv6 multicast traffic. Previously only IPv4 multicast traffic was supported. When an SD-WAN member is out of SLA, multicast traffic can fail over to another SD-WAN member, and switch back when SLA recovers.
The new pim-use-sdwan
option enables or disables the use of SD-WAN for PIM (Protocol Independent Multicast) when checking RP (Rendezvous Point) neighbors and sending PIM-SM join or register packets.
config router multicast6 config pim-sm-global set pim-use-sdwan {enable | disable} end end
When SD-WAN steers multicast traffic, ADVPN is not supported. Use the config system sdwan config service edit <id> set shortcut {enable | disable} next end end |
Example
In the following example, three PIM-SM enabled tunnels are configured between Spoke-1 and the Hub. The multicast source is located at Hub, and the multicast receiver is attached to Spoke-1.
This example focuses on configuration related to the new feature. Following is an overview of the configuration steps:
-
On the hub FortiGate, configure multicast routing for the source and the multicast RP.
-
On the spoke FortiGate, configuring multicast routing and enable SD-WAN for steering.
-
Verify traffic failover for the following scenarios:
-
When the cost of an SD-WAN member changes
-
When a link is in SLA
-
When a link is out of SLA
-
To configure the Hub:
-
On Hub, configure multicast routing for the source and the multicast RP:
In this example,
port5
is used for the multicast source, and20000:172:16:205::1
is the IPv6 address for the RP.config router multicast6 set multicast-routing enable config interface edit "hub-phase1" next edit "hub2-phase1" next edit "port5" next edit "hub3-phase1" next end config pim-sm-global config rp-address edit 1 set ip6-address 2000:172:16:205::1 next end end end
-
Configure the firewall policy:
config firewall multicast-policy6 edit 1 set srcintf "port5" set dstintf "any" set srcaddr "all" set dstaddr "all" next end
-
Verify that all PIM-SM neighbors are established:
# get router info6 multicast pim sparse-mode neighbor Neighbor Interface Uptime/Expires Ver DR Address Prio/Mode fe80::1 hub-phase1 06:49:35/00:01:39 v2 1 / fe80::2 hub2-phase1 06:49:34/00:01:42 v2 1 / fe80::1 hub3-phase1 02:41:17/00:01:31 v2 1 /
To configure Spoke-1:
-
On Spoke-1, configure multicast routing and enable SD-WAN for steering:
In this example,
port5
is used for the multicast receiver, the use of SD-WAN for steering is enabled, and20000:172:16:205::1
is the IPv6 address for the RP.config router multicast6 set multicast-routing enable config interface edit "spoke11-p1" next edit "spoke12-p1" next edit "port2" next edit "spoke13-p1" next end config pim-sm-global set pim-use-sdwan enable config rp-address edit 1 set ip6-address 2000:172:16:205::1 next end end end
-
Configure the firewall policy:
config firewall multicast-policy6 edit 1 set srcintf "any" set dstintf "any" set srcaddr "all" set dstaddr "all" next end
-
Configure SD-WAN:
In this example, the
protocol
is set to103
to match PIM-SM join/register messages.config system sdwan set status enable config zone edit "virtual-wan-link" next end config members edit 1 set interface "spoke11-p1" next edit 2 set interface "spoke12-p1" next edit 3 set interface "spoke13-p1" next end config health-check edit "1" set addr-mode ipv6 set server "2000::9:0:0:1" set update-static-route disable set members 1 config sla edit 1 next end next edit "2" set addr-mode ipv6 set server "2000::9:0:0:2" set update-static-route disable set members 2 config sla edit 1 next end next edit "3" set addr-mode ipv6 set server "2000::9:0:0:3" set update-static-route disable set members 3 config sla edit 1 next end next end config service edit 1 set name "1" set addr-mode ipv6 set mode sla set protocol 103 config sla edit "1" set id 1 next edit "2" set id 1 next edit "3" set id 1 next end set priority-members 1 2 3 set sla-compare-method number set dst6 "all" next end end
-
Verify that all PIM-SM neighbors are established:
# get router info6 multicast pim sparse-mode neighbor Neighbor Interface Uptime/Expires Ver DR Address Prio/Mode fe80:10:10:15::253 spoke11-p1 06:49:50/00:01:16 v2 1 / DR fe80:10:10:16::253 spoke12-p1 06:49:50/00:01:26 v2 1 / DR fe80:10:10:17::253 spoke13-p1 02:41:32/00:01:43 v2 1 / DR
To verify traffic failover:
-
On Spoke-1, diagnose the SD-WAN service. The preferred route is spoke11-p1 to hub-phase1:
# diagnose sys sdwan service6 Service(1): Address Mode(IPV6) flags=0x4200 use-shortcut-sla use-shortcut Tie break: cfg Shortcut priority: 2 Gen(1), TOS(0x0/0x0), Protocol(103): src(1->65535):dst(1->65535), Mode(sla), sla-compare-number Members(3): 1: Seq_num(1 spoke11-p1 virtual-wan-link), alive, sla(0x1), gid(0), cfg_order(0), local cost(0), selected >>>>>>> spoke11-p1 which is connected to hub-phase1 is preferred 2: Seq_num(2 spoke12-p1 virtual-wan-link), alive, sla(0x2), gid(0), cfg_order(1), local cost(0), selected 3: Seq_num(3 spoke13-p1 virtual-wan-link), alive, sla(0x4), gid(0), cfg_order(2), local cost(0), selected Dst6 address(1): ::/0
-
When the receiver initiates IGMP to join group
ff15::10
, viewmroute
on Spoke-1 and Hub:-
On Spoke-1:
The
RPF idx
is connected to hub-phase1, indicating that PIM-SM join message follows SD-WAN service and is sent tospoke11-p1
, andport2
is connected to the receiver.FGT_B (root)# get router info6 multicast pim sparse-mode mroute ff15::10 IP Multicast Routing Table ...... (*, ff15::10) RP: 2000:172:16:205::1 RPF nbr: fe80:10:10:15::253 RPF idx: spoke11-p1 Upstream State: JOINED Local: port2 Joined: Asserted: FCR: Source: 2000:172:16:205::100 Outgoing: port2 KAT timer running, 196 seconds remaining Packet count 168 ...
-
On the Hub:
We see that
hub-phase1
is connected to spoke11-p1 on Spoke-1.FGT_A (root) (Interim)# get router info6 multicast pim sparse-mode mroute ff15::10 IP Multicast Routing Table ...... (*, ff15::10) RP: 2000:172:16:205::1 RPF nbr: :: RPF idx: None Upstream State: JOINED Local: Joined: hub-phase1 Asserted: FCR: ...
-
-
The server starts to send multicast traffic to group
ff15::10
, and Hub forwards the traffic to Spoke-1 through hub-phase1.FGT_A (root) (Interim)# diagnose sniffer packet any 'host ff15::10' 4 interfaces=[any] filters=[host ff15::10] 0.637174 port5 in 2000:172:16:205::100.38823 -> ff15::10.12345: udp 46 [flowlabel 0x8ea58] 0.637228 hub-phase1 out 2000:172:16:205::100.38823 -> ff15::10.12345: udp 46 [flowlabel 0x8ea58]
-
When the cost of member spoke11-p1 and spoke12-p1 is increased, SD-WAN prefers spoke13-p1.
The PIM-SM join message from Spoke-1 to RP is sent to member spoke13-p1, and multicast traffic fails over to hub3-phase1 on the Hub accordingly.
-
On Spoke-1:
In this example,
spoke13-p1
, which is connected to hub-phase3, is preferred.FGT_B (root) (Interim)# diagnose sys sdwan service6 Service(1): Address Mode(IPV6) flags=0x4200 use-shortcut-sla use-shortcut Tie break: cfg Shortcut priority: 2 Gen(1), TOS(0x0/0x0), Protocol(103): src(1->65535):dst(1->65535), Mode(sla), sla-compare-number Members(3): 1: Seq_num(3 spoke13-p1 virtual-wan-link), alive, sla(0x4), gid(0), cfg_order(2), local cost(0), selected 2: Seq_num(1 spoke11-p1 virtual-wan-link), alive, sla(0x1), gid(0), cfg_order(0), local cost(20), selected 3: Seq_num(2 spoke12-p1 virtual-wan-link), alive, sla(0x2), gid(0), cfg_order(1), local cost(20), selected Dst6 address(1): ::/0
-
On the Hub:
Once the cost of spoke11-p1 is increased, multicast traffic fails over to
hub2-phase1
. Once the cost of spoke12-p1 is increased, multicast traffic fails over tohub3-phase1
.FGT_A (root) (Interim)# diagnose sniffer packet any 'host ff15::10' 4 interfaces=[any] filters=[host ff15::10] .... 385.497887 port5 in 2000:172:16:205::100.41944 -> ff15::10.12345: udp 46 [flowlabel 0xa5e3d] 385.497927 hub-phase1 out 2000:172:16:205::100.41944 -> ff15::10.12345: udp 46 [flowlabel 0xa5e3d] 386.497967 port5 in 2000:172:16:205::100.41944 -> ff15::10.12345: udp 46 [flowlabel 0xa5e3d] 386.498258 hub2-phase1 out 2000:172:16:205::100.41944 -> ff15::10.12345: udp 46 [flowlabel 0xa5e3d] 387.498044 port5 in 2000:172:16:205::100.41944 -> ff15::10.12345: udp 46 [flowlabel 0xa5e3d] ... 400.499075 port5 in 2000:172:16:205::100.41944 -> ff15::10.12345: udp 46 [flowlabel 0xa5e3d] 400.499120 hub2-phase1 out 2000:172:16:205::100.41944 -> ff15::10.12345: udp 46 [flowlabel 0xa5e3d] 401.499180 port5 in 2000:172:16:205::100.41944 -> ff15::10.12345: udp 46 [flowlabel 0xa5e3d] 401.499515 hub3-phase1 out 2000:172:16:205::100.41944 -> ff15::10.12345: udp 46 [flowlabel 0xa5e3d] 402.499254 port5 in 2000:172:16:205::100.41944 -> ff15::10.12345: udp 46 [flowlabel 0xa5e3d] 402.499319 hub3-phase1 out 2000:172:16:205::100.41944 -> ff15::10.12345: udp 46 [flowlabel 0xa5e3d] 403.499330 port5 in 2000:172:16:205::100.41944 -> ff15::10.12345: udp 46 [flowlabel 0xa5e3d] ...
-
-
When spoke13-p1 becomes out of SLA, SD-WAN selects spoke11-p1 as the preferred member.
This change redirects the PIM-SM join message from Spoke-1 to RP towards spoke11-p1, causing the multicast traffic to failover to hub-phase1 on the Hub.
-
Conversely, when spoke13-p1 is in SLA again, it is prioritized by SD-WAN.
This adjustment redirects the PIM-SM join message from Spoke-1 to RP towards spoke13-p1, triggering a failover of the multicast traffic to hub3-phase1 on the Hub.