在Azure上很多小伙伴有vNet互联互通的需求。目前在Azure中在跨区域场景中可以选用vNet Gateway通过S2S实现互通,同区域内可以通过vNet Peering实现互通。以上是简单的两个vNet互通的场景,当有多个vNet之间实现Any to Any的互通时,通过以此两两互联互通的方法工作量及复杂度明显过高。有没有办法可以更简单的实现Full Mesh Any to Any的互通呢。答案是Hub-Spoke,但是问题来了对于vNet Peering场景中原生的Azure网络vNet Peering不支持Transit vNet(即假设有vNet A,B,C,vNet A与vNet B建立peer,vNet B与vNet C建立peer,此时A与B支持互通,B与C支持互通,但A与C之间没有互通关系,如果需要互通即vNet B要扮演Transit vNet的角色)。
目前Azure上可以通过在Hub vNet中创建一个实例来扮演路由转发角色,从而实现Transit vNet的效果。此种方法相对复杂,用户需要自行考虑实例高可用问题。本文为大家介绍如何通过Azure原生提供的vNet Gateway来实现Transit vNet。
测试环境说明:
vNet-Hub:172.16.0.0/16
vNet-Spoke1:172.17.0.0/16
vNet-Spoke2:172.18.0.0/16
vNet-Spoke1中VM:172.17.0.4
vNet-Spoke2中VM:172.18.0.4
准备工作:
- 在Hub vNet中存在vNet Gateway
配置方法(参数以斜体表示,实际配置可根据需求进行替换):
- 在Hub vNet中创建到Spoke1 vNet和Spoke2 vNet的Peering
azure network vnet peering create -g vNet-Hub -n toSpoke1 --vnet-name vNet-Hub --remote-vnet-id spoke1-vNet-id --allow-gateway-transit true --allow-vnet-access true
Note:开启Gateway-transit,从而Spoke端可以享用Hub的vNet网关
azure network vnet peering create -g vNet-Hub -n toSpoke2--vnet-name vNet-Hub --remote-vnet-id spoke2-vNet-id --allow-gateway-transit true --allow-vnet-access true
- 在Spoke vNet中创建到Hub的Peering
azure network vnet peering create -g vNet-Spoke1 -n toHub --vnet-name vNet-Spoke1 --remote-vnet-id Hub-vNet-id --use-remote-gateways true --allow-vnet-access true
Note:Spoke侧开启use-remote-gateways,从而Spoke端可以享用Hub的vNet网关
azure network vnet peering create -g vNet-Spoke2 -n toHub --vnet-name vNet-Spoke2 --remote-vnet-id Hub-vNet-id --use-remote-gateways true --allow-vnet-access true
- 创建UDR自定义转发策略,将Spoke vNet网段地址路由下一跳指向Hub vNet Gateway地址
创建UDR路由表
azure network route-table create -g vNet-Spoke1 -n SPOKE1UDR -l southeastasia
创建路由条目
azure network route-table route create --route-table-name SPOKE1UDR --address-prefix 172.18.0.0/16 --next-hop-ip-address 172.16.1.4 --next-hop-type VirtualAppliance --name Spoke2prefix --resource-group vNet-Spoke1
Note:下一跳地址类型指定为VirtualAppliance
azure network route-table create -g vNet-Spoke2 -n SPOKE2UDR -l southeastasia
azure network route-table route create --route-table-name SPOKE2UDR --address-prefix 172.17.0.0/16 --next-hop-ip-address 172.16.1.4 --next-hop-type VirtualAppliance --name Spoke1prefix --resource-group vNet-Spoke2
关联路由表至子网
azure network vnet subnet set -g vNet-Spoke1 --vnet-name vNet-Spoke1 --name default --route-table-name SPOKE1UDR
azure network vnet subnet set -g vNet-Spoke2 --vnet-name vNet-Spoke2 --name default --route-table-name SPOKE2UDR
细心的小伙伴可能会问,UDR路由条目里面设定的下一跳是如何获得的。Azure中在创建vNet Gateway的时候需要创建一个GatewaySubnet,vNet Gateway逻辑上就是通过这个GatewaySubnet与vNet连接的,所以vNet Gateway会占用该子网内一个地址。在Azure中地址分配是按照最小的可用地址分配的,以x.x.x.x/24子网为例,Azure会以第4个可用地址进行分配,即x.x.x.4给到vNet Gateway。另外也可以通过可用的实例进行ping验证来确认vNet Gateway的地址。
测试连通性:
利用vNet-Spoke1中主机与vNet-Spoke2内主机进行ntttcp测试
小结:
通过借助vNet Gateway实现vNet Peering在Hub-Spoke环境下的Full Mesh互通,Hub可以作为Transit vNet。vNet Gateway为原生网关实例,无需关注高可用问题,从而简化部署及管理。