官方的参考连接:
用户定义的路由和 IP 转发:
http://www.windowsazure.cn/documentation/articles/virtual-networks-udr-overview
如何在 Azure 中创建路由并启用 IP 转发:
http://www.windowsazure.cn/documentation/articles/virtual-networks-udr-how-to#How-to-manage-routes
为此进行了一个小的实验:
首先在Azure上创建一个虚拟网路,网络拓扑如下:
每个子网内分别创建了一台虚拟机:
创建好之后,关闭掉这三台虚拟机的防火墙,三台机器可以使用内网IP互相ping通。
关于虚拟网络的信息(Powershell命令中会涉及):
虚拟网络名称:DanEastVNET
三个子网名称:Subnet-1(10.0.0.0/27),Subnet-2(10.0.0.32/27),Subnet-3(10.0.0.64/27)
首先使用下面的命令创建一个路由表:
New-AzureRouteTable -Name DanTestRouteTable1-Location “China East”
创建完成后,可以使用Get-AzureRouteTable -Name DanTestRouteTable1 –Detailed查看路由表中创建好的路由规则(默认情况下里面什么规则也没有,所以是空的)。
接着我们在其中添加一条路由规则:
Get-AzureRouteTable -NameDanTestRouteTable1 | Set-AzureRoute -RouteName dantestroute2 -AddressPrefix10.0.0.64/27 -NextHopType Null
这条规则的名称是dantestroute2,规则是说所有发到10.0.0.64/27(Subnet-3)网段的包的下一跳类型是Null(黑洞),即丢弃掉数据包。
添加好路由后,我们使用下面的命令将路由表DanTestRouteTable1应用给Subnet-1:
Set-AzureSubnetRouteTable-VirtualNetworkName DanEastVNET -SubnetName Subnet-1 -RouteTableName DanTestRouteTable1
应用了这条规则后,可以试验一下,从Subnet-1中的虚拟机ping Subnet-3中的另外一台虚拟机就无法ping通了,因为数据包根据路由规则被丢弃了。
使用下面这条命令可以看到DanEastVM1这台虚拟机的路由表:
可以看到我们的路由规则是生效的。
下面使用命令再添加一个路由规则:
Get-AzureRouteTable -NameDanTestRouteTable1 | Set-AzureRoute -RouteName dantestroute1 -AddressPrefix10.0.0.68/32 -NextHopType VirtualAppliance -NextHopIpAddress 10.0.0.36
这条规则是说,所有向地址10.0.0.68发送的数据包都会转发到虚拟IP 10.0.0.36上(虚拟机DanEastVM2)。
当从DanEastVM1(10.0.0.4)上ping虚拟机Dan08Test(10.0.0.68)时,由于更符合新加的dantestroute1这条规则,所以会按照这条路由进行转发,会转发到DanEastVM2(10.0.0.36)上。但是由于DanEastVM2上面并没有配置路由转发服务,所以此时是ping不通的。
我们在虚拟机DanEastVM2上面安装配置”Network Policy and Access Services”(网络策略和访问服务),然后启用本地路由:
配置完成后看到服务已经启动:
然后测试ping的连通性,发现从10.0.0.4还是ping不通10.0.0.68。这时还需要启用DanEastVM2(10.0.036)的IP Forwarding的功能,使用下面的命令:
Get-AzureVM -ServiceName DanEastCS -NameDanEastVM2 | Set-AzureIPForwarding -Enable
启用之后使用下面的命令可以查看IP Forwarding的状态:
上面都配置完成后,我们在DanEastVM1(10.0.0.4)中ping一下Dan08Test(10.0.0.68),发现就可以ping通了。我们在DanEastVM2中使用Network Monitor抓包看一下,发现的确捕获到了10.0.0.4到10.0.0.68的ICMP报文:
但是发现了一个现象,只有10.0.0.4到10.0.0.68的包,并没有返回的包,但是ping的结果的确是通了:
这是因为,我们只配置了从Subnet-1到Subnet-3的路由,而反过来的路由还是会走系统的默认路由。接下来我们再配置一个反向的路由表:
New-AzureRouteTable -NameDanTestRouteTable2 -Location "China East"
Get-AzureRouteTable -Name DanTestRouteTable2| Set-AzureRoute -RouteName dantestroute1 -AddressPrefix 10.0.0.0/27-NextHopType VirtualAppliance -NextHopIpAddress 10.0.0.36
Set-AzureSubnetRouteTable-VirtualNetworkName DanEastVNET -SubnetName Subnet-3 -RouteTableNameDanTestRouteTable2
完成配置之后,再ping一下并在DanTestVM2上抓包,就可以看到能够抓到双向的数据包了:
配置完成后,Dan08Test(Subnet-3)的路由表: