inter-subnet Routing
EVPN 中实现不同子网 (vlans) 之间的路由 (又叫跨 vlan 路由) 有多种模型。这些模型之间的区别来自于如下因素:
- 是否每一个 VTEP 都进行三层路由还是只有指定的几个 VTEP 进行路由?
- 是否只在输入 VTEP 侧进行路由还是在输入和输出侧 VTEP 都进行路由?
基于如上两个维度,有如下三种模型:
- 集中式路由:指定几个特定的 VTEP 作为三层网关,进行跨子网三层路由。其它 VTEP 只进行二层 FDB 转发。
- 分布式非对称路由:所有的 VTEP 都参与跨子网路由,而且只有输入 VTEP 进行路由,输出 VTEP 只进行 FDB 转发。
- 分布式对称路由:所有 VTEP 都参与跨子网路由,而且输入输出 VTEP 都进行路由。
分布式路由在部署的时候,需要在 VTEP 上为每一个子网配置一个任播的 IP/MAC 地址对作为网关的 IP 和 MAC 地址。而且同一个子网在不同的 VTEP 上的任播 IP/MAC 地址对必须一样。这样做的好处是,当一个 host/VM 进行迁移的时候 (从一个 VTEP 上迁移到另外一个 VTEP 上) 不需要变更迁移的 HOST/VM 的配置。
FRR 在 linux 上支持上面的三种模型。
所有的路由都发生在一个 VRF 上下文。在配置的时候,每一个租户都会配置一个 VRF。租户的每一个子网都需要关联到对应的 VRF 中(在 linux 中,通过将每一个子网的 svi 接口从属于对应的 vrf 设备来实现)。跨子网路由发生在租户的 VRF 中,从而隔离不同租户之间的路由转发信息。
注意:在使用 vxlan 路由功能的时候,推荐开启 arp 一致或者 arp 代答功能,因为分布式路由的出现,每一个子网在所有的 vtep 上都有一个相同的任播 IP/MAC 对,当 host/vm 查询网关的 mac 地址的时候,头端复制将会导致所有的 vtep 都会受到该 arp 请求报文,将会导致源 host/vm 收到多个 arp 应答。
集中式路由
在集中式路由模型中,一个特定的 VTEP 被指定为特定子网中所有 host(这些 host 可以分布在不同的 vtep 上)的默认网关。更常用的模型是,使用 active-active 模式配置一个 VTEP 集群作为集中式网关。在集中式网关 VTEPS 上,需要为整个数据中心的所有子网配置默认网关。当一个主机想要和另外一个子网中的主机进行通信的时候,它发送的报文的目的 mac 为其对应子网网关的 mac 地址(集中式网关 VTEP 上的 mac 地址)。输入 VTEP(host 依附的 VTEP)通过 FDB 表将该报文使用 vxlan 隧道转发到集中式网关 VTEP 上,网关进行目的路由查询,路由后,将报文的目的 MAC 改为目的主机的 mac,通过 vxlan 隧道将报文传送到目的主机所在的 VTEP 上,目的主机所在 VTEP 通过二层转发将报文送给目的主机。
发布默认网关
为了使能集中式路由,必须使用命令 advertise-default-gw 使能网关设备发布网关 IP/MAC 地址对信息。
router bgp 65000
address-family l2vpn evpn
advertise-default-gw
exit-address-family
集中式路由可以是 VNI 级别的,也就是说在部署的时候,可以指定某些 VNI 采用集中式路由,而其它的子网则采用分布式路由。这种混搭模型也是支持的,但是不推荐使用。
使用集中式路由时,当跨子网的源主机和目的主机在同一个 VTEP 上时,它们之间的通信也会先转发到网关 VTEP,然后再转发回来。
如上图所示:server 与 server2 在同一个 VTEP 上(leaf1), 它们之间需要通信,需要借助三层集中式网关集群(spine1 和 spine2)。
分布式非对称路由
在分布式非对称路由模型中,每一个 VTEP 都作为三层转发器,它位依附在它上面的主机进行跨子网流量路由转发。在这种模中,只有源主机所在的 VTEP 会进行路由,目的主机所在的 VTEP 进行二层转发。源 VTEP 进行路由后,会将报文的目的 mac 直接填写为目的主机的 mac,然后使用目的主机所在子网的 vni 进行 vxlan 报文封装,发送到目的 VTEP 上。目的 VTEP 进行 mac 转发报文给目的主机。分布式非对称路由模式非常容易部署,相比于集中式和分布式对称模式来说,不需要而外的配置。分布式非对称模型需要所有 VTEP 上配置所有子网的 vni,即使 VTEP 本地没有该子网的主机也需要配置一个这样的 VNI。