当云上业务系统网络足够复杂,通过对等连接打通VPC后,需要有灵活的子网跨VPC的流量转发的能力。

以华为云为例,VPC提供了默认路由表和自定义路由表的能力,其中自定义路由表需要提工单申请配额才能开通。我们来看一下这两种路由表的能力。

默认路由表

1、在没有开通自定义路由表的情况下,VPC内创建的子网均自动与默认路由表关联;也就是说,VPC内无论创建多少子网,均与一个默认路由表关联。

2、采用对等连接打通VPC后,在本端和对端配置Sub_A、Sub_B、Sub_X、Sub_Y子网路由策略(如图所示),则:

  • Sub_A出流量与Sub_X、Sub_Y路由可达
  • Sub_B出流量与Sub_X、Sub_Y路由可达
  • Sub_X出流量与Sub_A、Sub_B路由可达
  • Sub_Y出流量与Sub_A、Sub_B路由可达

图:默认路由表

自定义路由表

1、使用自定义路由表,可与VPC创建的多个子网关联,但每个子网只能隶属于一个路由表。

2、采用对等连接打通VPC后,可在自定义路由表配置本端和对端配置的路由策略,通过自定义路由表能够实现任意子网之间跨VPC的路由转发

3、如下图所示,可以实现以下子网跨VPC的路由转发:

  • Sub_A出流量与Sub_X、Sub_Y路由可达,Sub_X&Sub_Y出流量与Sub_A路由可达,且与其它跨VPC子网路由不可达。
  • Sub_B出流量与Sub_Z出流量双向路由可达,且与其它跨VPC子网路由不可达。

图:自定义路由表

采用默认路由表的方式,无法像自定义路由表那样实现灵活的子网跨VPC的流量转发,但我们可以借助ACL来实现子网跨VPC的流量访问控制。

有VPC_1和VPC_2,通过对等连接打通,并在本端和对端配置Sub_A、Sub_B、Sub_X、Sub_Y子网路由策略后,考虑以下场景需求:

场景一:要求Sub_A⇌ Sub_X , Sub_B⇌ Sub_Y,且Sub_A与Sub_Y不通 , Sub_B与 Sub_X不通

解决方案:采用子网之间ACL访问控制实现,可在Sub_X的ACL实例上设置放通Sub_A , Sub_Y的ACL实例上设置放通Sub_Y( Sub_X& Sub_Y设置ACL放通规则后,默认拒绝其它的子网的访问)

图:场景一

场景二:Sub_A⇌Sub_X&Sub_Y,Sub_B⇌ Sub_Y ,但Sub_B与Sub_X不通

解决方案:采用子网之间ACL访问控制实现,为简化配置规则,只需要在Sub_X的ACL实例上,放通与Sub_A的规则即可。(此时只有Sub_X创建了ACL实例后,默认拒绝所有子网的访问,也即实现了与Sub_B不通)

图:场景二

缘由

之所以写这篇关于子网跨VPC的路由访问控制的文章,是因为在某省会城市的卫健委的项目中,客户强烈要求提供自定义路由表的能力,当时属地资源池节点只有默认路由表的能力,建议采用ACL的方式实现。虽然采用ACL方案也可以满足需求,但如果业务系统足够复杂,管理维护上确实不如自定义路由表直观灵活。

写这篇文章构思了好几天,一方面要深入理解默认路由表和自定义路由的各自的机制,同时还要考虑如何用文字逻辑清晰的表达出来,希望大家能够不太费力地看懂这篇文章。