功能与适用场景
飞连 SD-WAN 域名调度在解析业务域名时,结合员工身份或接入分支选择出口,并将解析结果与后续业务转发关联。本文面向网络管理员,介绍云 VPN 与员工选路、分支组网与分支选路两种场景的工作原理、域名匹配规则和报文路径。
员工通过云 VPN 访问业务系统时,可以按员工身份使用相应出口;分支办公室访问同一业务域名时,可以按入口 CPE 使用相应出口。域名调度将“访问哪个域名”与“从哪个出口访问”关联起来。
场景对比
DNS 调度的作用
- 按业务域名选择出口:SaaS、内部系统和跨境资源通常通过域名访问。DNS 调度根据域名选择出口,将域名规则与后续的 IP 报文转发关联。
- 将调度结果用于报文转发:中心 DNS 返回业务 A 记录和 tun IP。客户端建立 fake IP 映射,入口 CPE 建立业务真实 IP 与 tun IP 的映射,后续报文据此经 SD-WAN 隧道转发到指定出口 CPE。
- 两种场景共用域名规则:员工选路与分支选路使用同一份租户域名匹配规则,分别根据用户身份和入口 CPE 匹配出口 CPE。
基本概念与架构
整体架构包括管理面、DNS 调度控制面,以及承载业务流量的接入、骨干和出口网络。中心 DNS 负责选择出口和解析协调;客户端、CPE 和 POP 负责业务转发。
下图分别展示员工客户端与分支 CPE 两种接入方式。虚线表示配置下发,细实线表示 DNS 查询及出口解析协调,粗实线表示业务转发路径。接入 POP 与出口 POP 之间通过骨干网络转发。
员工接入调度流程
员工通过云 VPN 访问业务域名时,客户端负责 DNS 分流、调度结果映射和接入侧报文转换。以下按解析、请求转发和回包三个阶段说明完整过程。
客户端两组 DNS 的分工
客户端接入云 VPN 之前请求 /vpn/list,服务端针对该云 VPN 下发两组 DNS:
调度域名的判定与扩展字段
- 域名判定:客户端 dnsproxy 在 Bloom Filter 命中即视为调度域名,将查询交给中心 DNS;未命中则交给租户配置 DNS。
- 云 VPN 客户端选路:请求携带"租户 + 建议出口节点",中心 DNS 按客户端建议使用出口 CPE。
- 员工选路:请求携带"租户 + 员工身份 + 设备身份 + 客户端虚拟 IP + 连接模式"等信息,中心 DNS 结合员工选路规则综合判定出口 CPE,可能覆盖客户端建议值。
- 响应内容:中心 DNS 响应中除 A 记录外,同时携带 tun IP,供客户端在本地建立"业务真实 IP ↔ fake IP ↔ tun IP"三段映射。
调度时序
处理过程
- 预置阶段:客户端从 /vpn/list 获取租户 DNS 与中心 DNS 两组配置,接入云 VPN 后由接入 POP 分配虚拟 IP 与 tun IP;出口 CPE 已通过 gRPC 49920 与中心 DNS 建立长连接。
- 域名判定:应用发起 DNS 查询到本地 dnsproxy,Bloom Filter 命中即走中心 DNS,否则走租户配置 DNS。
- 发送查询:dnsproxy 通过 UDP 443 向中心 DNS 发送 DNS 查询,扩展字段携带员工选路信息。
- 选择出口:中心 DNS 按租户匹配域名规则;进一步按员工身份匹配出口 CPE。
- 本地解析:中心 DNS 通过 gRPC 49920 向出口 CPE 下发解析请求。出口 CPE 向 DNS 服务器发起本地解析,获得业务 A 记录后回传给中心 DNS。
- 返回解析结果:中心 DNS 将 A 记录 + tun IP 通过 UDP 443 回给客户端;客户端 dnsproxy 分配 fake IP,建立"真实 IP ↔ fake IP"映射,最终返回 fake IP 给应用。
- 数据面转发:应用以 fake IP 发包,客户端做 DNAT 转为 tun IP 进入 WireGuard 隧道;沿"接入 POP → 骨干 → 出口 POP → 出口 CPE"到达,出口 CPE 恢复业务真实目的 IP 后 SNAT 转发到目的资源;回包经隧道返回客户端,客户端恢复地址后交给应用。
访问示例
以下以中国区员工通过云 VPN 访问美国 SaaS 为例。业务域名为 portal.example.com,出口位于美国 vCPE。以下网络参数为示例。
示例网络参数
阶段 1:DNS 解析
解析路径:客户端 → 中心 DNS → 出口 CPE。
- 应用发起 gethostbyname("portal.example.com"),系统 DNS 指向 dnsproxy。
- dnsproxy 通过 Bloom Filter 判定命中 → 走中心 DNS 而不是租户配置 DNS。
- dnsproxy 构造 DNS 查询报文,扩展字段填入员工选路信息 {租户=T, openUID=1234, deviceID=5678, 客户端虚 IP=100.64.10.5, 连接模式=WireGuard}。
- 通过 UDP 443 向中心 DNS 10.100.0.53 发送查询。
- 中心 DNS 匹配租户 T 的域名规则,命中 portal.example.com;进一步按员工身份匹配得出口 CPE = cpe-us-1(US-vCPE)。
- 中心 DNS 通过与 cpe-us-1 建立的 gRPC 49920 长连接下发解析请求:"请为租户 T 本地解析 portal.example.com"。
- US-vCPE 根据 /etc/resolv.conf 配置向 DNS 服务器请求 A 记录,得 A = 203.0.113.50。
- US-vCPE 沿 gRPC 长连接把 A 记录回传中心 DNS。
- 中心 DNS 根据"出口 POP 已分配给 US-vCPE 的 tun IP"取到 tun IP = 169.254.1.10,把 A + tun IP 通过 UDP 443 响应给客户端 dnsproxy。
- dnsproxy 从 30.100.0.0/16 分配 fake IP 30.100.0.7,建立三段映射 fake IP 30.100.0.7 ↔ 真实 IP 203.0.113.50 ↔ tun IP 169.254.1.10;把 30.100.0.7 作为 A 记录返回给应用。
阶段 2:请求转发
以下报文结构展示客户端 wg-go 完成 DNAT 后、报文进入 WireGuard 隧道时的报文格式。后续表格列出报文从应用层到目的服务器逐跳的字段变化。
应用向 30.100.0.7:443 发起 TCP SYN,报文从内到外的字段变化如下:
阶段 3:回包处理
回包依次经过目标服务器、出口 CPE、出口 POP、骨干网络和接入 POP,返回客户端 wg-go。以下报文结构对应接入 POP 向客户端 wg-go 发送的 WireGuard 报文:外层为最后一跳的公网 UDP 报文,内层已由出口 CPE 完成回程 DNAT,真实源地址保存在 IP option 中。客户端 wg-go 收到后,根据映射将内层源地址从 tun IP 恢复为 fake IP,再交给应用。
随后客户端 wg-go 依据本地映射把内层 src = 169.254.1.10 恢复为 src = 30.100.0.7(fake IP),并根据 IP option 中的 original_src = 203.0.113.50 保持四元组一致性,最终应用侧看到 src=30.100.0.7:443, dst=100.64.10.5:<random>。
- 目的服务器 203.0.113.50 回包,src=203.0.113.50, dst=10.20.30.40。
- US-vCPE 匹配 SNAT 会话反向恢复 dst=100.64.10.5;同时把 src 记入 IP option,改为 src=169.254.1.10。
- 沿"出口 CPE → 出口 POP → 骨干 → 接入 POP → 客户端"反向隧道回到客户端。
- 客户端 wg-go 收到内层 src=169.254.1.10, dst=100.64.10.5,从 IP option 读回真实 src 203.0.113.50,根据已有映射恢复为 30.100.0.7(fake IP)。
- 应用看到回包 src=30.100.0.7, dst=100.64.10.5,与请求对应同一连接。
分支组网调度流程
分支终端的 DNS 查询由入口 CPE 接收。入口 CPE 负责域名分流和接入侧报文转换,中心 DNS 根据入口 CPE 选择出口。
入口 CPE 的 DNS 分流
- 分支终端将入口 CPE LAN IP 作为默认 DNS。
- 入口 CPE 上的 dnsmasq 按域名后缀严格匹配判定:
- 命中调度域名 → 通过 UDP 443 转发到中心 DNS;
- 未命中 → 转发到上游 DNS 服务器(公共递归 / 客户自建)。
扩展字段(分支选路)
请求扩展字段携带"租户 + 入口 CPE 标识",中心 DNS 用其定位租户,然后按入口 CPE 匹配出口 CPE;未命中则回落到租户级默认出口。同一域名在不同分支可以走不同出口。
调度时序
处理过程
- 预置阶段:分支入口和出口 CPE 均已被 POP 分配 tun IP;出口 CPE 已通过 gRPC 49920 与中心 DNS 建立长连接。
- 入口分流:分支终端 DNS 请求先到入口 CPE,dnsmasq 按域名后缀严格匹配判定是否为调度域名。
- 发送查询:命中即通过 UDP 443 转到中心 DNS,扩展字段携带分支选路信息(租户 + 入口 CPE)。
- 选择出口:中心 DNS 按租户匹配域名规则;进一步按入口 CPE 匹配出口 CPE,未命中回落到租户默认出口。
- 本地解析:中心 DNS 通过 gRPC 49920 向出口 CPE 下发解析请求。出口 CPE 向 DNS 服务器发起本地解析并回传结果。
- 返回解析结果:中心 DNS 将 A 记录 + tun IP 通过 UDP 443 回给入口 CPE;入口 CPE 响应给分支终端。
- 数据面转发:分支终端按 A 记录发包,入口 CPE 做 DNAT + WireGuard 隧道封装,沿"接入 POP → 骨干 → 出口 POP → 出口 CPE"到达;出口 CPE 恢复业务真实目的地址后 SNAT 转发到目的资源,回包经隧道返回入口 CPE,入口 CPE 恢复地址后转发给分支终端。
访问示例
以下以中国区分支办公室通过分支组网访问美国资源为例。业务域名为 portal.example.com,出口位于美国 vCPE。以下网络参数为示例。
示例网络参数
阶段 1:DNS 解析
解析路径:分支终端 → 入口 CPE → 中心 DNS → 出口 CPE。
- 分支终端 10.10.1.50 向 10.10.1.1:53(入口 CPE LAN DNS)发起 DNS 查询 portal.example.com。
- 入口 CPE 上 dnsmasq 按域名后缀严格匹配命中调度域名 → 进入中心 DNS 转发路径。
- dnsmasq 构造 DNS 查询报文,扩展字段填入分支选路信息 {租户=T, 入口 CPE=cpe-sh-1,WAN IP 198.51.100.20(示例)}。
- 通过 UDP 443 向中心 DNS 10.100.0.53 发送查询。
- 中心 DNS 匹配租户 T 的域名规则命中 portal.example.com;进一步按入口 CPE cpe-sh-1,WAN IP 198.51.100.20(示例) 匹配到出口 CPE = cpe-us-1(US-vCPE);若未命中则回落到租户默认出口。
- 中心 DNS 通过与 cpe-us-1 建立的 gRPC 49920 长连接下发解析请求:"请为租户 T 本地解析 portal.example.com"。
- US-vCPE 根据 /etc/resolv.conf 配置向 DNS 服务器请求,得 A = 203.0.113.50。
- US-vCPE 沿 gRPC 长连接把 A 记录回传中心 DNS。
- 中心 DNS 从出口 POP 已分配的 tun IP 表取到 tun IP = 169.254.1.10,把 A + tun IP 通过 UDP 443 响应给入口 CPE。
- 入口 CPE 在本地建立 203.0.113.50 ↔ 169.254.1.10 映射,然后把 A = 203.0.113.50 作为 DNS 响应返回给分支终端(分支终端不感知 tun IP)。
阶段 2:请求转发
以下报文结构展示入口 CPE 完成 DNAT 后、报文进入 WireGuard 隧道时的报文格式。后续表格列出报文从分支终端到目的服务器逐跳的字段变化。
分支终端向 203.0.113.50:443 发起 TCP SYN,报文从内到外的字段变化如下:
阶段 3:回包处理
回包依次经过目标服务器、出口 CPE、出口 POP、骨干网络和接入 POP,返回入口 CPE。以下报文结构对应接入 POP 向入口 CPE 发送的 WireGuard 报文:外层为最后一跳的公网 UDP 报文,内层已由出口 CPE 完成回程 DNAT,真实源地址保存在 IP option 中。入口 CPE 收到后,根据映射将内层源地址从 tun IP 恢复为业务真实 IP,再交给分支终端。
入口 CPE 收到解密后的内层报文,从 IP option 读回 original_src = 203.0.113.50,将内层 src = 169.254.1.10 恢复为 src = 203.0.113.50,再按分支 LAN 路由转发给分支终端;分支终端最终看到 src=203.0.113.50:443, dst=10.10.1.50:<random>,与请求对应同一连接。
- 目的服务器 203.0.113.50 回包,src=203.0.113.50, dst=10.20.30.40。
- US-vCPE 匹配 SNAT 会话反向恢复内层 dst=10.10.1.50;同时把 src 记入 IP option,改为 src=169.254.1.10。
- 沿"出口 CPE → 出口 POP → 骨干 → 接入 POP → 入口 CPE"反向隧道回到入口 CPE。
- 入口 CPE 收到内层 src=169.254.1.10, dst=10.10.1.50,从 IP option 读回真实 src 203.0.113.50,恢复源地址后转发给分支终端。
- 分支终端看到回包 src=203.0.113.50, dst=10.10.1.50,与之前发出的四元组一致。
两种场景差异
两种场景共用中心 DNS 调度能力,但 DNS 入口、域名判定方式、出口选择依据和终端看到的地址不同。
域名匹配规则与注意事项
客户端与分支入口 CPE 的域名匹配方式不同。同一规则用于两种场景时,需要同时考虑域名层级、通配符和后缀范围。
- 云 VPN 侧四级域限制:需区分 a.b.c.example.com 与 d.e.f.example.com 的场景,客户端侧不支持,需由分支侧匹配规则处理。
- 分支侧短后缀风险:不要用不足以唯一标识业务的短后缀(如 x.com),必要时改用精确匹配或延长后缀。
- DoH / Secure DNS 绕过:Chrome / Firefox Secure DNS 会绕过客户端 dnsproxy 直接走公共 DNS,调度必然失效。
必要的协议及端口说明
域名查询、出口侧解析协调和业务隧道使用不同链路。客户端及入口 CPE 通过 UDP 443 查询中心 DNS;出口 CPE 主动建立 TCP 49920 的 gRPC 双向连接,供中心 DNS 下发解析请求及接收结果。
链路与地址分配说明
- 所有 DNS 查询到中心 DNS 都走 UDP 443(不是 53、也不是 gRPC 49920)。查询链路是无状态的,中心 DNS 不需要对海量客户端 / 入口 CPE 维护长连接。
- gRPC 49920 只用于出口 CPE 一侧:中心 DNS 通过该连接向出口 CPE 下发解析请求。日志信息 dns_grpc: connection refused 特指该通道异常。
- tun IP(169.254.x.y)由 POP 分配下发,CPE 自身不分配。POP 集中管理避免网段冲突,并统一维护隧道地址的分配。
地址网段与映射关系
下表汇总各类地址的用途、分配方和生成时机。隧道虚拟 IP 由 POP 分配,客户端 fake IP 在获得调度响应后由客户端分配。