ADVPN 场景
ADVPN 场景
重要
ADVPN 目前不支持 Maximize Bandwidth (SLA) 模式。
网络拓扑与需求

- 使用 IPsec VPN 建立动态的多隧道,Hub 和 Spoke 之间是固定的 IPSec 隧道,而 Spoke 和 Spoke 之间则是流量触发的按需动态创建的 VPN 隧道。
- 使用动态路由协议 BGP 进行路由的分发和学习,HUB 充当 BGP 路由反射器进行路由的传递,同时分支需要开启“additional-path”,形成 VPN 业务路由的负载分担 BGP 路由,这是 SD-WAN 可以调度的前提(路由表中有路由)。
- 使用 SD-WAN 规则对流量进行分配和调度,可以配置特定的 SD-WAN 算法进行流量的调度。
- 部署 SD-WAN 通常在一个全新的设备进行配置,如果需要加入 SD-WAN 区域的接口已经被其他配置(如防火墙策略)引用,是无法直接加入 SD-WAN 区域的。要加入 SD-WAN 区域,又不想删除关联的配置,请参考 网络管理 → SD-WAN → SD-WAN 配置举例 → 将已关联接口移至 SD-WAN 区域章节。
配置步骤
基础配置
Hub
在 Hub 设备上配置 WAN1(port2)、WAN2(port3)以及 LAN(port4)的接口 IP(略)。
配置两个 WAN 接口上访问 Internet 的默认路由。

config router static edit 1 set gateway 101.103.254.1 set device "port2" next edit 2 set gateway 202.103.254.1 set device "port3" next end Hub # get router info routing-table all Routing table for VRF=0 S* 0.0.0.0/0 [10/0] via 101.103.254.1, port2, [1/0] [10/0] via 202.103.254.1, port3, [1/0] C 10.10.254.0/24 is directly connected, port4 C 101.103.254.0/24 is directly connected, port2 C 202.103.254.0/24 is directly connected, port3
Spoke
- 配置每个 Spoke FortiGate 运营商线路的 IP(如果是 PPPoE 线路,PPPoE 请通过 CLI 配置,参考 部署前注意事项 → PPPoE 接口配置章节)与内网口 IP(略)。
- 在每个 Spoke 配置 WAN 接口上访问 Internet 的默认路由(略,参考 Hub 上的配置)。
IPSec 相关配置
Hub
通过 ADVPN 向导来配置 ADVPN,进入“VPN → IPSec 向导”页面,模板类型选择“Hub-and-Spoke”类型,角色选择 Hub,点击下一步。
重要
通过 ADVPN 向导来配置 ADVPN 可以快速地部署 ADVPN + BGP 环境,而不用在每个 Spoke 上进行相关的具体功能配置,大大增加了部署效率与难度,部署完成后,可以再根据实际需求对配置进行调整。

配置 WAN1(port2)接口上的 IPSec 拨号连接,流入接口选择 WAN1(port2),配置认证方法,这里以预共享密钥为例,填入预共享密钥,点击下一步。

配置 Hub 端 WAN1(port2)上的 IPSec Tunnel IP,用于 BGP 邻居建立,配置“远程 IP 地址/掩码”为一个 24 位网络地址(根据 Spoke 的数量判断掩码位数),点击下一步。

配置 BGP 路由的本地 AS 号(此例中 Hub 和所有的 Spoke 之间为 IBGP 邻居),Hub 端内网接口与网段(用于自动创建安全策略和 BGP 路由发布),Spoke type 选择“范围”,填写 Spoke prefix 范围为 WAN1 线路 IPSec 对应的 Spoke Tunnel 接口 IP 的范围子网,点击 Spoke 邻居组中的新建按钮。
重要
Spoke type 推荐使用“范围”模式,并结合 BGP 邻居范围和 BGP 邻居组使用,否则如果 Spoke 较多,每个 Spoke 配置一个 BGP 邻居将是一个巨大的工作量。

在弹出的 BGP 邻居组窗口中,配置远程 AS(此例中 Hub 和所有的 Spoke 之间为 IBGP 邻居),开启路由反射器和软重配。点击确认按钮下发 BGP 邻居组配置。

Spoke 邻居组选择上步创建的 BGP 邻居组,点击下一步。

查看即将创建的配置内容,点击完成按钮。

检查对象摘要中的配置是否全部下发成功。然后点击下方的“生成简易配置密钥”按钮,在右侧弹出的窗口中,添加 WAN1(port2)线路 IPSec 隧道对应的三个 Spoke 的 Tunnel 接口 IP。然后点击“生成简易配置密钥”按钮,将生成的 3 个 Spoke 简易配置密钥复制出来并保存。

配置 WAN2(port3)接口上的 IPSec 拨号连接,流入接口选择 WAN2(port3),配置认证方法,这里以预共享密钥为例,填入预共享密钥,点击下一步。

配置 Hub 端 WAN2(port3)上的 IPSec Tunnel IP,用于 BGP 邻居建立,配置“远程 IP 地址/掩码”为一个 24 位网络地址(根据 Spoke 的数量判断掩码位数),点击下一步。

配置 BGP 路由的本地 AS 号(此例中 Hub 和所有的 Spoke 之间为 IBGP 邻居),Hub 端内网接口与网段(用于自动创建安全策略和 BGP 路由发布),Spoke type 选择“范围”,填写 Spoke prefix 范围为 WAN1 线路 IPSec 对应的 Spoke Tunnel 接口 IP 的范围子网,点击 Spoke 邻居组中的新建按钮。
重要
Spoke type 推荐使用“范围”模式,并结合 BGP 邻居范围和 BGP 邻居组使用,否则如果 Spoke 较多,每个 Spoke 配置一个 BGP 邻居将是一个巨大的工作量。

在弹出的 BGP 邻居组窗口中,配置远程 AS(此例中 Hub 和所有的 Spoke 之间为 IBGP 邻居),开启路由反射器和软重配。点击确认按钮下发 BGP 邻居组配置。

Spoke 邻居组选择上步创建的 BGP 邻居组,点击下一步。

查看即将创建的配置内容,点击完成按钮。

检查对象摘要中的配置是否全部下发成功。然后点击下方的“生成简易配置密钥”按钮,在右侧弹出的窗口中,添加 WAN1(port2)线路 IPSec 隧道对应的三个 Spoke 的 Tunnel 接口 IP。然后点击“生成简易配置密钥”按钮,将生成的 3 个 Spoke 简易配置密钥复制出来并保存。

查看 IPSec 向导下发的 IPSec 配置,以及 IPSec Tunnel 接口配置。注意要在 IPSec 一阶段中增加下步中的配置。
config vpn ipsec phase1-interface edit "Hub_WAN1" set type dynamic set interface "port2" set peertype any set net-device disable set proposal aes128-sha256 aes256-sha256 aes128-sha1 aes256-sha1 set add-route disable set dpd on-idle set comments "VPN: Hub_WAN1 (Created by VPN wizard)" set wizard-type hub-fortigate-auto-discovery set auto-discovery-sender enable //确认开启了ADVPN sender// set psksecret ENC LRPVkrjrtBp5qTlA1Bo5E3M0Cr/79r/kqV7vZmqrNqckeTk2kJf2/W5Xi2lni2CPCfSukYx0CY9cyWwu6C2IuwxiK4chuJXZbuhYejUguiHmZE= next edit "Hub_WAN2" set type dynamic set interface "port3" set peertype any set net-device disable set proposal aes128-sha256 aes256-sha256 aes128-sha1 aes256-sha1 set add-route disable set dpd on-idle set comments "VPN: Hub_WAN2 (Created by VPN wizard)" set wizard-type hub-fortigate-auto-discovery set auto-discovery-sender enable //确认开启了ADVPN sender// set psksecret ENC g3UIj62MLpQkr791Zf+pujPQ2QqbzDnvcwLDmF5xr5apZLk8FDRs+YtDJGtJ5vnMEG6K2lEhluoO/M5gjGu5qjJatbTRvblp0FPBUQGW2X2eFY= next end config vpn ipsec phase2-interface edit "Hub_WAN1" set phase1name "Hub_WAN1" set proposal aes128-sha1 aes256-sha1 aes128-sha256 aes256-sha256 aes128gcm aes256gcm chacha20poly1305 set comments "VPN: Hub_WAN1 (Created by VPN wizard)" next edit "Hub_WAN2" set phase1name "Hub_WAN2" set proposal aes128-sha1 aes256-sha1 aes128-sha256 aes256-sha256 aes128gcm aes256gcm chacha20poly1305 set comments "VPN: Hub_WAN2 (Created by VPN wizard)" next end config system interface edit "Hub_WAN1" set vdom "root" set ip 100.1.1.254 255.255.255.255 set type tunnel set remote-ip 100.1.1.253 255.255.255.0 set interface "port2" next edit "Hub_WAN2" set vdom "root" set ip 200.1.1.254 255.255.255.255 set type tunnel set remote-ip 200.1.1.253 255.255.255.0 set interface "port3" next end需要在向导配置的基础上,将 IKEv1 主模式修改为 IKEv2,并在每个线路的 IPSec 上开启 network-overlay,配置不同的 network-id,WAN1 上的 IPSec 的 network-id 为 1,WAN2 上的 IPSec 的 network-id 为 2。
重要
使用 ADVPN 向导创建的 IPSec 为 IKEv1 主模式,Hub 双线路的情况下,Spoke 与 Spoke 在建立 Shortcut 时会出现问题(参考 VPN 技术 → IPSec VPN → 拨号 VPN → 野蛮模式/network-id 适用场景 → ADVPN 下的 network-id 或野蛮模式 ID的说明)。
config vpn ipsec phase1-interface edit "Hub_WAN1" set ike-version 2 //增加配置:将IKE版本修改为2// set network-overlay enable //增加配置:开启network-overlay// set network-id 1 //增加配置:第一条线路上的network-id为1// next edit "Hub_WAN2" set ike-version 2 //增加配置:将IKE版本修改为2// set network-overlay enable //增加配置:开启network-overlay// set network-id 2 //增加配置:配置第二条线路上的network-id为2// next end查看 IPSec 向导下发的地址、地址组和安全策略配置,包含放通 Hub 端 IPSec 隧道的入向流量、放通 IPSec 隧道的中转流量,可根据实际需求进行调整或新增(如 Hub 向 Spoke 主动发起的方向策略)。
重要
后续如果需要在 Hub 上配置 SD-WAN,安全策略配置需要删除,否则 IPSec Tunnel 接口无法加入 SD-WAN 区域。
config firewall address edit "Hub_WAN1_local_subnet_1" set allow-routing enable set subnet 10.10.254.0 255.255.255.0 next edit "Hub_WAN2_local_subnet_1" set allow-routing enable set subnet 10.10.254.0 255.255.255.0 next end config firewall addrgrp edit "Hub_WAN1_local" set member "Hub_WAN1_local_subnet_1" set comment "VPN: Hub_WAN1 (Created by VPN wizard)" set allow-routing enable next edit "Hub_WAN2_local" set member "Hub_WAN2_local_subnet_1" set comment "VPN: Hub_WAN2 (Created by VPN wizard)" set allow-routing enable next end config firewall policy edit 1 //放通了WAN1上IPSec隧道的入向流量// set name "vpn_Hub_WAN1_spoke2hub_0" set srcintf "Hub_WAN1" set dstintf "port4" set action accept set srcaddr "all" set dstaddr "Hub_WAN1_local" set schedule "always" set service "ALL" set comments "VPN: Hub_WAN1 (Created by VPN wizard)" next edit 2 //放通了WAN1上IPSec隧道的中转流量// set name "vpn_Hub_WAN1_spoke2spoke_0" set srcintf "Hub_WAN1" set dstintf "Hub_WAN1" set action accept set srcaddr "all" set dstaddr "all" set schedule "always" set service "ALL" set comments "VPN: Hub_WAN1 (Created by VPN wizard)" next edit 3 //放通了WAN2上IPSec隧道的入向流量// set name "vpn_Hub_WAN2_spoke2hub_0" set srcintf "Hub_WAN2" set dstintf "port4" set action accept set srcaddr "all" set dstaddr "Hub_WAN2_local" set schedule "always" set service "ALL" set comments "VPN: Hub_WAN2 (Created by VPN wizard)" next edit 4 //放通了WAN2上IPSec隧道的中转流量// set name "vpn_Hub_WAN2_spoke2spoke_0" set srcintf "Hub_WAN2" set dstintf "Hub_WAN2" set action accept set srcaddr "all" set dstaddr "all" set schedule "always" set service "ALL" set comments "VPN: Hub_WAN2 (Created by VPN wizard)" next end查看 IPSec 向导下发的 BGP 配置。
config router bgp set as 10086 config neighbor-group edit "BGP_NBR_GRP_WAN1" set soft-reconfiguration enable set remote-as 10086 set route-reflector-client enable next edit "BGP_NBR_GRP_WAN2" set soft-reconfiguration enable set remote-as 10086 set route-reflector-client enable next end config neighbor-range edit 1 set prefix 100.1.1.0 255.255.255.0 set neighbor-group "BGP_NBR_GRP_WAN1" next edit 2 set prefix 200.1.1.0 255.255.255.0 set neighbor-group "BGP_NBR_GRP_WAN2" next end config network edit 1 set prefix 10.10.254.0 255.255.255.0 next end end在 ADVPN 环境下,以上 BGP 配置还需要手动增加如下参数。
config router bgp set ibgp-multipath enable //必须配置,否则去往Spoke的路由无法负载// set additional-path enable //多线路ADVPN,Hub端必须配置,否则Spoke学到的路由可能不全// set additional-path-select 4 config neighbor-group edit "BGP_NBR_GRP_WAN1" set link-down-failover enable set additional-path send //多线路ADVPN,Hub端必须配置,否则Spoke学到的路由可能不全// set adv-additional-path 4 //配置从几条额外路径上去发送路由// set soft-reconfiguration enable next edit "BGP_NBR_GRP_WAN2" set link-down-failover enable set additional-path send //多线路ADVPN,Hub端必须配置,否则Spoke学到的路由可能不全// set adv-additional-path 4 //配置从几条额外路径上去发送路由// set soft-reconfiguration enable next end end
Spoke
Hub 端通过向导配置 ADVPN 后,在 Spoke 端的配置就轻松很多。准备好在 Hub 端复制出的 Spoke 简易配置密钥。
在 Spoke1 FortiGate 上进入 VPN → IPSec 隧道页面,新建 WAN1(port2)上的 IPSec 隧道,选择“Hub-and-Spoke”模式,角色选择 Spoke,将 Spoke1 WAN1 的 IPSec 隧道对应的简易配置密钥粘贴进去,然后点击右侧的应用按钮,会弹出提示“配置已应用”,然后点击下一步。

Spoke1 自动将 Hub 端 WAN1(port2)的 IP 地址填入,配置流出接口为 WAN1(port2),配置预共享密钥,点击下一步。

Spoke1 自动配置了 WAN1(port2)线路 IPSec Tunnel 口的地址(在 Hub 端向导中的配置),远程 IP 地址/掩码为 Hub 端 WAN1 线路 IPSec Tunnel 接口地址。点击下一步。

配置 BGP 本地 AS(此例中 Hub 和所有的 Spoke 之间为 IBGP 邻居),配置本地接口和本地子网(用于自动创建安全策略和 BGP 路由发布)。点击下一步。

查看即将下发的相关配置,点击完成按钮。

检查相关配置均下发成功后,点击“添加另一个”按钮。

新建 WAN2(port3)上的 IPSec 隧道,选择“Hub-and-Spoke”模式,角色选择 Spoke,将 Spoke1 WAN2 的 IPSec 隧道对应的简易配置密钥粘贴进去,然后点击右侧的应用按钮,会弹出提示“配置已应用”,然后点击下一步。

Spoke1 自动将 Hub 端 WAN2(port3)的 IP 地址填入,配置流出接口为 WAN2(port3),配置预共享密钥,点击下一步。

Spoke1 自动配置了 WAN2(port3)线路 IPSec Tunnel 口的地址(在 Hub 端向导中的配置),远程 IP 地址/掩码为 Hub 端 WAN2 线路 IPSec Tunnel 接口地址。点击下一步。

配置 BGP 本地 AS(此例中 Hub 和所有的 Spoke 之间为 IBGP 邻居),配置本地接口和本地子网(用于自动创建安全策略和 BGP 路由发布)。点击下一步。

查看即将下发的相关配置,点击完成按钮。

检查相关配置均下发成功。

在 Spoke1 上查看向导下发的 IPSec 配置以及 IPSec Tunnel 接口配置。注意要在 IPSec 一阶段中增加下步中的配置。
config vpn ipsec phase1-interface edit "Spoke1_WAN1" set interface "port2" set peertype any set net-device enable //确保Spoke的net-device开启,否则使用SD-WAN时,Shortcut的健康检查无法正常工作// set proposal aes128-sha256 aes256-sha256 aes128-sha1 aes256-sha1 set add-route disable set dpd on-idle set comments "VPN: Spoke1_WAN1 (Created by VPN wizard)" set wizard-type spoke-fortigate-auto-discovery set auto-discovery-receiver enable //确认开启了ADVPN receiver// set remote-gw 101.103.254.2 set psksecret ENC jZJjdqGe4N3alz21hgoMkyE1t5HDNMSanAQpDEtCwitgjX2hvApP24ZC3axQP4f9qdqT/oeVmj/5bWBXt1drV/rrwPOHteGqFhMmDuRGpHK7qA= next edit "Spoke1_WAN2" set interface "port3" set peertype any set net-device enable //确保Spoke的net-device开启,否则使用SD-WAN时,Shortcut的健康检查无法正常工作// set proposal aes128-sha256 aes256-sha256 aes128-sha1 aes256-sha1 set add-route disable set dpd on-idle set comments "VPN: Spoke1_WAN2 (Created by VPN wizard)" set wizard-type spoke-fortigate-auto-discovery set auto-discovery-receiver enable //确认开启了ADVPN receiver// set remote-gw 202.103.254.2 set psksecret ENC uH/eLzEpwUxUfKKcFdZYZ9q/bNsDSKCal2iF7LuF978SppZrpdHQi2BpWdTcSlQaDWZ6QaeyeXn+8crQLCavpKv7fa9XhyI+U/OLf7J0LSHc/n= next end config vpn ipsec phase2-interface edit "Spoke1_WAN1" set phase1name "Spoke1_WAN1" set proposal aes128-sha1 aes256-sha1 aes128-sha256 aes256-sha256 aes128gcm aes256gcm chacha20poly1305 set comments "VPN: Spoke1_WAN1 (Created by VPN wizard)" next edit "Spoke1_WAN2" set phase1name "Spoke1_WAN2" set proposal aes128-sha1 aes256-sha1 aes128-sha256 aes256-sha256 aes128gcm aes256gcm chacha20poly1305 set comments "VPN: Spoke1_WAN2 (Created by VPN wizard)" next end config system interface edit "Spoke1_WAN1" set vdom "root" set ip 100.1.1.1 255.255.255.255 set type tunnel set remote-ip 100.1.1.254 255.255.255.0 set interface "port2" next edit "Spoke1_WAN2" set vdom "root" set ip 200.1.1.1 255.255.255.255 set type tunnel set remote-ip 200.1.1.254 255.255.255.0 set interface "port3" next end需要在向导配置的基础上,将 IKEv1 主模式修改为 IKEv2,并在每个线路的 IPSec 上开启 network-overlay,配置不同的 network-id,WAN1 上的 IPSec 的 network-id 为 1,WAN2 上的 IPSec 的 network-id 为 2。
重要
使用 ADVPN 向导创建的 IPSec 为 IKEv1 主模式,Hub 双线路的情况下,Spoke 与 Spoke 在建立 Shortcut 时会出现问题(参考 VPN 技术 → IPSec VPN → 拨号 VPN → 野蛮模式/network-id 适用场景 → ADVPN 下的 network-id 或野蛮模式 ID的说明)。
config vpn ipsec phase1-interface edit "Spoke1_WAN1" set ike-version 2 //增加配置:将IKE版本修改为2// set network-overlay enable //增加配置:开启network-overlay// set network-id 1 //增加配置:第一条线路上的network-id为1// next edit "Spoke1_WAN2" set ike-version 2 //增加配置:将IKE版本修改为2// set network-overlay enable //增加配置:开启network-overlay// set network-id 2 //增加配置:第二条线路上的network-id为2// next end在 SD-WAN(配置了健康检查) + ADVPN 环境下,以上 IPSec Tunnel 接口还需要手动增加允许 Ping 的配置,用于 SD-WAN 在 Spoke 之间的 Shortcut 隧道自动创建的健康检查。
重要
SD-WAN 在 Shortcut 间自动创建的健康检查为 Ping 模式,即使配置的健去往 Hub 的健康检查为其他模式。
config system interface edit "Spoke1_WAN1" append allowaccess ping next edit "Spoke1_WAN2" append allowaccess ping next end查看 Spoke1 上 IPSec 向导下发的地址、地址组和安全策略配置,包含放通 Spoke IPSec 隧道的双向流量的策略。
重要
后续要在 Spoke 配置 SD-WAN,这些安全策略配置需要删除,否则 IPSec 接口无法加入 SD-WAN 区域。
config firewall address edit "Spoke1_WAN1_local_subnet_1" set allow-routing enable set subnet 10.10.1.0 255.255.255.0 next edit "Spoke1_WAN2_local_subnet_1" set allow-routing enable set subnet 10.10.1.0 255.255.255.0 next end config firewall addrgrp edit "Spoke1_WAN1_local" set member "Spoke1_WAN1_local_subnet_1" set comment "VPN: Spoke1_WAN1 (Created by VPN wizard)" set allow-routing enable next edit "Spoke1_WAN2_local" set member "Spoke1_WAN2_local_subnet_1" set comment "VPN: Spoke1_WAN2 (Created by VPN wizard)" set allow-routing enable next end config firewall policy edit 1 set name "vpn_Spoke1_WAN1_remote_0" set srcintf "Spoke1_WAN1" set dstintf "port4" set action accept set srcaddr "all" set dstaddr "Spoke1_WAN1_local" set schedule "always" set service "ALL" set comments "VPN: Spoke1_WAN1 (Created by VPN wizard)" next edit 2 set name "vpn_Spoke1_WAN1_local_0" set srcintf "port4" set dstintf "Spoke1_WAN1" set action accept set srcaddr "all" set dstaddr "all" set schedule "always" set service "ALL" set comments "VPN: Spoke1_WAN1 (Created by VPN wizard)" next edit 3 set name "vpn_Spoke1_WAN2_remote_0" set srcintf "Spoke1_WAN2" set dstintf "port4" set action accept set srcaddr "all" set dstaddr "Spoke1_WAN2_local" set schedule "always" set service "ALL" set comments "VPN: Spoke1_WAN2 (Created by VPN wizard)" next edit 4 set name "vpn_Spoke1_WAN2_local_0" set srcintf "port4" set dstintf "Spoke1_WAN2" set action accept set srcaddr "all" set dstaddr "all" set schedule "always" set service "ALL" set comments "VPN: Spoke1_WAN2 (Created by VPN wizard)" next end查看 Spoke1 上 IPSec 向导下发的 BGP 配置。
config router bgp set as 10086 config neighbor edit "100.1.1.254" set remote-as 10086 next edit "200.1.1.254" set remote-as 10086 next end config network edit 1 set prefix 10.10.1.0 255.255.255.0 next end end在 ADVPN 环境下,以上 BGP 配置还需要手动增加如下参数。
config router bgp set ibgp-multipath enable //必须配置,否则去往Hub或其他Spoke的路由无法负载// config neighbor edit "100.1.1.254" set additional-path receive //多线路ADVPN,Spoke端必须配置,否则Spoke学到的路由可能不全// set soft-reconfiguration enable next edit "200.1.1.254" set additional-path receive //多线路ADVPN,Spoke端必须配置,否则Spoke学到的路由可能不全// set soft-reconfiguration enable next end endSpoke2 与 Spoke3 的配置参考 Spoke1,这里就不再赘述(注意 Spoke3 只有一条 Internet 线路,与 Hub 的两条线路建立 IPSec)。
SD-WAN 基础配置
Spoke
在 Spoke1 上删除 IPSec 向导自动创建的安全策略(否则 IPSec 接口无法加入 SD-WAN 区域)。
进入分支 FortiGate 的网络 → SD-WAN → SD-WAN 区域页面,新建用于 ADVPN 访问的区域“Spoke1_ADVPN”。


config system sdwan set status enable config zone edit "Spoke1_ADVPN" next end end新建用于访问 Hub 内网和其他 Spoke 的 SD-WAN 成员(两个 IPSec Tunnel 接口)加入步骤 2 创建的 SD-WAN 区域“Spoke1_ADVPN”。注意 IPSec Tunnel 接口加入 SD-WAN 区域时不需要填写网关。
重要
如果 IPSec 口存在相关配置引用的情况下,是无法直接加入到 SD-WAN 接口成员的,可参考 网络管理 → SD-WAN → SD-WAN 配置举例 → 将已关联接口移至 SD-WAN 区域章节快速将接口加入 SD-WAN 区域,并自动修改关联配置(也可选择手动将 WAN 接口的相关配置删除引用,包括策略、Link-monitor、所属区域等)。



config system sdwan config members edit 1 set interface "Spoke1_WAN1" set zone "Spoke1_ADVPN" next edit 2 set interface "Spoke1_WAN2" set zone "Spoke1_ADVPN" next end end配置防火墙策略 1,放通内网 port4(LAN)到 SD-WAN ADVPN 区域的流量,通常情况下内网之间的 VPN 访问不需要开启 SNAT。根据需求开启 UTM 功能。

config firewall policy edit 1 set name "to_Spoke1_ADVPN" set srcintf "port4" set dstintf "Spoke1_ADVPN" set action accept set srcaddr "Spoke1_WAN1_local_subnet_1" set dstaddr "all" set schedule "always" set service "ALL" next end右键点击防火墙策略 1,选择反向复制,生成策略 2。放通 SD-WAN ADVPN 区域到内网 port4(LAN)的流量,通常情况下内网之间的 VPN 访问不需要开启 SNAT。根据需求开启 UTM 功能。反向复制的策略名称为空,且为禁用状态,需要手动设置策略名称,然后手动启用该策略。


config firewall policy edit 2 set name "from_Spoke1_ADVPN" set srcintf "Spoke1_ADVPN" set dstintf "port4" set action accept set srcaddr "all" set dstaddr "Spoke1_WAN1_local_subnet_1" set schedule "always" set service "ALL" set comments " (Copy of to_Spoke1_ADVPN) (Reverse of to_Spoke1_ADVPN)" next end
Spoke2 和 Spoke3 的配置参考 Spoke1,这里就不再赘述。
Hub
重要
Hub 可以不配置 SD-WAN。如果不配置 SD-WAN 选路,可以通过静态路由不同的优先级进行选路。这里我们以 Hub 端配置 SD-WAN 为例。
删除 IPSec 向导生成的所有安全策略(否则 IPSec 接口无法加入 SD-WAN 区域)。
在 Hub 上新建 SD-WAN 区域“Hub_ADVPN”与 SD-WAN 成员(包含 WAN1 和 WAN2 上的 IPSec 拨号连接),将两个 IPSec 接口加入 SD-WAN 区域。
重要
如果 IPSec 口存在相关配置引用的情况下,是无法直接加入到 SD-WAN 接口成员的,可参考 网络管理 → SD-WAN → SD-WAN 配置举例 → 将已关联接口移至 SD-WAN 区域章节快速将接口加入 SD-WAN 区域,并自动修改关联配置(也可选择手动将 WAN 接口的相关配置删除引用,包括策略、Link-monitor、所属区域等)。

config system sdwan set status enable config zone edit "Hub_ADVPN" next end config members edit 1 set interface "Hub_WAN1" set zone "Hub_ADVPN" next edit 2 set interface "Hub_WAN2" set zone "Hub_ADVPN" next end end配置防火墙策略 1 和防火墙策略 2,放通内网 port4(LAN)与所有 Spoke 内网之间互相访问的流量,通常情况下内网之间的 VPN 访问不需要开启 SNAT。根据需求开启 UTM 功能。

config firewall policy edit 1 set name "to_Hub_ADVPN" set srcintf "port4" set dstintf "Hub_ADVPN" set action accept set srcaddr "Hub_WAN1_local_subnet_1" set dstaddr "all" set schedule "always" set service "ALL" next edit 2 set name "from_Hub_ADVPN" set srcintf "Hub_ADVPN" set dstintf "port4" set action accept set srcaddr "all" set dstaddr "Hub_WAN1_local_subnet_1" set schedule "always" set service "ALL" set comments " (Copy of to_Hub_ADVPN) (Reverse of to_Hub_ADVPN)" next end配置防火墙策略 3,放通通过 Hub 中转的 Spoke 之间的流量。通常情况下 VPN 之间的 VPN 访问不需要开启 SNAT。根据需求开启 UTM 功能。

config firewall policy edit 3 set name "Spoke_to_Spoke" set srcintf "Hub_ADVPN" set dstintf "Hub_ADVPN" set action accept set srcaddr "Spoke1_10.10.1.0/24" "Spoke2_10.10.2.0/24" "Spoke3_10.10.3.0/24" set dstaddr "Spoke1_10.10.1.0/24" "Spoke2_10.10.2.0/24" "Spoke3_10.10.3.0/24" set schedule "always" set service "ALL" next end
状态检查
查看 Hub 端 IPSec 隧道的建立状态,所有 Spoke 的线路与 Hub 的两条线路的 IPSec 建立成功(3 个 Spoke 共 6 条隧道)。

Hub # get vpn ipsec tunnel summary 'Hub_WAN1_0' 101.103.2.2:0 selectors(total,up): 1/1 rx(pkt,err): 84/0 tx(pkt,err): 83/0 'Hub_WAN1_1' 101.103.3.2:0 selectors(total,up): 1/1 rx(pkt,err): 20/0 tx(pkt,err): 27/0 'Hub_WAN1_2' 101.103.1.2:0 selectors(total,up): 1/1 rx(pkt,err): 84/0 tx(pkt,err): 83/0 'Hub_WAN2_0' 202.103.2.2:0 selectors(total,up): 1/1 rx(pkt,err): 84/0 tx(pkt,err): 83/1 'Hub_WAN2_1' 202.103.1.2:0 selectors(total,up): 1/1 rx(pkt,err): 84/0 tx(pkt,err): 83/1 'Hub_WAN2_2' 101.103.3.2:0 selectors(total,up): 1/1 rx(pkt,err): 20/0 tx(pkt,err): 27/0查看 Hub 端 FortiGate 路由表中的 BGP 路由,Hub 去往每个 Spoke 的路由在两条线路的 IPSec 隧道上负载。
Hub # get router info routing-table bgp Routing table for VRF=0 B 10.10.1.0/24 [200/0] via 100.1.1.1 (recursive is directly connected, Hub_WAN1), 00:28:29, [1/0] [200/0] via 200.1.1.1 (recursive is directly connected, Hub_WAN2), 00:28:29, [1/0] B 10.10.2.0/24 [200/0] via 100.1.1.2 (recursive is directly connected, Hub_WAN1), 00:28:32, [1/0] [200/0] via 200.1.1.2 (recursive is directly connected, Hub_WAN2), 00:28:32, [1/0] B 10.10.3.0/24 [200/0] via 100.1.1.3 (recursive is directly connected, Hub_WAN1), 00:05:24, [1/0] [200/0] via 200.1.1.3 (recursive is directly connected, Hub_WAN2), 00:05:24, [1/0]查看 Spoke1 FortiGate 路由表中的 BGP 路由:
- 去往 Hub 内网的路由在两个线路的 IPSec 隧道上负载;
- 去往其他 Spoke 内网的路由通过 Hub 端的 BGP 路由反射器反射后学习,通过两个 IPSec 隧道负载,出接口为去往 Hub 的 IPSec 隧道接口(由于 Hub 和 Spoke 开启了 BGP additional-path send/receive,且 Hub 端 BGP 在两个 IPSec 隧道上都开启了路由反射,Spoke1 每条隧道学习另一个 Spoke 内网的路由会有 2 条相同的路由)。
Spoke1 # get router info routing-table bgp Routing table for VRF=0 B 10.10.2.0/24 [200/0] via 100.1.1.2 [2] (recursive via Spoke1_WAN1 tunnel 101.103.254.2), 00:29:51, [1/0] [200/0] via 200.1.1.2 [2] (recursive via Spoke1_WAN2 tunnel 202.103.254.2), 00:29:51, [1/0] B 10.10.3.0/24 [200/0] via 100.1.1.3 [2] (recursive via Spoke1_WAN1 tunnel 101.103.254.2), 00:06:55, [1/0] [200/0] via 200.1.1.3 [2] (recursive via Spoke1_WAN2 tunnel 202.103.254.2), 00:06:55, [1/0] B 10.10.254.0/24 [200/0] via 100.1.1.254 (recursive via Spoke1_WAN1 tunnel 101.103.254.2), 00:30:21, [1/0] [200/0] via 200.1.1.254 (recursive via Spoke1_WAN2 tunnel 202.103.254.2), 00:30:21, [1/0]Spoke2、Spoke3 的路由表与 Spoke1 类似,这里不再赘述。
SD-WAN 策略配置
Spoke
需求 1:Spoke 去往 Hub 内网的流量优先从 WAN1(port2)的 IPSec 隧道转发,WAN1 的 IPSec 隧道中断或不满足 SLA 标准后,从 WAN2(port3)的 IPSec 隧道转发。
在 Spoke1 的 SD-WAN 中配置探测 Hub 端内网服务器的健康检查:
- 成员选择 WAN1 的 IPSec Tunnel 接口和 WAN2 的 IPSec Tunnel 接口。
- 探测模式为 Ping。
- 开启 SLA 目标:延迟 < 250ms/抖动 < 50ms/丢包率 < 5%。

config system sdwan config health-check edit "HC_to_Hub_Ping" set server "10.10.254.100" set interval 1000 set recoverytime 10 set members 0 config sla edit 1 set latency-threshold 250 set jitter-threshold 50 set packetloss-threshold 5 next end next end end查看健康检查的状态,可以看到目前 2 条去往 Hub 内网的线路都满足 SLA 标准。

Spoke1 # diagnose sys sdwan health-check status HC_to_Hub_Ping Health Check(HC_to_Hub_Ping): Seq(1 Spoke1_WAN1): state(alive), packet-loss(0.000%) latency(48.060), jitter(20.974), mos(4.356), bandwidth-up(65535000), bandwidth-dw(65535000), bandwidth-bi(131070000) sla_map=0x1 Seq(2 Spoke1_WAN2): state(alive), packet-loss(0.000%) latency(106.973), jitter(30.848), mos(4.268), bandwidth-up(65535000), bandwidth-dw(65535000), bandwidth-bi(131070000) sla_map=0x1新建 SD-WAN 规则 1,用于 Spoke 内网去往 Hub 内网的流量:

- 源地址选择 Spoke1 内网网段;目标地址为 Hub 内网网段。
- 接口选择策略:选择 Lowest Cost (SLA),Spoke 内部访问 Hub 内网的流量优先从满足 SLA 标准(延迟 < 250ms/抖动 < 50ms/丢包率 < 5%)的线路转发。如果 2 条线路都满足 SLA 标准,则优先从接口偏好中靠前的接口转发。
- 接口偏好:选择 WAN1 线路 IPSec 接口与 WAN2 线路 IPSec 接口。WAN1 线路 IPSec 接口排序在前,其次是 WAN2 线路 IPSec 接口。
- 需要的 SLA 目标:选择上步创建的 SLA 目标(延迟 < 250ms/抖动 < 50ms/丢包率 < 5%)。

config system sdwan config service edit 1 set name "to_Hub" set mode sla set dst "Hub_10.10.254.0/24" set src "Spoke1_WAN1_local_subnet_1" config sla edit "HC_to_Hub_Ping" set id 1 next end set priority-members 1 2 next end end查看上步创建的 SD-WAN 规则目前的选路状态,由于目前 2 条去往 Hub 内网的线路均满足 SLA 目标,所以选择接口偏好配置中靠前的 WAN1 上的 IPSec 线路。

Spoke1 # diagnose sys sdwan service 1 Service(1): Address Mode(IPV4) flags=0x200 use-shortcut-sla Tie break: cfg Gen(1), TOS(0x0/0x0), Protocol(0: 1->65535), Mode(sla), sla-compare-order Members(2): 1: Seq_num(1 Spoke1_WAN1), alive, sla(0x1), gid(0), cfg_order(0), local cost(0), selected //优先从WAN1上的IPSec隧道转发// 2: Seq_num(2 Spoke1_WAN2), alive, sla(0x1), gid(0), cfg_order(1), local cost(0), selected Src address(1): 10.10.1.0-10.10.1.255 Dst address(1): 10.10.254.0-10.10.254.255查看 SD-WAN 规则对应的策略路由状态,出接口优先选择 MPLS 线路接口(port4)。
Spoke1 # diagnose firewall proute list list route policy info(vf=root): id=2130837505(0x7f020001) vwl_service=1(to_Hub) vwl_mbr_seq=1 2 dscp_tag=0xfc 0xfc flags=0x0 tos=0x00 tos_mask=0x00 protocol=0 sport=0-65535 iif=0(any) dport=1-65535 path(2) oif=17(Spoke1_WAN1) oif=18(Spoke1_WAN2) //优先从WAN1上的IPSec隧道转发// source(1): 10.10.1.0-10.10.1.255 destination(1): 10.10.254.0-10.10.254.255 hit_count=0 last_used=2023-12-26 15:03:45Spoke2 与 Spoke3 的配置请参考 Spoke1,这里不再赘述。
需求 2:Spoke 内网访问其他 Spoke 内网的流量优先从 Shortcut 隧道转发。Shortcut 隧道无法建立时,通过 Hub 中转。
新建 SD-WAN 规则 2:
- 源地址选择 Spoke1 内网网段;目标地址为 all(或其他 Spoke 内网的网段集合)。
- 接口选择策略:选择 Lowest Cost (SLA),Spoke 内部访问 Internet 的流量优先从满足 SLA 标准(延迟 < 250ms/抖动 < 50ms/丢包率 < 5%)的 IPSec 线路创建的 Shortcut 隧道转发(如果 Shortcut 无法建立,则通过去往 Hub 的 IPSec 隧道转发)。如果两条 IPSec 线路都满足 SLA 标准,则优先从接口偏好中靠前的 IPSec 隧道创建的 Shortcut 转发(如果 Shortcut 无法建立,则通过去往 Hub 的 IPSec 隧道转发)。
- 接口偏好:选择 WAN1 线路 IPSec 接口与 WAN2 线路 IPSec 接口。WAN1 线路 IPSec 接口排序在前,其次是 WAN2 线路 IPSec 接口。
- 需要 SLA 目标:选择上步创建的 SLA 目标(延迟 < 250ms/抖动 < 50ms/丢包率 < 5%)。

config system sdwan config service edit 2 set name "to_Other_Spoke" set mode sla set dst "all" set src "Spoke1_WAN1_local_subnet_1" config sla edit "HC_to_Hub_Ping" set id 1 next end set priority-members 1 2 next end end查看上步创建的 SD-WAN 规则目前的选路状态,由于目前两条 IPSec 线路均满足 SLA 目标,所以选择接口偏好配置中靠前的 Spoke1_WAN1 隧道。

Spoke1 # diagnose sys sdwan service 2 Service(2): Address Mode(IPV4) flags=0x200 use-shortcut-sla Tie break: cfg Gen(1), TOS(0x0/0x0), Protocol(0: 1->65535), Mode(sla), sla-compare-order Members(2): 1: Seq_num(1 Spoke1_WAN1), alive, sla(0x1), gid(0), cfg_order(0), local cost(0), selected //优先从WAN1上的IPSec隧道转发// 2: Seq_num(2 Spoke1_WAN2), alive, sla(0x1), gid(0), cfg_order(1), local cost(0), selected Src address(1): 10.10.1.0-10.10.1.255 Dst address(1): 0.0.0.0-255.255.255.255Spoke2 与 Spoke3 的配置请参考 Spoke1,这里不再赘述。
Hub
需求 3:Hub 内网主动访问 Spoke 内网的流量强制从 WAN1 的 IPSec 线路转发,当 WAN1 的 IPSec 线路中断时,从 WAN2 的 IPSec 线路转发。
新建 SD-WAN 规则 1(可根据需求使用其他模式):
- 源地址选择 Hub 内网网段;目标地址为 Spoke1 内网网段。
- 接口选择策略:选择 Manual,Hub 内网访问 Spoke1 的流量优先从 WAN1 的 IPSec 线路转发,当 WAN1 的 IPSec 线路中断时,从 WAN2 的 IPSec 线路转发。
- 接口偏好:选择 WAN1 线路 IPSec 接口与 WAN2 线路 IPSec 接口。WAN1 线路 IPSec 接口排序在前,其次是 WAN2 线路 IPSec 接口。

config system sdwan config service edit 1 set name "to_Spoke1" set dst "Spoke1_10.10.1.0/24" set src "Hub_WAN1_local_subnet_1" set priority-members 1 2 next end end查看上步创建的 SD-WAN 规则目前的选路状态,选择接口偏好配置中靠前的 Spoke1_WAN1 隧道。

Hub # diagnose sys sdwan service 1 Service(1): Address Mode(IPV4) flags=0x200 use-shortcut-sla Tie break: cfg Gen(1), TOS(0x0/0x0), Protocol(0: 1->65535), Mode(manual) Members(2): 1: Seq_num(1 Hub_WAN1), alive, selected //Hub访问Spoke1的流量优先从WAN1的IPSec隧道转发// 2: Seq_num(2 Hub_WAN2), alive, selected Src address(1): 10.10.254.0-10.10.254.255 Dst address(1): 10.10.1.0-10.10.1.255去往 Spoke2 和 Spoke3 的 SD-WAN 规则可参考步骤 1,这里不再赘述。
需求 4:当 Spoke 内网之间的 Shortcut 隧道无法建立,或 Shortcut 还未建立 Spoke 内网之间第一次进行访问时,流量要通过 Hub 进行中转。Hub 中转这类流量时,需要保证流入 IPSec 隧道和流出 IPSec 隧道为同一个隧道。
通过 CLI 新建 SD-WAN 规则 2:
- 源地址(src)选择和目标地址(dst)都选择所有 Spoke 的内网网段地址。
- 接口选择策略(mode):使用 Manual。
- 接口偏好(priority-members):选择 WAN1 的 IPSec 隧道和 WAN2 的 IPSec 隧道。
- tie-break:选择 input-device 方式,根据入接口来决定 SD-WAN 策略转发时使用相同的接口作为出接口,接口偏好中配置的接口顺序不会生效(该选项需要 7.2.1 及以上版本支持,如低于 7.2.1 版本,请使用策略路由实现此需求)。
config system sdwan config service edit 2 set name "Spoke_to_Spoke" set mode manual set dst "Spoke1_10.10.1.0/24" "Spoke2_10.10.2.0/24" "Spoke3_10.10.3.0/24" set src "Spoke1_10.10.1.0/24" "Spoke2_10.10.2.0/24" "Spoke3_10.10.3.0/24" set priority-members 1 2 set tie-break input-device //重要配置// next end end查看上步创建的 SD-WAN 规则目前的状态,Tie break 模式为 input-device,下方的 Member 顺序不会生效。
Hub # diagnose sys sdwan service 2 Service(2): Address Mode(IPV4) flags=0x200 use-shortcut-sla Tie break: input-device //tie-break模式为input-device时,下方的Member顺序不会生效// Gen(1), TOS(0x0/0x0), Protocol(0: 1->65535), Mode(manual) Members(2): 1: Seq_num(1 Hub_WAN1), alive, selected 2: Seq_num(2 Hub_WAN2), alive, selected Src address(3): 10.10.3.0-10.10.3.255 10.10.2.0-10.10.2.255 10.10.1.0-10.10.1.255 Dst address(3): 10.10.3.0-10.10.3.255 10.10.2.0-10.10.2.255 10.10.1.0-10.10.1.255
结果验证
Spoke 访问 Hub
使用 Spoke1 内网 PC 客户端访问 Hub 端的内网业务,流量可以正确从 WAN1 上的 IPSec 隧道转发。

模拟 Spoke1 WAN1 上 IPSec 隧道的健康检查的延迟增加到 300ms。

Spoke1 # diagnose sys sdwan health-check status HC_to_Hub_Ping Health Check(HC_to_Hub_Ping): Seq(1 Spoke1_WAN1): state(alive), packet-loss(0.000%) latency(303.576), jitter(19.449), mos(3.595), bandwidth-up(65535000), bandwidth-dw(65535000), bandwidth-bi(131070000) sla_map=0x0 Seq(2 Spoke1_WAN2): state(alive), packet-loss(0.000%) latency(103.569), jitter(34.299), mos(4.258), bandwidth-up(65535000), bandwidth-dw(65535000), bandwidth-bi(131070000) sla_map=0x1在 Spoke1 上查看 SD-WAN 规则 1 的选路优先选择联通线路 IPSec 接口去往 Hub 内网。

Spoke1 # diagnose sys sdwan service 1 Service(1): Address Mode(IPV4) flags=0x200 use-shortcut-sla Tie break: cfg Gen(2), TOS(0x0/0x0), Protocol(0: 1->65535), Mode(sla), sla-compare-order Members(2): 1: Seq_num(2 Spoke1_WAN2), alive, sla(0x1), gid(0), cfg_order(1), local cost(0), selected //去往Hub内网的流量优先从WAN2的IPSec隧道转发// 2: Seq_num(1 Spoke1_WAN1), alive, sla(0x0), gid(0), cfg_order(0), local cost(0), selected Src address(1): 10.10.1.0-10.10.1.255 Dst address(1): 10.10.254.0-10.10.254.255对应的 SD-WAN 线路切换系统日志。

date=2023-12-26 time=16:17:30 eventtime=1703578649518771555 tz="+0800" logid="0113022923" type="event" subtype="sdwan" level="notice" vd="root" logdesc="SDWAN status" eventtype="Service" serviceid=1 service="to_Hub" seq="2,1" msg="Service prioritized by SLA will be redirected in sequence order."再次使用 Spoke1 内网 PC 客户端访问 Hub 端内网的业务,流量开始从 WAN2 的 IPSec 接口转发。

Spoke2、Spoke3 内网访问 Hub 内网的测试参考 Spoke1,这里不再赘述。
Spoke 访问 Spoke
Spoke 与 Spoke 之间互访流量会触发 Shortcut 隧道的建立(前提是需要 Hub 开启 BGP RR,在 Spoke 之间反射路由,且 Hub 开启 ADVPN sender,Spoke 开启 ADVPN receiver),在创建 Shortcut 隧道之前,第一次 Spoke 访问其他 Spoke 的流量会经过 Hub 进行中转,同时通过 Hub 进行相关 Shortcut 信息专递。Shortcut 隧道建立后,Spoke 与 Spoke 之间直接通过 Shortcut 隧道通信。
保留之前线路的延迟状态(Spoke 访问 Hub 时应优先从 WAN2 的 IPSec 转发),查看 Spoke1 的隧道建立状态,只有去往 Hub 的 IPSec 隧道,没有去往其他 Spoke 的 Shortcut 隧道。
Spoke1 # get vpn ipsec tunnel summary 'Spoke1_WAN2' 202.103.254.2:0 selectors(total,up): 1/1 rx(pkt,err): 8423/0 tx(pkt,err): 8408/11 'Spoke1_WAN1' 101.103.254.2:0 selectors(total,up): 1/1 rx(pkt,err): 9284/0 tx(pkt,err): 9193/11使用 Spoke1 内网 PC 访问 Spoke2 内网 PC,触发 Shortcut 隧道建立,可以看到 Shortcut 隧道已经建立,名称为“Spoke1_WAN2_0”,通过 WAN2 上的 IPSec 隧道建立。
Spoke1 # get vpn ipsec tunnel summary 'Spoke1_WAN2' 202.103.254.2:0 selectors(total,up): 1/1 rx(pkt,err): 8825/0 tx(pkt,err): 8810/13 'Spoke1_WAN2_0' 202.103.2.2:0 selectors(total,up): 1/0 rx(pkt,err): 0/0 tx(pkt,err): 0/2 'Spoke1_WAN1' 101.103.254.2:0 selectors(total,up): 1/1 rx(pkt,err): 9686/0 tx(pkt,err): 9595/11
date=2023-12-26 time=17:08:55 eventtime=1703581736206155498 tz="+0800" logid="0101037122" type="event" subtype="vpn" level="notice" vd="root" logdesc="Negotiate IPsec phase 2" msg="negotiate IPsec phase 2" action="negotiate" remip=202.103.2.2 locip=202.103.1.2 remport=500 locport=500 outintf="port3" cookies="07fb4062cc0f70df/8341519d8c69969b" user="202.103.2.2" group="N/A" useralt="N/A" xauthuser="N/A" xauthgroup="N/A" assignip=N/A vpntunnel="Spoke1_WAN2_0" status="success" role="initiator" esptransform="ESP_AES" espauth="HMAC_SHA1" advpnsc=1在 Hub 上抓包查看 Spoke1 内网访问 Spoke2 内网第一次访问时的流量转发,可以看到在 Spoke1 和 Spoke2 之间的 Shortcut 建立前,流量是通过 Hub 中转的,Hub 中转时匹配 SD-WAN 规则 2,tie-break 的方式 input-device 生效,流量从 Hub_WAN2 进入,也从 Hub_WAN2 发出(不会按照 Manual 模式的 SD-WAN Member 顺序从 Hub_WAN1 发出)。
Hub # diagnose sniffer packet any 'host 10.10.1.100 and host 10.10.2.100' 4 Using Original Sniffing Mode interfaces=[any] filters=[host 10.10.1.100 and host 10.10.2.100] 23.920132 Hub_WAN2 in 10.10.1.100 -> 10.10.2.100: icmp: echo request 23.920239 Hub_WAN2 out 10.10.1.100 -> 10.10.2.100: icmp: echo request 23.922899 Hub_WAN2 in 10.10.2.100 -> 10.10.1.100: icmp: echo reply 23.922913 Hub_WAN2 out 10.10.2.100 -> 10.10.1.100: icmp: echo replyShortcut 隧道建立后,SD-WAN 会基于父隧道(Spoke1_WAN2)关联的 SLA 配置,自动创建健康检查检测 Spoke2 的 Tunnel 接口 IP,检测方式固定为 Ping(这也就是为什么要在所有 Spoke 的 IPSec Tunnel 接口上开启允许 Ping 访问)。

Spoke1 # diagnose sys sdwan health-check Health Check(HC_to_Hub_Ping): Seq(1 Spoke1_WAN1): state(alive), packet-loss(0.000%) latency(301.470), jitter(20.919), mos(3.591), bandwidth-up(65535000), bandwidth-dw(65535000), bandwidth-bi(131070000) sla_map=0x0 Seq(2 Spoke1_WAN2): state(alive), packet-loss(0.000%) latency(127.110), jitter(22.480), mos(4.259), bandwidth-up(65535000), bandwidth-dw(65535000), bandwidth-bi(131070000) sla_map=0x1 Seq(2 Spoke1_WAN2_0): state(alive), packet-loss(0.000%) latency(112.727), jitter(29.479), mos(4.260), bandwidth-up(65535000), bandwidth-dw(65535000), bandwidth-bi(131070000) sla_map=0x1查看 Spoke1 上的 BGP 路由表,去往 Spoke2 内网路由的出接口已变为在 Shortcut 隧道接口(Spoke1_WAN2_0)和 WAN1 上的 IPSec 隧道接口(Spoke1_WAN1)之间负载。
Spoke1 # get router info routing-table bgp Routing table for VRF=0 B 10.10.2.0/24 [200/0] via 100.1.1.2 [2] (recursive via Spoke1_WAN1 tunnel 101.103.254.2), 00:19:40, [1/0] [200/0] via 200.1.1.2 [2] (recursive is directly connected, Spoke1_WAN2_0), 00:19:40, [1/0] B 10.10.3.0/24 [200/0] via 100.1.1.3 [2] (recursive via Spoke1_WAN1 tunnel 101.103.254.2), 02:33:25, [1/0] [200/0] via 200.1.1.3 [2] (recursive via Spoke1_WAN2 tunnel 202.103.254.2), 02:33:25, [1/0] B 10.10.254.0/24 [200/0] via 100.1.1.254 (recursive via Spoke1_WAN1 tunnel 101.103.254.2), 02:35:09, [1/0] [200/0] via 200.1.1.254 (recursive via Spoke1_WAN2 tunnel 202.103.254.2), 02:35:09, [1/0]查看 Spoke1 上 SD-WAN 规则 2 的选路状态,现在优先从 WAN2 上 IPSec 隧道的 Shortcut(Spoke1_WAN2_0)进行转发,而不是从父隧道(Spoke1_WAN2)转发,这说明在 SLA 类型的 SD-WAN 规则中,Shortcut 隧道优先于其父隧道,除非 Shortcut 隧道的 SLA 不满足目标。
Spoke1 # diagnose sys sdwan service 2 Service(2): Address Mode(IPV4) flags=0x200 use-shortcut-sla Tie break: cfg Gen(2), TOS(0x0/0x0), Protocol(0: 1->65535), Mode(sla), sla-compare-order Member sub interface(3): 2: seq_num(2), interface(Spoke1_WAN2): 1: Spoke1_WAN2_0(22) Members(3): 1: Seq_num(2 Spoke1_WAN2_0), alive, sla(0x1), gid(0), cfg_order(1), local cost(0), selected 2: Seq_num(2 Spoke1_WAN2), alive, sla(0x1), gid(0), cfg_order(1), local cost(0), selected 3: Seq_num(1 Spoke1_WAN1), alive, sla(0x0), gid(0), cfg_order(0), local cost(0), selected Src address(1): 10.10.1.0-10.10.1.255 Dst address(1): 0.0.0.0-255.255.255.255再次使用 Spoke1 内网 PC 访问 Spoke2 内网 PC,在 Spoke1 上抓包可以看到流量通过 WAN2 上的 Shortcut 隧道(Spoke1_WAN2_0)隧道转发。
Spoke1 # diagnose sniffer packet any 'host 10.10.2.100' 4 Using Original Sniffing Mode interfaces=[any] filters=[host 10.10.2.100] 7.778827 port4 in 10.10.1.100 -> 10.10.2.100: icmp: echo request 7.778945 Spoke1_WAN2_0 out 10.10.1.100 -> 10.10.2.100: icmp: echo request 7.870455 Spoke1_WAN2_0 in 10.10.2.100 -> 10.10.1.100: icmp: echo reply 7.870486 port4 out 10.10.2.100 -> 10.10.1.100: icmp: echo reply 8.798494 port4 in 10.10.1.100 -> 10.10.2.100: icmp: echo request 8.798518 Spoke1_WAN2_0 out 10.10.1.100 -> 10.10.2.100: icmp: echo request 8.870069 Spoke1_WAN2_0 in 10.10.2.100 -> 10.10.1.100: icmp: echo reply 8.870081 port4 out 10.10.2.100 -> 10.10.1.100: icmp: echo reply调整 Spoke1 与 Spoke2 之间 Shortcut 隧道(Spoke1_WAN2_0)的延迟到 400ms,但父隧道(Spoke1_WAN2)延迟不变。

Spoke1 # diagnose sys sdwan health-check Health Check(HC_to_Hub_Ping): Seq(1 Spoke1_WAN1): state(alive), packet-loss(1.000%) latency(314.047), jitter(16.431), mos(3.573), bandwidth-up(65535000), bandwidth-dw(65535000), bandwidth-bi(131070000) sla_map=0x0 Seq(2 Spoke1_WAN2): state(alive), packet-loss(0.000%) latency(112.318), jitter(24.059), mos(4.291), bandwidth-up(65535000), bandwidth-dw(65535000), bandwidth-bi(131070000) sla_map=0x1 Seq(2 Spoke1_WAN2_0): state(alive), packet-loss(2.410%) latency(393.256), jitter(26.858), mos(3.071), bandwidth-up(65535000), bandwidth-dw(65535000), bandwidth-bi(131070000) sla_map=0x0查看 Spoke1 上 SD-WAN 规则 2 的选路状态,现在优先从 WAN2 上 IPSec 父隧道(Spoke1_WAN2)进行转发,而不是从 Shortcut 隧道(Spoke1_WAN2_0)转发,
Spoke1 # diagnose sys sdwan service 2 Service(2): Address Mode(IPV4) flags=0x200 use-shortcut-sla Tie break: cfg Gen(15), TOS(0x0/0x0), Protocol(0: 1->65535), Mode(sla), sla-compare-order Member sub interface(3): 1: seq_num(2), interface(Spoke1_WAN2): 1: Spoke1_WAN2_0(25) Members(3): 1: Seq_num(2 Spoke1_WAN2), alive, sla(0x1), gid(0), cfg_order(1), local cost(0), selected 2: Seq_num(1 Spoke1_WAN1), alive, sla(0x0), gid(0), cfg_order(0), local cost(0), selected 3: Seq_num(2 Spoke1_WAN2_0), alive, sla(0x0), gid(0), cfg_order(1), local cost(0), selected Src address(1): 10.10.1.0-10.10.1.255 Dst address(1): 0.0.0.0-255.255.255.255再次使用 Spoke1 内网 PC 访问 Spoke2 内网 PC,在 Spoke1 上抓包可以看到流量通过 WAN1 上 IPSec 隧道(Spoke1_WAN1)隧道转发,而不是 Spoke1_WAN2 隧道,并
Spoke1 # diagnose sniffer packet any 'host 10.10.2.100' 4 Using Original Sniffing Mode interfaces=[any] filters=[host 10.10.2.100] 4.313351 port4 in 10.10.1.100 -> 10.10.2.100: icmp: echo request 4.313453 Spoke1_WAN1 out 10.10.1.100 -> 10.10.2.100: icmp: echo request 4.639634 Spoke1_WAN1 in 10.10.2.100 -> 10.10.1.100: icmp: echo reply 4.639664 port4 out 10.10.2.100 -> 10.10.1.100: icmp: echo reply- 在 Spoke1 的路由表中,通过 Spoke1_WAN2 隧道去往 Spoke2 内网的路由出接口已变为 Shortcut 隧道 Spoke1_WAN2_0,而不是 Spoke1_WAN2,所以跳过成员 Spoke1_WAN2,从下一个成员 Spoke1_WAN1 转发(参考 网络管理 → SD-WAN → SD-WAN 介绍 → SD-WAN 数据转发逻辑章节中的 SD-WAN 工作流程注意事项)。
随后 Spoke1 触发了 Spoke1_WAN1 隧道上的去往 Spoke2 的 Shortcut 隧道连接 Spoke1_WAN1_0,后续流量通过 Shortcut 隧道连接 Spoke1_WAN1_0 转发。
Spoke1 # diagnose sniffer packet any 'host 10.10.2.100' 4 Using Original Sniffing Mode interfaces=[any] filters=[host 10.10.2.100] 36.862757 port4 in 10.10.1.100 -> 10.10.2.100: icmp: echo request 36.862888 Spoke1_WAN1_0 out 10.10.1.100 -> 10.10.2.100: icmp: echo request 37.167399 Spoke1_WAN1_0 in 10.10.2.100 -> 10.10.1.100: icmp: echo reply 37.167437 port4 out 10.10.2.100 -> 10.10.1.100: icmp: echo replySpoke2、Spoke3 之间的 Shortcut 隧道测试与 Spoke1 一致,这里不再赘述。
Hub 访问 Spoke
保留之前线路的延迟状态(Spoke1 主动访问 Hub 时应优先从 WAN2 的 IPSec 转发)。
使用 Hub 内网 PC 访问 Spoke1 的内网 PC,由于 Hub 的 SD-WAN 规则配置为 Manual 模式,流量强制从 Hub_WAN1 转发(除非 Hub_WAN1 隧道中断)。

在 Spoke1 上查看返回的流量走向,只要路由表中存在返回的路由,就会遵循源进源出原则,而不是匹配 SD-WAN 规则。
Spoke1 # diagnose sys sdwan service 1 Service(1): Address Mode(IPV4) flags=0x200 use-shortcut-sla Tie break: cfg Gen(12), TOS(0x0/0x0), Protocol(0: 1->65535), Mode(sla), sla-compare-order Members(4): 1: Seq_num(2 Spoke1_WAN2), alive, sla(0x1), gid(0), cfg_order(1), local cost(0), selected 2: Seq_num(1 Spoke1_WAN1), alive, sla(0x0), gid(0), cfg_order(0), local cost(0), selected Src address(1): 10.10.1.0-10.10.1.255 Dst address(1): 10.10.254.0-10.10.254.255 Spoke1 # diagnose sniffer packet any 'host 10.10.254.100 and host 10.10.1.100' 4 Using Original Sniffing Mode interfaces=[any] filters=[host 10.10.254.100 and host 10.10.1.100] 1.105333 Spoke1_WAN1 in 10.10.254.100 -> 10.10.1.100: icmp: echo request 1.105377 port4 out 10.10.254.100 -> 10.10.1.100: icmp: echo request 1.105956 port4 in 10.10.1.100 -> 10.10.254.100: icmp: echo reply 1.105979 Spoke1_WAN1 out 10.10.1.100 -> 10.10.254.100: icmp: echo reply
注意事项
默认配置下,当 VPN 或专线线路(无 SNAT)SD-WAN 选路出现变化后,已有的会话会立即切换到新链路上,如果想在 SD-WAN 线路切换后让已有会话保持在原来的线路上,只有新会话创建在新线路上,需要在对应 VPN 接口或专线接口上使用如下命令。
config system interface
edit "Spoke1_WAN1"
set preserve-session-route enable //默认为disable//
next
end