Azure 中的默认出站访问

在 Azure 中,在没有显式定义的出站连接方法的情况下将虚拟机(VM)部署到虚拟网络中时,会自动为其分配出站公共 IP 地址。 此 IP 地址支持从资源到 Internet 以及 Microsoft 内的其他公共终结点的出站连接。 此访问称为“默认出站访问”。

虚拟机的显式出站连接示例包括:

  • 部署在与 NAT 网关关联的子网中。
  • 已在定义了出站规则的标准负载均衡器后端池中部署。
  • 已在基本公共负载均衡器后端池中部署。
  • 具有与之显式关联的公共 IP 地址的虚拟机。

显式出站选项示意图。

如何以及何时提供默认出站访问

如果部署虚拟机(VM)时没有显式出站连接方法,Azure 会为其分配默认出站公共 IP 地址。 此 IP(称为默认出站访问 IP)由Microsoft拥有,可以不通知更改。 不建议将其用于生产工作负载。

图中显示了默认出站访问的决策树。

重要

2025 年 9 月 30 日之后,新的虚拟网络将默认使用专用子网,意味着必须启用显式的出站方法,以便能够访问 Internet 和 Microsoft 内的公共终结点。 有关详细信息,请查看官方公告。 建议使用以下部分中所述的显式连接形式之一。

  • 安全性:默认 Internet 访问与零信任原则相矛盾。

  • 明确性:显式连接优先于隐式访问。

  • 稳定性:默认出站 IP 不是客户拥有的,可能会更改,从而导致潜在的中断。

使用默认出站访问时不起作用的配置的一些示例:

  • VM 上的多个 NIC 可能会产生不一致的出站 IP
  • 扩展 VM 规模集可能会导致更改出站 IP 地址
  • 跨 VMSS 实例的出站 IP 不一致或连续

另外,

  • 默认出站访问 IP 不支持分段数据包
  • 默认出站访问 IP 不支持 ICMP ping

如何转换到公共连接的显式方法 (并禁用默认出站访问)?

专用子网概述

  • 创建专用子网可防止子网中的任何虚拟机利用默认出站访问连接到公共终结点。
  • 私有子网上的 VM 仍可以使用显式的外部连接访问 Internet(或 Microsoft 内的任何公共终结点)。

    注意

    某些服务在专用子网中没有明确出口方法的虚拟机上无法正常运行(例如 Windows 激活和 Windows 更新)。

如何配置专用子网

  • 在 Azure 门户中,选择子网并选择复选框以启用专用子网,如下所示:

Azure 门户的屏幕截图,其中显示了“专用子网”选项。

  • 以下脚本使用 PowerShell 获取资源组和虚拟网络的名称,并循环访问每个子网以启用专用子网。
$resourceGroupName = ""
$vnetName = ""
 
$vnet = Get-AzVirtualNetwork -ResourceGroupName $resourceGroupName -Name $vnetName
 
foreach ($subnet in $vnet.Subnets) {
    if ($subnet.DefaultOutboundAccess -eq $null) {
        $subnet.DefaultOutboundAccess = $false
        Write-Output "Set 'defaultoutboundaccess' to \$false for subnet: $($subnet.Name)"
    } 
    elseif ($subnet.DefaultOutboundAccess -eq $false) {
        # Output message if the value is already $false
        Write-Output "already private for subnet: $($subnet.Name)"
    }
}
Set-AzVirtualNetwork -VirtualNetwork $vnet
az network vnet subnet update --resource-group rgname --name subnetname --vnet-name vnetname --default-outbound false
  • 使用 Azure 资源管理器模板将 defaultOutboundAccess 参数的值设置为“false”
{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "vnetName": {
      "type": "string",
      "defaultValue": "testvm-vnet"
    },
    "subnetName": {
      "type": "string",
      "defaultValue": "default"
    },
    "subnetPrefix": {
      "type": "string",
      "defaultValue": "10.1.0.0/24"
    },
    "vnetAddressPrefix": {
      "type": "string",
      "defaultValue": "10.1.0.0/16"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Network/virtualNetworks",
      "apiVersion": "2023-11-01",
      "name": "[parameters('vnetName')]",
      "location": "westus2",
      "properties": {
        "addressSpace": {
          "addressPrefixes": [
            "[parameters('vnetAddressPrefix')]"
          ]
        },
        "subnets": [
          {
            "name": "[parameters('subnetName')]",
            "properties": {
              "addressPrefix": "[parameters('subnetPrefix')]",
              "defaultoutboundaccess": false
            }
          }
        ]
      }
    }
  ]
}

专用子网的限制

  • 若要激活或更新虚拟机操作系统(例如 Windows),需要显式出站连接方法。

  • 在使用用户定义的路由 (UDR) 的配置中,任何配置的下一个跃点类型为 Internet 的路由都会在专用子网中断开。

    • 一个常见示例是使用 UDR 将流量引导到上游网络虚拟设备/防火墙,但某些 Azure 服务标记除外,以绕过检查。

      • 目标 0.0.0.0/0 的默认路由在一般情况下应用于下一跃点类型为虚拟设备。

      • 一个或多个路由被配置为服务标记目标,并具有Internet的下一跃点类型,以绕过 NVA/防火墙。 除非还为连接到这些目标的源配置显式出站连接方法,否则尝试连接到这些目标会失败,因为默认出站访问不可用。

    • 此限制不适用于使用服务终结点,其使用的下一跃点类型不同 VirtualNetworkServiceEndpoint。 请参阅 虚拟网络服务终结点

  • 专用子网不适用于用于托管 PaaS 服务的委派或托管子网。 在这些方案中,出站连接由单个服务管理。

添加显式出站方法

  • 将 NAT 网关关联到虚拟机的子网。 请注意,这是大多数方案的建议方法。
  • 关联一个已配置了出站规则的标准负载均衡器。
  • 将标准公共 IP 关联到虚拟机的任何网络接口(如果有多个网络接口,使单个 NIC 具有标准公共 IP 将阻止虚拟机的默认出站访问)。
  • 将防火墙或网络虚拟设备(NVA)添加到虚拟网络,并使用用户定义的路由(UDR)将流量指向它。

注意

有一个 NIC 级参数(defaultOutboundConnectivityEnabled),用于跟踪是否使用默认出站访问。 顾问“添加显式出站方法以禁用默认出站”通过检查此参数来运行。

重要

需要停止/解除分配子网中适用的虚拟机,才能反映更改和清除作。 (反过来也是如此;为了使计算机在子网级参数设置为 false 后获得默认出站 IP,需要停止/解除分配虚拟机。)

使用灵活的编排模式管理虚拟机规模集

  • 默认情况下,灵活的规模集是安全的。 通过灵活规模集创建的任何实例都不会拥有与其关联的默认出站访问 IP,因此需要显示出站方法。 如需了解详细信息,请参阅适用于虚拟机规模集的灵活业务流程模式

后续步骤

有关 Azure 中的出站连接的详细信息,请参阅: