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 通过路由泄漏被两个租户按需访问,而租户之间默认无路径。
路由泄漏控制
路由泄漏(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_TUNNEL | VTEP 源地址 | "tunnel1": {"src_ip":"10.0.0.1"} |
| VXLAN_TUNNEL_MAP | VNI 与 VLAN 映射 | "tunnel1|map_100": {"vni":10100,"vlan":100} |
| VNET / EVPN | L3 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)、受控互通(路由泄漏)三件事在配置模型中一一对应清楚。只要映射关系清晰,SONiC 的 config_db 与命令行就能稳定地表达并复现这套设计。