实现虚拟网络流量路由
Azure 自动为 Azure 虚拟网络中的每个子网创建一个路由表,然后向该表添加系统默认路由。 可以使用自定义路由替代 Azure 的部分系统路由,并向路由表添加其他自定义路由。 Azure 根据子网的路由表中的路由,从子网路由出站流量。
系统路由
Azure 自动创建系统路由,并将路由分配到虚拟网络中的每个子网。 无法创建或删除系统路由,但可以使用自定义路由替代某些系统路由。 当你使用特定的 Azure 功能时,Azure 为每个子网创建默认系统路由,并向特定子网或每个子网添加其他可选默认路由。
默认路由
每个路由包含地址前缀和下一跃点类型。 将离开子网的流量发送到某个路由的地址前缀中的 IP 地址时,包含前缀的该路由是 Azure 使用的路由。 只要创建了虚拟网络,Azure 就会自动为虚拟网络中的每个子网创建下述默认的系统路由:
Source
地址前缀
下一跃点类型
默认
对虚拟网络唯一
虚拟网络
默认
0.0.0.0/0
Internet
默认
10.0.0.0/8
无
默认
192.168.0.0/16
无
默认
100.64.0.0/10
无
在路由术语中,跃点是整个路由的路标。 因此,下一个跃点是流量在前往其最终目的地的过程中定向到的下一个路标。 上表中列出的下一跃点类型表示 Azure 如何路由目标为所列地址前缀的流量。 下一个跃点类型定义如下:
虚拟网络:在虚拟网络的地址空间中的地址范围之间路由流量。 Azure 使用地址前缀创建路由,该前缀对应的每个地址范围是在虚拟网络的地址空间中定义的。 Azure 使用为每个地址范围创建的路由在子网之间自动路由流量。
Internet:将地址前缀指定的流量路由到 Internet。 系统默认路由指定 0.0.0.0/0 地址前缀。 Azure 将虚拟网络中未由地址范围指定的任何地址的流量路由到 Internet,除非目标地址是某项 Azure 服务的地址。 Azure 通过主干网络将目标地址为其服务的地址的任何流量直接路由到服务,而不是将流量路由到 Internet。 可以将 0.0.0.0/0 地址前缀对应的 Azure 默认系统路由替代为自定义路由。
无:系统会将路由到“无”下一个跃点类型的流量删除,而不是将其路由到子网外。 Azure 自动为以下地址前缀创建默认路由:
- 10.0.0.0/8、172.16.0.0/12 和 192.168.0.0/16:在 RFC 1918 中保留专用。
- 100.64.0.0/10:保留在 RFC 6598 中使用。
如果将上述任何地址范围分配到虚拟网络的地址空间中,Azure 会自动将路由的下一跃点类型从“无”更改为“虚拟网络”。 如果将地址范围分配到虚拟网络的地址空间时,该地址空间包括四个保留地址前缀中的一个,但与其并不相同,则 Azure 会删除该前缀对应的路由,为你所添加的地址前缀添加一个路由,并使用“虚拟网络”作为下一跃点类型。
可选默认路由
Azure 为你启用的任何 Azure 功能添加默认系统路由。 Azure 会根据功能将可选的默认路由添加到虚拟网络中的特定子网,或者添加到虚拟网络中的所有子网。 启用不同的功能时,Azure 可能添加的其他系统路由和下一跃点类型为:
Source
地址前缀
下一跃点类型
将路由添加到的虚拟网络的子网
默认
对虚拟网络唯一,例如:10.1.0.0/16
VNet 对等互连
All
虚拟网络网关
从本地通过 BGP 播发的前缀,或者在本地网关中配置的前缀
虚拟网络网关
All
默认
多个
虚拟网络服务终结点
仅为其启用服务终结点的子网
虚拟网络 (VNet) 对等互连:在两个虚拟网络之间创建虚拟网络对等互连时,会为每个虚拟网络的地址空间中的每个地址范围添加一个路由。
虚拟网络网关:向虚拟网络添加虚拟网络网关时,Azure 会添加一个或多个将“虚拟网络网关”作为下一个跃点类型的路由。 源作为“虚拟网络网关”列出,因为网关向子网添加路由。
VirtualNetworkServiceEndpoint:当你启用服务的服务终结点时,Azure 会将特定服务的公共 IP 地址添加到路由表中。 服务终结点是为虚拟网络中的单个子网启用的,因此仅将路由添加到为其启用了服务终结点的子网的路由表。 Azure 服务的公共 IP 地址会定期更改,并且 Azure 会在必要时管理对路由表的更新。
“VNet 对等互连”和“虚拟网络服务终结点”下一跃点类型仅添加到通过 Azure 资源管理器部署模型创建的虚拟网络中子网的路由表。 下一跃点类型不添加到通过经典部署模型与虚拟网络子网关联的路由表。
自定义路由
为了更精确地控制网络流量的路由方式,可以使用自己的用户定义路由 (UDR) 来替代 Azure 创建的默认路由。 如果要确保两个子网之间的流量通过防火墙设备,或者要确保 VNet 中的流量无法路由到 Internet,可借助此方法。
用户定义路由
可以在 Azure 中创建自定义或用户定义(静态)路由,以便替代 Azure 的默认系统路由,或者向子网的路由表添加其他路由。
在 Azure 中,每个子网可以有零个或一个关联的路由表。 当你创建一个路由表并将其与子网相关联时,表中的路由将与 Azure 添加到子网的默认路由组合在一起,或者替代这些默认路由。
可以在创建用户定义路由时指定下面的下一跃点类型:
虚拟设备:虚拟设备是通常情况下运行防火墙等网络应用程序的虚拟机。 使用“虚拟设备”跃点类型创建路由时,也指定下一跃点 IP 地址。 IP 地址可以是:
- 附加到虚拟机的网络接口的专用 IP 地址。
- Azure 内部负载均衡器的专用 IP 地址。
虚拟网络网关:需要将目标为特定地址前缀的流量路由到虚拟网络网关时,请指定此项。 创建虚拟网关时,类型必须为“VPN”。
无:需要丢弃流向某个地址前缀的流量,而不是将该流量转发到目标时,请指定此项。
虚拟网络:需要替代虚拟网络中的默认路由时,请指定此项。
Internet:需要将目标为某个地址前缀的流量显式路由到 Internet 时,或者需要将流量的目标设定为 Azure 服务,且公共 IP 地址始终位于 Azure 主干网络内时,请指定此项。
配置用户定义的路由
下面是虚拟网络包含三个子网的示例。
- 子网为前端、DMZ 和后端。 DMZ 子网中有一个网络虚拟设备 (NVA)。 NVA 是帮助实现网络功能(例如路由和防火墙优化)的 VM。
- 你希望确保来自前端子网的所有流量都通过 NVA 流向后端子网。
创建路由表
创建路由表的步骤非常简单。 提供“名称”、“订阅”、“资源组”和“位置”。 你还需要决定使用虚拟网络网关路由传播。
路由会自动添加到所有启用了“虚拟网络网关传播”的子网的路由表中。 使用 ExpressRoute 时,传播可确保所有子网都获得路由信息。
创建自定义路由
在本示例中,
- 新路由名为 ToPrivateSubnet。
- 专用子网为 10.0.1.0/24。
- 路由使用虚拟设备。 请注意下一个跃点类型的其他选项:“虚拟网络网关”、“虚拟网络”、“Internet”和“无”。
- 虚拟设备位于 10.0.2.4。
总之,此路由适用于 10.0.1.0/24(专用子网)中的任何地址前缀。 流向这些地址的流量将被发送到地址为 10.0.2.4 的虚拟设备。
关联路由表
本示例中的最后一步是将公共子网与新路由表关联。 每个子网可以有一个与之关联的路由表,也可以没有。
注意
默认情况下,使用系统路由时,流量将直接流向专用子网。 但是,使用用户定义的路由,可以强制流量通过虚拟设备。
注意
在此示例中,虚拟设备不应具有公共 IP 地址并且应启用 IP 转发。
使用强制隧道保护 VNet
借助强制隧道,可以通过站点到站点 VPN 隧道,将全部 Internet 绑定流量重定向或“强制”返回到本地位置,以进行检查和审核。 这是很多企业 IT 策略的关键安全要求。 如果未配置强制隧道,来自 Azure 中 VM 的 Internet 绑定流量会始终从 Azure 网络基础结构直接流出到 Internet,而你无法选择对这些流量进行检查或审核。 未经授权的 Internet 访问可能会导致信息泄漏或其他类型的安全漏洞。 可以通过使用 Azure PowerShell 来配置强制隧道。 不能使用 Azure 门户来配置强制隧道。
在以下示例中,前端子网没有使用强制隧道。 前端子网中的工作负载可以继续直接接受并响应来自 Internet 的客户请求。 中间层和后端子网会使用强制隧道。 任何从这两个子网到 Internet 的出站连接都会通过某一站点到站点 (S2S) VPN 隧道强制或重定向回到本地站点。
配置强制隧道
Azure 中的强制隧道是使用虚拟网络自定义用户定义的路由来配置的。
每个虚拟网络子网具有内置的系统路由表。 系统路由表具有以下三组路由:
- 本地 VNet 路由:直接路由到同一个虚拟网络中的目标 VM。
- 本地路由:路由到 Azure VPN 网关。
- 默认路由:直接路由到 Internet。 如果要将数据包发送到不包含在前面两个路由中的专用 IP 地址,数据包会被删除。
若要配置强制隧道,必须执行以下操作:
- 创建一个路由表。
- 将用户定义的默认路由添加到 VPN 网关。
- 将路由表关联到相应的 VNet 子网。
强制隧道必须关联到具有基于路由的 VPN 网关的 VNet。
- 必须在连接到虚拟网络的跨界本地站点之间设置一个默认站点连接。
- 必须使用 0.0.0.0/0 作为流量选择器配置本地 VPN 设备。
使用强制隧道可以从 Azure 中的 VM 或云服务限制和检查 Internet 访问,同时还能继续启用 Internet 访问所需的多层服务体系结构。
配置 Azure 路由服务器
Azure 路由服务器简化了网络虚拟设备 (NVA) 与虚拟网络之间的动态路由。 利用此功能,可以在 Azure 虚拟网络 (VNET) 中任何支持 BGP 路由协议的 NVA 与 Azure 软件定义的网络 (SDN) 之间,直接通过“边界网关协议 (BGP)”路由协议交换路由信息,而无需手动配置或维护路由表。 Azure 路由服务器是一项完全托管的服务,并且配置为具有高可用性。
Azure 路由服务器简化了虚拟网络中 NVA 的配置、管理和部署。
每当虚拟网络地址更新时,你不再需要手动更新 NVA 上的路由表。
每当 NVA 公布新路由或撤消旧路由时,你不再需要手动更新用户定义的路由。
可以将 NVA 的多个实例与 Azure 路由服务器对等互连。 可以在 NVA 中配置 BGP 属性,并根据设计(例如通过主动-主动提高性能,或通过主动-被动实现弹性),让 Azure Route Server 知道哪个 NVA 实例是主动的,哪个是被动的。
NVA 与 Azure 路由服务器之间的接口基于通用标准协议。 只要 NVA 支持 BGP,你就可以将其与 Azure 路由服务器对等互连。
可以在任何新的或现有的虚拟网络中部署 Azure 路由服务器。
了解如何部署 Azure 路由服务器
诊断路由问题
假设在 Azure 虚拟网络中连接到特定虚拟机 (VM) 的尝试永久失败。 可以通过查看 VM 中网络接口的有效路由来诊断路由问题。 子网中所有网络接口的有效路由是你创建的路由、Azure 的默认路由,以及使用边界网关协议 (BGP) 通过 Azure VPN 网关从本地网络传播的任何路由的组合。
可以通过使用 Azure 门户、Azure PowerShell 或 Azure CLI 来查看每个网络接口的有效路由。 以下步骤展示了每种方法的示例。 在每种情况下,只有在 VM 处于“正在运行”状态时,才返回输出。 如果已将多个网络接口附加到 VM,可以查看每个网络接口的有效路由。 由于每个网络接口可能位于不同的子网中,因此,每个网络接口可能有不同的有效路由。
在 Azure 门户中查看有效路由
使用拥有所需权限的 Azure 帐户登录到 Azure 门户。
在搜索框中,输入要调查的 VM 的名称。
从搜索结果中选择“VM”。
在“设置”下,选择“网络”,然后通过选择网络接口资源名称导航到相应网络接口资源。
在“支持和疑难解答”下,选择“有效路由”。 下图展示了名为 myVMNic1 的网络接口的有效路由:
使用 Azure PowerShell 查看有效路由
可以使用 Get-AzEffectiveRouteTable 命令查看网络接口的有效路由。 以下示例获取资源组 myResourceGroup 中名为“myVMNic1”的网络接口的有效路由 :
Get-AzEffectiveRouteTable `
-NetworkInterfaceName myVMNic1 `
-ResourceGroupName myResourceGroup `
解决路由问题
为解决路由问题而可能采取的步骤如下:
- 添加自定义路由以替代默认路由。 了解如何添加自定义路由。
- 更改或删除导致流量被路由到意外位置的自定义路由。 了解如何更改或删除自定义路由。
- 确保将路由表关联到正确的子网(包含网络接口的那个子网)。 了解如何将路由表关联到子网。
- 确保部署的设备(例如 Azure VPN 网关或网络虚拟设备)按预期运行。
为以下各个问题选择最佳答案。