顾名思义,子网路由是子网级别的。如果子网关联了子网路由,那么会优先查子网路由表中的路由。通过使用子网路由,用户的虚拟私有网络将具备一些高级的功能,比如在VPC中部署集中式防火墙等。
本文介绍的子网路由功能是基于三层流量卸载方案、通过OpenFlow流表方式来实现的。在介绍子网路由之前,先了解一下东西向三层流量卸载方案。如图1所示,vm1、vm2和vm3分别属于三个不同网段的子网,同属于一个VPC,即三层可通。在卸载之前,同VPC三层流量均需要通过租户网关TGW拉通,导致TGW的流量压力较大,无法满足大客户对于同VPC三层互访流量的需求。
图1 基本组网图
卸载前同主机跨网段和跨主机跨网段互访流量路径分别如下图2和图3所示。可以发现,不管是同主机还是跨主机,只要是跨网段都需要绕行租户网关。因此,可以考虑对三层东西向流量进行卸载,使它们下沉至OVS,以减轻租户网关的压力。
图2 同主机跨网段互访(卸载前)
图3 跨主机跨网段互访(卸载前)
卸载后的三层互访流量路径分别如图4和5所示。东西向三层流量不再需要绕行租户网关,同主机内的流量在OVS内部完成转发,跨主机的流量直接送至目的虚机所在宿主机,从而实现流量的最短路径转发。
图4 同主机跨网段互访(卸载后)
图5 跨主机跨网段互访(卸载后)
跨网段路由转发处理过程大致如下:当路由器收到一个IP数据包,路由器就会找出数据包的三层包头中的目的IP地址,然后拿着目的IP地址到自己的路由表中进行查询,找到“最匹配”的路由条目后,将数据包根据路由条目所指示的出接口或者下一跳IP转发出去,这就是IP路由。(当然路由器还会做一些额外的工作:将数据包的三层包头的TTL减一,修改数据包的二层源MAC地址为自己出接口的MAC,修改数据包的二层目的MAC地址为下一跳的MAC)。
接下来回归主题,介绍一下子网路由。VPC内子网和路由表的关联关系如图6所示,一个子网只能关联一个路由表,一个路由表(只能属于一个VPC)可以被多个子网关联。VPC1内的子网不允许关联属于VPC2的路由表。
图6 VPC内子网和路由表的关联关系
路由表由一系列具体的路由规则(条目)组成,按照类型可分为默认路由表和自定义路由表。默认路由表中包含用于子网之间互通,访问公网的路由规则,以及VPN,专线和云间高速等在创建业务之后同步过来的路由,这些路由属于系统路由,用户不可以删除。在删除自定义路由表时,如果路由表存在关联的子网则不允许删除。在删除子网时,如果子网存在关联的自定义路由表,则不允许删除;如果子网存在关联的默认路由表,则可以删除。
图7 默认路由表和自定义路由表
如图7所示,在创建VPC时,自动创建默认路由表,一个VPC对应一张默认路由表。VPC内新创建的子网,自动关联所属VPC内的默认路由表。在用户创建了自定义路由表之后,可以将子网换绑到该VPC内已经创建的自定义路由表,以管理和控制子网内虚机的(出方向)流量转发路径。每条路由规则对应OVS上一条路由流表,流表的动作会将源MAC更改为网关MAC,目的MAC更改为下一跳的MAC。