4. 多租户网络设计原则与 SONiC 配置模型

多租户网络的核心目标,是在同一套物理 Underlay 上,为不同租户提供逻辑上彼此独立的三层转发域,同时又能按业务需要受控地共享某些服务(如防火墙、负载均衡、共享网关)。在 SONiC 中,这一目标主要通过 VRF(Virtual Routing and Forwarding)、VXLAN VNI 与 ACL/路由策略 三者协同实现。理解它们之间的映射关系,比记住某条命令更重要。

租户隔离的三种方式与选择依据

实际工程中,租户隔离通常落在三个层次上,隔离强度与资源开销依次递增:

  • VLAN 隔离:同一 VRF 内用 VLAN 划分广播域,二层隔离、三层仍可经网关互通。适合同一租户内部不同部门,或对隔离要求不高的场景。
  • VRF 隔离:每个租户一个独立路由表,IP 地址空间可重叠,默认互不可达。这是多租户三层隔离的主力手段。
  • VXLAN VNI 隔离:跨 Leaf/Spine 甚至跨数据中心时,用 VNI 标识租户的二层/三层域,配合 EVPN 实现远端通告。VNI 与 VRF 通常一一对应。

选择原则可以概括为:同租户内用 VLAN 细分,租户之间用 VRF 硬隔离,跨站点用 VNI 延伸。若租户数量少且不需要地址重叠,可只用 VLAN;一旦出现地址重叠或合规要求,就必须引入 VRF。

VRF 与 VRF-lite 的区别

VRF-lite 是 VRF 的轻量实现:它只做本地路由表隔离,不依赖 MPLS 标签,也不要求 PE 之间运行 MP-BGP。每台设备独立维护各租户的路由表,租户间通信必须通过外部设备(防火墙、路由器)显式串接。SONiC 原生支持 VRF-lite,配置模型就是“创建 VRF → 绑定接口 → 在 VRF 内配置路由协议”。

与完整 VRF(MPLS L3VPN)相比,VRF-lite 的优势是简单、无需标签分发;代价是跨设备扩展性差,租户路由无法自动跨跳传播。在 SONiC + EVPN 的架构中,通常用 EVPN L3 VRF 来弥补这一点:VRF 仍在本设备隔离,但通过 EVPN Type-5 路由跨 Leaf 通告租户前缀。

VNI 分配策略

VNI 是 24 位整数,范围 1~16777215。分配不当会导致运维混乱甚至冲突,建议遵循以下策略:

  • 按租户分段:例如租户 A 使用 10000~10999,租户 B 使用 11000~11999,便于从 VNI 直接反查租户。
  • L2 VNI 与 L3 VNI 分离:L2 VNI 标识某个二层网段(如 10100 对应 VLAN 100),L3 VNI 标识租户 VRF(如 50001 对应租户 A 的 VRF)。
  • 与 VLAN 建立可读映射:常见做法是 L2 VNI = 10000 + VLAN ID,例如 VLAN 100 → VNI 10100,减少查表成本。
  • 预留管理段:1~9999 留给 Underlay、管理 VRF 和保留用途,避免与业务租户混用。

下面这张图展示了租户 A 与租户 B 在 Leaf 上的 VRF/VNI/VLAN 映射关系,以及路由泄漏的受控路径。图中每个租户拥有独立的 VRF 和 L3 VNI,L2 VNI 对应各自 VLAN;共享服务 VRF 通过路由泄漏被两个租户按需访问,而租户之间默认无路径。

SONiC Leaf 上的多租户 VRF / VNI / VLAN 映射与路由泄漏 租户 A VRF: VRF-A L3 VNI: 50001 VLAN 100 → L2 VNI 10100 VLAN 101 → L2 VNI 10101 10.10.0.0/16(可重叠) 租户 B VRF: VRF-B L3 VNI: 50002 VLAN 200 → L2 VNI 10200 VLAN 201 → L2 VNI 10201 10.10.0.0/16(可重叠) 共享服务 VRF VRF: VRF-SHARED L3 VNI: 50099 防火墙 / 负载均衡 / DNS 172.16.0.0/24 Underlay / EVPN BGP EVPN 控制平面 Type-2 / Type-5 路由 VTEP: 10.0.0.1 / 10.0.0.2 VXLAN 隧道承载租户流量 路由泄漏 路由泄漏 默认无路径(隔离) 正常转发/隧道 受控路由泄漏 租户间隔离边界

路由泄漏控制

路由泄漏(Route Leak)指把某个 VRF 的路由导入另一个 VRF,使原本隔离的租户能够访问共享资源。它是“受控打破隔离”的手段,必须严格限制方向与范围。SONiC 中常用两种方式:

  • 静态路由 + 下一跳指向共享 VRF 接口:简单直接,适合少量前缀。
  • BGP 路由策略(route-map / import-export):在 EVPN 场景下,通过 route-target 的 import/export 控制哪些 VRF 能收到对方路由,粒度更细。

控制要点:只泄漏共享服务前缀,不泄漏租户私有前缀;只允许租户→共享方向,禁止共享→租户的默认路由;对泄漏前缀加 community 标记,便于审计。下面给出一个 SONiC 配置片段示例(参数为教学示例,非实测结果):

# 创建租户 VRF
sudo config vrf add VRF-A
sudo config vrf add VRF-B
sudo config vrf add VRF-SHARED

# 将接口绑定到 VRF
sudo config interface vrf bind Ethernet4 VRF-A
sudo config interface vrf bind Ethernet8 VRF-B

# 在 VRF-A 内添加指向共享服务的静态路由
sudo ip route add 172.16.0.0/24 dev Ethernet12 vrf VRF-A
sudo ip route add 172.16.0.0/24 dev Ethernet12 vrf VRF-B

# 查看 VRF 路由表
show ip route vrf VRF-A
show ip route vrf VRF-B

执行后,show ip route vrf VRF-A 应能看到 172.16.0.0/24 的条目,而 VRF-A 与 VRF-B 之间不会出现对方的前缀。若发现租户间意外可达,优先检查是否误将两个 VRF 绑定了同一 route-target,或静态路由的下一跳落在了错误的 VRF 接口上。

SONiC 配置文件与命令行接口

SONiC 的配置模型是“config_db.json 为唯一事实来源”,命令行只是修改 config_db 的入口。多租户相关配置主要分布在以下几个表:

配置表作用关键字段示例
VRF定义 VRF 实例"VRF-A": {}
INTERFACE接口绑定 VRF"Ethernet4|10.10.1.1/24": {"vrf_name":"VRF-A"}
VXLAN_TUNNELVTEP 源地址"tunnel1": {"src_ip":"10.0.0.1"}
VXLAN_TUNNEL_MAPVNI 与 VLAN 映射"tunnel1|map_100": {"vni":10100,"vlan":100}
VNET / EVPNL3 VNI 与 VRF 关联"vni":50001, "vrf":"VRF-A"

命令行侧,常用命令包括 config vrf add/del、config interface vrf bind/unbind、show vrf、show ip route vrf <name>、show vxlan tunnel。修改后建议执行 config save 持久化到 config_db.json,否则重启后丢失。排查时先看 show vrf 确认 VRF 存在,再看接口绑定,最后看路由表和 VNI 映射,顺序与数据面转发路径一致。

实践建议:多租户环境建议把 VRF 名、VNI、VLAN、route-target 做成一张对照表纳入变更管理。VNI 一旦上线不要随意改动,因为远端 VTEP 和 EVPN 路由都依赖它;若必须调整,应先在维护窗口内同步更新所有 Leaf 的 VXLAN_TUNNEL_MAP 与 EVPN 配置。

综上,多租户设计的关键不是“配了多少条命令”,而是把隔离边界(VRF)、标识体系(VNI/VLAN)、受控互通(路由泄漏)三件事在配置模型中一一对应清楚。只要映射关系清晰,SONiC 的 config_db 与命令行就能稳定地表达并复现这套设计。