“SD-WAN规则”数据转发逻辑

SD-WAN规则介绍:

SD-WAN 规则 = 策略路由 (PBR) ,但是同时SD-WAN rule规则又比策略路由的优先级低一些。


SD-WAN 规则和策略路由一样,也是从上往下按照顺序匹配,可以按照特定的算法将指定的数据流转发到相应的出接口上。


FGT100E_Master # diagnose firewall proute list      //  SD-WAN规则本质为策略路由(ID >7f000001 ),优先级高于普通FIB路由。
list route policy info(vf=root):

id=2131820545 vwl_service=1(OFFICE_365) vwl_mbr_seq=3 1 2 dscp_tag=0xff 0xff flags=0x0 tos=0x00 tos_mask=0x00 protocol=0 sport=0:65535 iif=0 dport=1-65535 oif=23 oif=7 oif=8
source(1): 192.168.10.0-192.168.10.255
destination wildcard(1): 0.0.0.0/0.0.0.0
internet service(2): Microsoft-Office365(327782) Microsoft-Office365.Published(327880)

id=2131820546 vwl_service=2(WeChat) vwl_mbr_seq=1 2 3 dscp_tag=0xff 0xff flags=0x0 tos=0x00 tos_mask=0x00 protocol=0 sport=0:65535 iif=0 dport=1-65535 oif=7 oif=8 oif=23
source(1): 192.168.10.0-192.168.10.255
destination wildcard(1): 0.0.0.0/0.0.0.0
internet service(9): WeChat(4294838068, 33760) WeChat_File.Transfer(4294838069, 47379) WeChat_ID(4294838070, 44274) WeChat_Location.Share(4294838071, 36743) WeChat_Picture.Transfer(4294838072, 36730) WeChat_Video.Transfer(4294838073, 36741) WeChat_Voice.Chat(4294838075, 36742) WeChat_VoIP.Call(4294838074, 36648) WeChat_Web(4294838076, 39523)

id=2131820547 vwl_service=3(YOUKU) vwl_mbr_seq=3 1 dscp_tag=0xff 0xff flags=0x0 tos=0x00 tos_mask=0x00 protocol=0 sport=0:65535 iif=0 dport=1-65535 oif=23 oif=7
source(1): 192.168.10.0-192.168.10.255
destination wildcard(1): 0.0.0.0/0.0.0.0
internet service(2): Youku(4294838225, 16531) Youku_Video(4294838226, 35285) 

SD-WAN规则的最后面存在一条垫底的默认隐含规则,实际的作用就是当没有匹配到上面SD-WAN规则的数据时,最终将会匹配到这条隐含的规则,隐含规则的本质就是普通的FIB路由表。
也就说没有匹配SD-WAN规则的数据将会匹配普通路由表进行转发:

FGT100E_Master # get router info kernel    // 没有匹配上上面自定义的SD-WAN规则,则会进行普通FIB路由表的查询进行转发。
tab=254 vf=0 scope=0 type=1 proto=11 prio=0 0.0.0.0/0.0.0.0/0->0.0.0.0/0 pref=0.0.0.0
        gwy=101.100.1.192 flag=04 hops=0 oif=8(wan2)
        gwy=111.100.1.192 flag=04 hops=0 oif=23(port13)
        gwy=202.100.1.192 flag=04 hops=0 oif=7(wan1)

FGT100E_Master # get router info routing-table  all
Routing table for VRF=0
Codes: K - kernel, C - connected, S - static, R - RIP, B - BGP
       O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, L1 - IS-IS level-1, L2 - IS-IS level-2, ia - IS-IS inter area
       * - candidate default

S*      0.0.0.0/0 [10/0] via 101.100.1.192, wan2
                  [10/0] via 111.100.1.192, port13
                  [10/0] via 202.100.1.192, wan1
C       101.100.1.0/24 is directly connected, wan2
C       111.100.1.0/24 is directly connected, port13
C       192.168.10.0/24 is directly connected, port1
C       202.100.1.0/24 is directly connected, wan1

没有匹配SD-WAN规则的数据流将查询路由表,在WAN1/WAN2/Port13三条默认路由出口上进行负载均衡(默认按源IP方式负载流量)。

在FortiGate中存在策略路由、 SD-WAN规则、普通路由等数据转发的方式,那么具体SD-WAN在其中应该如何工作呢?

策略路由、SD-WAN规则、本地路由表的查找与转发逻辑关系:策略路由--> SD-WAN规则 -->本地路由





对比策略路由和SD-WAN规则的工作过程(二者有细微的差别,大部分情况下是很相似):




“SD-WAN规则”工作逻辑说明

SD-WAN规则分成两种:

1.手动自定义的SD-WAN规则:低优先级的策略路由(优先级比普通策略路由低)
手工添加的SD-WAN规则则类似支持多出口的动态选择、支持应用控制、支持路由属性等的增强版策略路由,其转发优先级比普通策略路由低,比普通路由优先级高。


2. 最后一条默认的SD-WAN规则:依据LLB的负载方式查询本地静态路由(默认源IP负载)
LLB负载支持源IP负载、溢出、会话权重负载、源目IP负载等多种方式,就是旧版本中的WAN LLB功能。


手工自定义配置的SD-WAN规则相当于是一条只配置了出接口但没有配置下一跳地址(下一跳地址为0.0.0.0)的策略路由,因此必须要再次查询一遍路由表才可以找到正确的下一跳地址,如果无法查找到该接口的下一跳地址,自定义的SD-WAN规则也将失效,由此可见SD-WAN规则十分依赖FIB路由表。


SD-WAN规则这样的处理方式,带来的最大的好处是可以实现SD-WAN出口故障的快速切换,SD-WAN的健康检查完全依赖于这种处理方式。一旦健康检查失败,出接口的静态路由将会消失,SD-WAN将无法在路由表中查找到下一跳地址,因此相应的SD-WAN规则也跟随着会失效,从而实现了SD-WAN的多出口故障的自动切换。

注意:SD-WAN的路由必不可少,否则SD-WAN规则将无法使用

可以根据需求必须要配置:
手工配置默认路由或明细路由指向SD-WAN出口(默认源IP负载),或者使用动态路由协议(OSPF/BGP/RIP)学习到相应的路由,总之路由表中一定要有去往SD-WAN规则中的目的IP的路由才可以。

可以根据需要配置到具体WAN1/WAN2/Port3分别的路由,也可以直接配置指向SD-WAN接口的路由:
或 


如果SD-WAN是针对去往internet的负载:则必须配置默认路由指向SD-WAN
如果SD-WAN是针对去往VPN业务网段的负载:则必须配置VPN明细路由指向SD-WAN

默认情况下路由表中需要存在SD-WAN接口的路由,这样SD-WAN规则才可以生效。


总结来看:默认情况下, SD-WAN规则由于只能选择出接口而无法直接配置下一跳的IP地址(策略路由可以配置出接口和下一跳IP),因此需要继续通过FIB路由表的查询以便找到正确的下一跳IP地址,才可以将数据转发出去,可以看出SD-WAN规则十分的依赖路由转发表,几乎SD-WAN规则就是依赖FIB路由表而工作的,二者是相互依存的关系。

-------------------------------------------------------------------------------------------------------------------------------------------------------------
那么是否可以打破这样的依赖关系呢?是否可以和策略路由一样,SD-WAN规则也可以有一个明确的出接口和下一跳IP,而不需要依赖FIB路由表而找到下一跳IP呢?
答案是:有的,虽然我们不推荐这样做,这样不利于多出接口的快速切换。

具体的做法如下:
FGT100E_Master # config system virtual-wan-link
FGT100E_Master (virtual-wan-link) # config members
FGT100E_Master (members) # show
config members
    edit 1
        set interface "wan1"
        set gateway 202.100.1.192
    next
    edit 2
        set interface "wan2"
        set gateway 101.100.1.192
    next
    edit 3
        set interface "port13"
        set gateway 111.100.1.192
    next
end
FGT100E_Master (members) # end
FGT100E_Master (virtual-wan-link) # config service
FGT100E_Master (service) # edit 1
FGT100E_Master (1) # show full-configuration
config service
    edit 1
        set name "OFFICE_365"
        set addr-mode ipv4
        set input-device-negate disable
        set mode priority
        set role standalone
        set standalone-action disable
        set tos 0x00
        set tos-mask 0x00
        set src "LAN_Network_192.168.10.0"
        set src-negate disable
        set internet-service enable
        set internet-service-id 327782 327880
        set health-check "Default_Office_365"
        set link-cost-factor latency
        set link-cost-threshold 10
        set hold-down-time 0
        set dscp-forward disable
        set dscp-reverse disable
        set priority-members 3 1 2
        set status enable
        set gateway disable     //默认为disable
        set default disable      //默认为disable
    next
end

如果将SD-WAN规则下面的gateway和default默认状态有disable改成enable,则SD-WAN规则将跳过FIB的查询,直接选择members接口里面配置的下一跳IP作为sd-wan规则(策略路由)的下一跳IP,直接转发流量,而不再查询FIB路由表了。

FGT100E_Master # config system virtual-wan-link
FGT100E_Master (virtual-wan-link) # config service
FGT100E_Master (service) #  edit 1
FGT100E_Master (1) # set gateway enable
FGT100E_Master (1) # set default  enable
FGT100E_Master (1) # end


这种使用场景比较特别,需要将SD-WAN规则固定的从某个出口/下一跳IP出去,而不想要受到底层FIB路由表路由切换的影响(健康检查切换/link-monitor等等),这种使用场景才使用,相对来说比较少使用到。


特别注意:关于FGT本机发起流量,比如BGP、SNMP Trap、syslog等等 这些流量也会被SD-WAN规则(策略路由)所影响到, 从Fortios6.0/5.6.4开始,本地发起的流量将接受策略路由的优先查找和匹配。

由于策略路由匹配,本地发起的流量(如发送到直接连接的BGP对等方[端口1]的BGP)可能会通过另一个接口[端口2]流出,这样会引起一些意想不到的情况出现。

避免本地发起的流量匹配到SD-WAN策略路由的方法:
1. 避免使用SD-WAN规则中的srcaddr=“all”:all里面包括了FGT本机发起流量的IP,定义一个明确的内网IP网段的地址对象或组来代替all

2.在SD-WAN规则中配置入接口选项,明确策略路由的如接口,避免匹配到本机发起的流量:添加“set input device xxx”(只能命令行配置),以便此sd-wan proute仅与通过接口xxx入口的转发流量进行匹配
FGT100E_Master # config system virtual-wan-link
FGT100E_Master (virtual-wan-link) # config service
FGT100E_Master (service) #  edit 1
FGT100E_Master (1) # set input-device port1   // 只能命令行配置
FGT100E_Master (1) # show
config service
    edit 1
        set name "OFFICE_365"
        set input-device "port1"
        set mode priority
        set src "LAN_Network_192.168.10.0"
        set internet-service enable
        set internet-service-id 327782 327880
        set health-check "Default_Office_365"
        set priority-members 3 1 2 4
        set gateway enable
        set default enable
    next
end
FGT100E_Master (1) # end
FGT100E_Master (virtual-wan-link) # end

3.使用策略路由将影响的网段(可以源网段,也可以目的网段,比如影响到本机发起的BGP协商网段)将动作设置为: action=deny,以便bypass所有sd-wan策略路由并直接跳到FIB路由表进行路由查找,可以查询到直连路由,这样就不会找错出接口信息。注意要把这条bypass的规则放置于策略路由的最前面,以便优先匹配。

 config router policy
    edit 1
        set src "192.168.10.1/255.255.255.255"
        set dst "192.168.10.2/255.255.255.255"
        set action deny     // bypass掉相关流量,不走策略路由和SD-WAN策略路由
    next
end


总结:

SD-WAN规则可以认为是调用了多个有序出接口(oif)列表的策略路由,但是优先级比普通的策略路由要低一些:
1.oif在策略路由中从左(最优先)到右(最不优先)进行排序
# diagnose firewall proute list

id=2084306945 vwl_service=1(OFFICE_365) vwl_mbr_seq=3 1 2 4 dscp_tag=0xff 0xff flags=0x0 tos=0x00 tos_mask=0x00 protocol=0 sport=0:65535 iif=11 dport=1-65535 oif=23 gwy=111.100.1.192 oif=7 gwy=202.100.1.192 oif=8 gwy=101.100.1.192 oif=47 gwy=114.100.1.196
source(1): 192.168.10.0-192.168.10.255
destination wildcard(1): 0.0.0.0/0.0.0.0
internet service(2): Microsoft-Office365(327782) Microsoft-Office365.Published(327880)
 
2. SD-WAN规则的类别(Best Quality, Lowest Cost, Maximize Bandwidth)决定了当SLA检查值(延迟、抖动、丢失)发生变化时,接口列表中的出接口(oif)顺序是如何变化的。

3. 默认情况下,FIB路由表中必须有去往目的IP的路由,这样SD-WAN规则才可以生效,SD-WAN规则的出接口的下一跳是通过FIB路由表查询获取的,因此SD-WAN目的网段的路由非常重要。
FGT100E_Master # get router info routing-table  all

Routing table for VRF=0
Codes: K - kernel, C - connected, S - static, R - RIP, B - BGP
       O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, L1 - IS-IS level-1, L2 - IS-IS level-2, ia - IS-IS inter area
       * - candidate default

S*      0.0.0.0/0 [1/0] via 111.100.1.192, port13
                  [1/0] via 114.100.1.196, PPPOE1_DR_PENG
                  [1/0] via 202.100.1.192, wan1
                  [1/0] via 101.100.1.192, wan2, [100/0]
C       101.100.1.0/24 is directly connected, wan2
C       111.100.1.0/24 is directly connected, port13
C       114.100.1.196/32 is directly connected, PPPOE1_DR_PENG
C       114.100.1.204/32 is directly connected, PPPOE1_DR_PENG
C       192.168.10.0/24 is directly connected, port1
C       202.100.1.0/24 is directly connected, wan1

如果没有匹配的SD-WAN的策略路由,则路由的决策会基于FIB进行查找(默认是源IP方式的ECMP)

config system virtual-wan-link
    set status enable
    set load-balance-mode source-ip-based

本机发起的流量也会受SD-WAN策略路由查找的限制,上文有介绍三种避免的方法。

路由发送改变后(比如出街接口列表重新排序, 健康检查失败触发, 动态路由协议更新),会话将重新上述CPU进行匹配处理,重新查询策略和路由,这样流量可能会迁移到另一个SD-WAN成员接口上 。(具体说明见“SD-WAN健康状态检查(Performance SLA)”章节)
* 有NATed会话的流量不会随着路由的变化而改变流量的出接口(默认情况下) ,只有纯三层的流量转发才会正常的进行出接口切换。
FGT100E_Master # config system global
FGT100E_Master (global) # show full-configuration  | grep snat
    set snat-route-change disable
FGT100E_Master (global) # end

* 在接口下设置会话保持(preserve-session-route)可以允许在路由更改后强制将会话保持在同一个sd-wan成员上,不跟随这出接口的变化而变化已有流量会话的出接口信息。
FGT100E_Master # config system interface
FGT100E_Master (interface) # edit wan1
FGT100E_Master (wan1) # show full-configuration   | grep pres
        set preserve-session-route disable
FGT100E_Master (wan1) # end