纯 VPN & MPLS 的SD-WAN环境

VPN & MPLS 拓扑环境:


由于主要的业务流量都是分支FGT去往总部&数据中心的FGT,因此调度主要在分支FGT侧进行调度, 因此SD-WAN只需要配置在分支这一侧即可。总部FGT可以选择性的配置SD-WAN。考虑到文章篇幅问题,总部的FGT仅仅是启用普通的路由模式。如果要启动SD-WAN是类似的配置方法。


总部FGT的配置:

IP地址配置:
注意:建议在不需要的情况下关闭接口配置下的“设备探测”(Device detection)功能,该功能用于MAC地址厂商设备信息识别及MAC地址过滤,会消耗较多的设备资源。

总部VPN的配置:



重要要关注:VPN1_local  VPN1_remote VPN2_local VPN2_remote:

也就是说在进行模板配置的时候,需要将规划的Tunnel IP加入到感兴趣流里面去,这个部分要特别注意,容易遗漏,其实最好SD-WAN的VPN不要使用模板配置,感兴趣流直接使用0.0.0.0/0.0.0.0即可,可以避免遗漏,如果用模板一定要记得感兴趣里面加入隧道IP地址:

静态路由、模板下发的VPN静态路由、上互联网的默认路由、MPLS网络相关的路由:

策略VPN模板的策略/MPLS出口到分支的策略/去往互联网的策略的配置:

分支FGT的SD-WAN部署配置:
接口IP配置:
配置上互联网/MPLS网络的路由:




配置上网策略:

配置IPsec VPN,由于有两条隧道,其实是可以有两种方式配置,一种是按照IPsec VPN模板配置,另外一种是自己手工配置,这两条隧道我们按照两种方式分别配置,实际现网部署的时候选择其中一种方式部署即可:
VPN1的配置(基于模板配置):



关键的一步(感兴趣流定义,需要添加tunnel接口ip和业务网段两个感兴趣流):

然后模板会自动创建 IPsec VPN、IP地址对象、路由、策略。
IPsec VPN:

IP地址对象/组:

路由:

策略:

VPN1隧道接口上配置隧道IP地址:



 VPN2的IPsec VPN配置(纯手工配置):





注意一下:需要对应的调整总部的VPN2的感兴趣流:也为0.0.0.0/0.0.0.0 0.0.0.0/0.0.0.0,这样VPN才可以协商成功

0.0.0.0/0.0.0.0 的感兴趣流其实是可以让大家忽略掉感兴趣流的是,只需要策略和路由可达流量就可以通信,看个人思维方式而定。这也是两种VPN配置方法的区别。

然后再手工配置VPN2的路由:

手工配置VPN2的策略:

配置VPN2 tunnel接口的IP地址:

VPN建议优化项,开启第一阶段的DPD检测、开启第二阶段的自动协商:
FGT100E_Master # config vpn ipsec phase1-interface
FGT100E_Master (phase1-interface) # edit VPN1
FGT100E_Master (VPN1) # set dpd on-idle
FGT100E_Master (VPN1) # next
FGT100E_Master (phase1-interface) # edit VPN2
FGT100E_Master (VPN2) # set dpd on-idle
FGT100E_Master (VPN2) # end
FGT100E_Master # config vpn ipsec phase2-interface
FGT100E_Master (phase2-interface) # edit VPN1
FGT100E_Master (VPN1) # set auto-negotiate enable
FGT100E_Master (VPN1) # next
FGT100E_Master (phase2-interface) # edit VPN2
FGT100E_Master (VPN2) # set auto-negotiate enable
FGT100E_Master (VPN2) # end

VPN配置完毕,确认分支和总部VPN的建立状态:

分支防火墙SD-WAN的配置正式开始:




配置SD-WAN状态检查:

配置完健康检查你会发现Port13(MPLS)的状态是DOWN的,为什么呢?

原因是:我们还没有配置任何关于MPLS(Port13)的策略和相关路由,因此从Port13发起的健康检查一定是失败的。
现在VPN1、VPN2、MPLS(Port13)都属于SD-WAN接口组了,接下来我们配置SD-WAN的路由和策略。

配置SD-WAN的策略:
配置SD-WAN策略之前建议删除掉之前模板创建的VPN和手工配置的VPN所创建的策略,这些策略和SD-WAN的策略存在重叠,先删掉之前的旧策略,然后用SD-WAN策略代替,避免匹配错误,引起误解。


 



配置SD-WAN的路由:
配置SD-WAN路由之前需要删除掉之前模板创建的VPN和手工配置的VPN所创建的静态路由,这些路由和SD-WAN存在冲突,先删掉之前的旧路由,然后用SD-WAN路由代替。




最好还可以添加一条去往总部MPLS Port13接口网段的静态路由:

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 202.100.1.192, wan1
C       10.255.1.1/32 is directly connected, VPN1
C       10.255.1.2/32 is directly connected, VPN1
C       10.255.2.1/32 is directly connected, VPN2
C       10.255.2.2/32 is directly connected, VPN2
S       172.16.10.0/24 [1/0] via 192.168.254.1, port13, [0/1]
                       [1/0] via 10.255.1.2, VPN1, [0/1]
                       [1/0] via 10.255.2.2, VPN2, [0/1]
C       192.168.10.0/24 is directly connected, port1
C       192.168.254.0/24 is directly connected, port13
S       192.168.255.0/24 [10/0] via 192.168.254.1, port13
C       202.100.1.0/24 is directly connected, wan1

这样SD-WAN的路由和策略就完成了配置,查看SD-WAN健康检查的状态:

通过互联网模拟工具WANem,调整MPLS出口的延迟为50ms、VPN1为150ms、VPN2为100ms

MPLS 、VPN1 、VPN2的健康检查状态正常!此时没有任何的SD-WAN规则,因此流量将按照SD-WAN默认隐含规则---源IP负载均衡进行处理:

上述配置完毕,流量就是基于源IP的负载均衡进行处理,而如果需要特殊调度,则配置特定的SD-WAN规则即可:

需求1:使用SD-WAN规则,让访问服务器TCP 172.16.10.200:8080的服务走延迟最低的线路出去:




查看SD-WAN规则结果:
FGT100E_Master # diagnose sys virtual-wan-link member
Member(1): interface: VPN1, gateway: 10.255.1.2, priority: 0, weight: 0
Member(2): interface: VPN2, gateway: 10.255.2.2, priority: 0, weight: 0
Member(3): interface: port13, gateway: 192.168.254.1, priority: 0, weight: 0

FGT100E_Master # diagnose sys virtual-wan-link health-check
Health Check(HUB_Server_Check):
Seq(3): state(alive), packet-loss(0.000%) latency(50.877), jitter(0.213) sla_map=0x0     // MPLS port13 延迟较低
Seq(1): state(alive), packet-loss(0.000%) latency(150.865), jitter(0.082) sla_map=0x0
Seq(2): state(alive), packet-loss(0.000%) latency(100.695), jitter(0.073) sla_map=0x0

FGT100E_Master # diagnose sys virtual-wan-link service

Service(1): Address Mode(IPV4) flags=0x0
  TOS(0x0/0x0), Protocol(6: 8080->8080), Mode(priority), link-cost-factor(latency), link-cost-threshold(10), health-check(HUB_Server_Check)
  Service role: standalone
  Member sub interface:
  Members:
    1: Seq_num(3), alive, latency: 50.887, selected     // 选择延迟较低的MPLS Port13接口
    2: Seq_num(2), alive, latency: 100.718, selected
    3: Seq_num(1), alive, latency: 150.857, selected
  Src address:
        192.168.10.0-192.168.10.255

  Dst address:
        172.16.10.200-172.16.10.200

FGT100E_Master # diagnose firewall proute list
list route policy info(vf=root):

id=2131689473 vwl_service=1(TO_Server_10.200_8080) vwl_mbr_seq=3 2 1 dscp_tag=0xff 0xff flags=0x0 tos=0x00 tos_mask=0x00 protocol=6 sport=0:65535 iif=0 dport=8080 oif=23 oif=42 oif=41
source(1): 192.168.10.0-192.168.10.255
destination(1): 172.16.10.200-172.16.10.200

FGT100E_Master # diagnose ip address  list
IP=10.10.10.1->10.10.10.1/255.255.255.0 index=5 devname=dmz
IP=192.168.91.13->192.168.91.13/255.255.255.0 index=6 devname=mgmt
IP=202.100.1.10->202.100.1.10/255.255.255.0 index=7 devname=wan1
IP=192.168.10.1->192.168.10.1/255.255.255.0 index=11 devname=port1
IP=192.168.254.10->192.168.254.10/255.255.255.0 index=23 devname=port13
IP=127.0.0.1->127.0.0.1/255.0.0.0 index=30 devname=root
IP=169.254.1.1->169.254.1.1/255.255.255.0 index=32 devname=fortilink
IP=127.0.0.1->127.0.0.1/255.0.0.0 index=34 devname=vsys_hamgmt
IP=127.0.0.1->127.0.0.1/255.0.0.0 index=36 devname=vsys_ha
IP=169.254.0.1->169.254.0.1/255.255.255.192 index=37 devname=port_ha
IP=127.0.0.1->127.0.0.1/255.0.0.0 index=38 devname=vsys_fgfm
IP=169.254.0.65->169.254.0.65/255.255.255.192 index=39 devname=havdlink0
IP=169.254.0.66->169.254.0.66/255.255.255.192 index=40 devname=havdlink1
IP=10.255.1.1->10.255.1.2/255.255.255.255 index=41 devname=VPN1
IP=10.255.2.1->10.255.2.2/255.255.255.255 index=42 devname=VPN2

测试效果:
数据全部全部从MPLS Port13接口出:

调整延迟:将MPLS的延迟调整到200,查看SD-WAN规则的切换:

查看SD-WAN规则的接口切换:
FGT100E_Master # diagnose sys virtual-wan-link health-check
Health Check(HUB_Server_Check):
Seq(3): state(alive), packet-loss(44.000%) latency(201.999), jitter(1.457) sla_map=0x0   // 延迟变大,质量变差
Seq(1): state(alive), packet-loss(1.000%) latency(153.131), jitter(1.911) sla_map=0x0
Seq(2): state(alive), packet-loss(0.000%) latency(102.771), jitter(1.720) sla_map=0x0

FGT100E_Master # diagnose sys virtual-wan-link service

Service(1): Address Mode(IPV4) flags=0x0
  TOS(0x0/0x0), Protocol(6: 8080->8080), Mode(priority), link-cost-factor(latency), link-cost-threshold(10), health-check(HUB_Server_Check)
  Service role: standalone
  Member sub interface:
  Members:
    1: Seq_num(2), alive, latency: 102.927, selected  // 将会切换到延迟较低的线路上
    2: Seq_num(1), alive, latency: 153.379, selected
    3: Seq_num(3), alive, latency: 202.092, selected
  Src address:
        192.168.10.0-192.168.10.255

  Dst address:
        172.16.10.200-172.16.10.200

FGT100E_Master # diagnose firewall proute list
list route policy info(vf=root):

id=2131689473 vwl_service=1(TO_Server_10.200_8080) vwl_mbr_seq=2 1 3 dscp_tag=0xff 0xff flags=0x0 tos=0x00 tos_mask=0x00 protocol=6 sport=0:65535 iif=0 dport=8080 oif=42 oif=41 oif=23
source(1): 192.168.10.0-192.168.10.255
destination(1): 172.16.10.200-172.16.10.200

查看切换后的流量情况:

需求2:去往服务器Server1 172.16.1.200端口9090的UDP数据需要满足SLA 目标延迟200ms、丢包1%,同时需要在VPN1和VPN2之间进行负载均衡处理:
此时的SD-WAN规则需要用到 Maximize Bandwidth (SLA)算法:
首先配置SLA目标:

然后定义SD-WAN规则将去往Server 172.16.10.200 UDP 9090的业务调用 Maximize Bandwidth (SLA)算法:


查看SD-WAN规则结果:
FGT100E_Master # diagnose sys virtual-wan-link health-check
Health Check(HUB_Server_Check):
Seq(3): state(alive), packet-loss(0.000%) latency(50.719), jitter(0.165) sla_map=0x1
Seq(1): state(alive), packet-loss(0.000%) latency(150.716), jitter(0.153) sla_map=0x1
Seq(2): state(alive), packet-loss(0.000%) latency(100.692), jitter(0.263) sla_map=0x1

FGT100E_Master # diagnose sys virtual-wan-link service 2

Service(2): Address Mode(IPV4) flags=0x0
  TOS(0x0/0x0), Protocol(17: 9090->9090), Mode(load-balance)
  Service role: standalone
  Member sub interface:
  Members:
    1: Seq_num(1), alive, sla(0x1), num of pass(1), selected    // VPN1和VPN2都满足SLA目标,因此根据算法双方都会被选择,进行按照会话方式的负载均衡处理
    2: Seq_num(2), alive, sla(0x1), num of pass(1), selected
  Src address:
        192.168.10.0-192.168.10.255

  Dst address:
        172.16.10.200-172.16.10.200

FGT100E_Master # diagnose firewall proute list

id=2131820546 vwl_service=2(TO_Server_10_200_UDP_9090) vwl_mbr_seq=1 2 dscp_tag=0xff 0xff flags=0x10 load-balance tos=0x00 tos_mask=0x00 protocol=17 sport=0:65535 iif=0 dport=9090 oif=41 num_pass=1 oif=42 num_pass=1
source(1): 192.168.10.0-192.168.10.255
destination(1): 172.16.10.200-172.16.10.200

查看流量结果(按照会话负载均衡分配流量):

制造延迟将VPN1的延迟提高到250,超过SLA目标值,此时再看SD-WAN规则计算结果的调整和流量情况:

FGT100E_Master # diagnose sys virtual-wan-link health-check
Health Check(HUB_Server_Check):
Seq(3): state(alive), packet-loss(0.000%) latency(50.928), jitter(0.351) sla_map=0x1
Seq(1): state(alive), packet-loss(0.000%) latency(250.993), jitter(0.373) sla_map=0x0    // VPN1的延迟超过了SLA设定的目标值
Seq(2): state(alive), packet-loss(0.000%) latency(100.786), jitter(0.325) sla_map=0x1

FGT100E_Master # diagnose sys virtual-wan-link service 2

Service(2): Address Mode(IPV4) flags=0x0
  TOS(0x0/0x0), Protocol(17: 9090->9090), Mode(load-balance)
  Service role: standalone
  Member sub interface:
  Members:
    1: Seq_num(2), alive, sla(0x1), num of pass(1), selected   // 选择VPN2
    2: Seq_num(1), alive, sla(0x0), num of pass(0), selected  // VPN1 不符合SLA目标要求,不会被用于转发流量,将打破会话的负载均衡,流量只走VPN2
  Src address:
        192.168.10.0-192.168.10.255

  Dst address:
        172.16.10.200-172.16.10.200


FGT100E_Master # diagnose firewall proute list
list route policy info(vf=root):
id=2131820546 vwl_service=2(TO_Server_10_200_UDP_9090) vwl_mbr_seq=2 1 dscp_tag=0xff 0xff flags=0x10 load-balance tos=0x00 tos_mask=0x00 protocol=17 sport=0:65535 iif=0 dport=9090 oif=42 num_pass=1 oif=41 num_pass=0
source(1): 192.168.10.0-192.168.10.255
destination(1): 172.16.10.200-172.16.10.200 

此时再查看流量测试结果:

需求3:其他的VPN流量需要在VPN1 、VPN2 、MPLS 按照会话比例进行负载均衡:VPN1 、VPN2 、MPLS 的会话比例为 1:2:3进行负载均衡处理(默认为源IP负载均衡处理):
只需要调整默认隐含的SD-WAN规则即可,没有匹配到自定义SD-WAN规则的流量将会匹配此隐含的SD-WAN规则(按照会话的负载均衡,其本质为FIB路由表的负载均衡):


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 202.100.1.192, wan1
C       10.255.1.1/32 is directly connected, VPN1
C       10.255.1.2/32 is directly connected, VPN1
C       10.255.2.1/32 is directly connected, VPN2
C       10.255.2.2/32 is directly connected, VPN2
S       172.16.10.0/24 [1/0] via 192.168.254.1, port13, [0/3]  // 权重3
                       [1/0] via 10.255.2.2, VPN2, [0/2]    // 权重2
                       [1/0] via 10.255.1.2, VPN1, [0/1]  // 权重1
C       192.168.10.0/24 is directly connected, port1
C       192.168.254.0/24 is directly connected, port13
S       192.168.255.0/24 [10/0] via 192.168.254.1, port13
C       202.100.1.0/24 is directly connected, wan1

更多需求和SD-WAN算法的实现可以参考“SD-WAN”---“SD-WAN规则(Manual & Implicit)”的介绍。