Azure Functions 网络选项

本文介绍适用于 Azure Functions 的托管选项的网络功能。 通过以下所有网络选项,你可以在不使用可通过 Internet 路由的地址的情况下访问资源,或限制对函数应用的 Internet 访问。

托管模型提供不同级别的网络隔离。 选择正确模型有助于满足网络隔离要求。

可以通过多种方式托管函数应用:

  • 可以从在多租户基础结构上运行的计划选项中进行选择,其中包含不同级别的虚拟网络连接和缩放选项:
    • 消耗计划会动态缩放以响应负载,并提供最少的网络隔离选项。
    • 高级计划也可以动态缩放,并提供更全面的网络隔离。
    • Azure 应用服务计划按固定规模运行,提供类似于高级计划的网络隔离。
  • 可以在应用服务环境中运行函数。 此方法可以将函数部署到虚拟网络中,并且可以进行完全的网络控制和隔离。

网络功能矩阵

功能 消耗计划 高级计划 专用计划 ASE Kubernetes
入站 IP 限制和专用站点访问 ✅是 ✅是 ✅是 ✅是 ✅是
虚拟网络集成 ❌否 ✅是(区域) ✅是(区域和网关) ✅是 ✅是
虚拟网络触发器(非 HTTP) ❌否 ✅是 ✅是 ✅是 ✅是
混合连接(仅限 Windows) ❌否 ✅是 ✅是 ✅是 ✅是
出站 IP 限制 ❌否 ✅是 ✅是 ✅是 ✅是

入站访问限制

可以使用访问限制来定义被允许或拒绝访问应用的 IP 地址的优先级排序列表。 此列表可以包含 IPv4 和 IPv6 地址,或使用服务终结点的特定虚拟网络子网。 如果存在一个或多个条目,则列表末尾会存在一个隐式的“拒绝所有”。 IP 限制适用于所有函数托管选项。

访问限制在高级消耗应用服务中提供。

备注

如果进行了网络限制,则只能从虚拟网络内部进行部署,或者在已将用于访问 Azure 门户的计算机的 IP 地址加入安全收件人列表之后进行部署。 不过,你仍然可以使用门户管理该函数。

若要了解详细信息,请参阅 Azure 应用服务静态访问限制

使用服务终结点

使用服务终结点可以限制对所选 Azure 虚拟网络子网的访问。 若要限制对特定子网的访问,请使用“虚拟网络”类型创建限制规则。 然后,可以选择要允许或拒绝访问的订阅、虚拟网络和子网。

如果尚未为所选子网的 Microsoft.Web 启用服务终结点,它们会自动启用,除非你选择了“忽略缺少的 Microsoft.Web 服务终结点”复选框。 在应用上而不是子网上启用服务终结点的方案主要取决于你是否有权在子网上启用它们。

如果需要其他人在子网上启用服务终结点,请选择“忽略缺少的 Microsoft.Web 服务终结点”复选框。 将为服务终结点配置应用,以便稍后在子网中启用它们。

“添加 IP 限制”窗格的屏幕截图,其中选择了虚拟网络类型。

不能使用服务终结点来限制对在应用服务环境中运行的应用程序的访问。 当应用处于应用服务环境中时,可以应用 IP 访问规则来控制对它的访问。

若要了解如何设置服务终结点,请参阅建立 Azure Functions 专用站点访问

专用终结点连接

Azure 专用终结点是一种网络接口,你可通过该接口私密安全地连接到由 Azure 专用链接提供支持的服务。 专用终结点使用虚拟网络中的专用 IP 地址,从而将该服务有效地引入虚拟网络。

可以将专用终结点用于高级应用服务计划中托管的函数。

为函数创建入站专用终结点连接时,还需要一个 DNS 记录来解析专用地址。 默认情况下,使用 Azure 门户将在创建专用终结点时创建专用 DNS 记录。

若要调用具有专用终结点连接的其他服务(如存储或服务总线),请确保将应用配置为对专用终结点进行出站调用

虚拟网络集成

通过虚拟网络集成,函数应用可以访问虚拟网络中的资源。 Azure Functions 支持两种类型的虚拟网络集成:

  • 支持除独立定价计划以外的全部定价计划的多租户系统。
  • 部署到 VNet 中且支持独立定价计划应用的应用服务环境。

VNet 集成功能用于多租户应用。 如果应用在应用服务环境中,则该应用已处于 VNet 中且不需要使用 VNet 集成功能来获取同一 VNet 中的资源。 有关所有网络功能的详细信息,请参阅应用服务网络功能

VNet 集成允许应用访问 VNet 中的资源,但不允许通过 VNet 对应用进行入站专用访问。 专用站点访问指的是仅可从专用网络(例如 Azure 虚拟网络)对应用进行访问。 VNet 集成仅用来从应用对 VNet 进行出站调用。 VNet 集成功能可以用于同一区域中的 VNet,也可用于其他区域中的 VNet,这两种情况下的行为有所不同。 VNet 集成功能有两种变体:

  • 需要网关的 VNet 集成:连接到其他区域中的 VNet 或同一区域中的经典虚拟网络时,需要在目标 VNet 中预配 Azure 虚拟网关。

VNet 集成功能:

  • 需要“标准”、“高级”、“高级 V2”或“弹性高级”定价计划。
  • 支持 TCP 和 UDP。
  • 适用于 Azure 应用服务应用和函数应用。

VNet 集成不支持某些功能,例如:

  • 装载驱动器。
  • Active Directory 集成。
  • NetBIOS。

需要网关的 VNet 集成只允许访问目标 VNet 中的资源,或者访问通过对等互连或 VPN 连接到目标 VNet 的网络中的资源。 需要网关的 VNet 集成不支持访问可通过 Azure ExpressRoute 连接使用的资源,也不适用于服务终结点。

无论使用哪个版本,VNet 集成都允许应用访问 VNet 中的资源,但不允许通过 VNet 对应用进行入站专用访问。 专用站点访问指的是仅可从专用网络(例如 Azure VNet)对应用进行访问。 VNet 集成只是为了从应用对 VNet 进行出站调用。

Azure Functions 中的虚拟网络集成将共享基础结构与应用服务 Web 应用结合使用。 若要详细了解这两种类型的虚拟网络集成,请参阅:

若要了解如何设置虚拟网络集成,请参阅将函数应用与 Azure 虚拟网络集成

区域虚拟网络集成

通过区域 VNet 集成,应用可以访问:

  • 在应用所在区域的 VNet 中的资源。
  • 与应用集成的 VNet 建立了对等互连的 VNet 中的资源。
  • 服务终结点保护的服务。
  • 跨 Azure ExpressRoute 连接的资源。
  • 集成的 VNet 中的资源。
  • 跨对等连接的资源,包括 Azure ExpressRoute 连接。
  • 专用终结点

在同一区域中的 VNet 中使用 VNet 集成时,可以使用以下 Azure 网络功能:

  • 网络安全组 (NSG) :可以使用集成子网上的 NSG 阻止出站流量。 入站规则不适用,因为无法使用 VNet 集成来提供对应用的入站访问。
  • 路由表 (UDR) :可以在集成子网上放置路由表,以便将出站流量发送到所需的位置。

默认情况下,应用只将 RFC1918 流量路由到 VNet。 如果要将所有出站流量路由到 VNet,请使用以下步骤在应用中添加 WEBSITE_VNET_ROUTE_ALL 设置:

  1. 转到应用门户中的“配置”UI。 选择“新应用程序设置”。

  2. 在“名称”框中输入 WEBSITE_VNET_ROUTE_ALL,然后在“值”框中输入 1

    提供应用程序设置

  3. 选择“确定”。

  4. 选择“保存”。

备注

如果将所有出站流量路由到 VNet,它会受应用于集成子网的 NSG 和 UDR 的约束。 如果 WEBSITE_VNET_ROUTE_ALL 设置为 1,出站流量还是会从应用属性中列出的地址发送,除非提供可将流量定向到其他位置的路由。

区域 VNet 集成无法使用端口 25。

在同一区域的 VNet 中使用 VNet 集成存在一些限制:

  • 无法跨全球对等互连连接访问资源。
  • 高级版 V2 和高级版 V3 中的所有应用服务缩放单元均提供此功能。 此功能在标准版中也可用,但只能从较新的应用服务缩放单元中使用。 如果使用较旧的缩放单元,则只能通过高级版 V2 应用服务计划使用此功能。 如果想确保能够在标准应用服务计划中使用该功能,请在高级版 V3 应用服务计划中创建应用。 这些计划仅在我们最新的缩放单元上得到支持。 如果需要,之后可以纵向缩减。
  • 集成子网只能由一个应用服务计划使用。
  • 应用服务环境中的独立计划应用无法使用此功能。
  • 该功能需要一个未使用的子网,该子网在 Azure 资源管理器 VNet 中为 /28 或更大。
  • 应用和 VNet 必须位于同一区域中。
  • 不能删除带有集成应用的 VNet。 在删除 VNet 之前删除集成。
  • 每个应用服务计划只能有一个区域 VNet 集成。 同一应用服务计划中的多个应用可以使用同一 VNet。
  • 当某个应用使用区域 VNet 集成时,无法更改应用或计划的订阅。
  • 如果不更改配置,应用就无法解析 Azure DNS 专用区域中的地址。

VNet 集成取决于专用子网。 预配子网时,Azure 子网从一开始就丢失 5 个 IP。 每个计划实例使用集成子网中的一个地址。 如果将应用缩放到 4 个实例,则使用 4 个地址。

增加或缩减大小时,所需的地址空间会在短时间内增加一倍。 对于指定的子网大小,这会影响其实际可用的受支持实例。 下表显示了每个 CIDR 块的最大可用地址数,以及这对横向缩放的影响:

CIDR 块大小 最大可用地址数 最大横向缩放(实例)数*
/28 11 5
/27 27 13
/26 59 29

*假设需要在某些时候增加或缩减大小或 SKU。

由于子网大小不能在分配后更改,请使用足够大的子网来容纳应用可能会达到的任何规模。 若要避免子网容量出现任何问题,应使用包含 64 个地址的 /26。

如果希望另一个计划中的应用访问已由其他计划中的应用连接到的 VNet,请选择与预先存在的 VNet 集成所用的子网不同的子网。

Windows 和 Linux 应用都完全支持此功能。

服务终结点

通过区域 VNet 集成能够访问通过服务终结点保护的 Azure 服务。 若要访问服务终结点保护的服务,必须执行以下操作:

  1. 配置 Web 应用的区域 VNet 集成,以连接到用于集成的特定子网。
  2. 转到目标服务并针对集成子网配置服务终结点。

网络安全组

可以使用网络安全组阻止 VNet 中资源的入站和出站流量。 使用区域 VNet 集成的应用可以使用 [网络安全组][VNETnsg] 阻止 VNet 或 Internet 中资源的出站流量。 若要阻止流量进入公共地址,必须将应用程序设置 WEBSITE_VNET_ROUTE_ALL 设为 1。 NSG 中的入站规则不适用于你的应用,因为 VNet 集成只影响来自你的应用的出站流量。

若要控制应用的入站流量,请使用访问限制功能。 无论应用到集成子网的路由如何,应用到集成子网的 NSG 都有效。 如果 WEBSITE_VNET_ROUTE_ALL 设置为 1,并且集成子网上没有任何影响公共地址流量的路由,则所有出站流量仍受分配给集成子网的 NSG 的影响。 如果未设置 WEBSITE_VNET_ROUTE_ALL,则 NSG 仅应用于 RFC1918 流量。

路由

可以使用路由表将出站流量从应用路由到你所需的任何位置。 默认情况下,路由表只影响 RFC1918 目标流量。 如果将 WEBSITE_VNET_ROUTE_ALL 设为 1,则所有出站调用都会受到影响。 在集成子网上设置的路由不会影响对入站应用请求的答复。 常见目标可以包括防火墙设备或网关。

如果要路由本地的所有出站流量,可以使用路由表将所有出站流量发送到 ExpressRoute 网关。 如果确实要将流量路由到网关,请确保在外部网络中设置路由以发回任何回复。

边界网关协议 (BGP) 路由也会影响你的应用流量。 如果具有来自 ExpressRoute 网关等位置的 BGP 路由,应用出站流量会受到影响。 默认情况下,BGP 路由只影响 RFC1918 目标流量。 如果 WEBSITE_VNET_ROUTE_ALL 设为 1,则所有出站流量都会受到 BGP 路由的影响。

Azure DNS 专用区域

在应用与 VNet 集成后,它将使用 VNet 配置的 DNS 服务器。 默认情况下,应用不能用于 Azure DNS 专用区域。 若要使用 Azure DNS 专用区域,需要添加以下应用设置:

  1. 值为 168.63.129.16WEBSITE_DNS_SERVER
  2. 值为 1WEBSITE_VNET_ROUTE_ALL

这些设置会将所有出站调用从应用发送到 VNet,还允许应用访问 Azure DNS 专用区域。 借助这些设置,应用可通过在辅助角色级别查询 DNS 专用区域来使用 Azure DNS。

专用终结点

如果要调用 [专用终结点][privateendpoints],必须确保 DNS 查找解析到专用终结点。 可以使用以下方式之一强制执行此行为:

  • 与 Azure DNS 专用区域集成。 如果 VNet 没有自定义 DNS 服务器,则会自动执行此操作。
  • 管理 DNS 服务器中由你的应用使用的专用终结点。 为此,你需要知道专用终结点地址,然后用 A 记录将你尝试连接的终结点指向该地址。
  • 将你自己的 DNS 服务器配置为转发到 Azure DNS 专用区域。

连接到服务终结点保护的资源

若要提供更高级别的安全性,可以使用服务终结点将一些 Azure 服务限制到一个虚拟网络中。 随后必须将函数应用与该虚拟网络集成才能访问资源。 支持虚拟网络集成的所有计划都支持此配置。

若要了解详细信息,请参阅虚拟网络服务终结点

将存储帐户限制到虚拟网络中

创建函数应用时,必须创建或链接到支持 Blob、队列和表存储的常规用途的 Azure 存储帐户。 可以将此存储帐户替换为服务终结点或专用终结点所保护的存储帐户。

专用(应用服务)计划中所有 Windows 虚拟网络支持的 SKU 和高级计划支持此功能。 对于 Linux 虚拟网络支持的 SKU,专用 DNS 也支持此功能。 不支持消耗计划以及 Linux 计划上的自定义 DNS。 若要了解如何使用限制到专用网络的存储帐户设置函数,请参阅将存储帐户限制到虚拟网络中

使用 Key Vault 引用

可以在不需进行任何代码更改的情况下,通过 Azure Key Vault 引用在 Azure Functions 应用程序中使用 Azure Key Vault 中的机密。 Azure Key Vault 是一项服务,可以提供集中式机密管理,并且可以完全控制访问策略和审核历史记录。

目前,如果密钥保管库使用服务终结点进行保护,则 Key Vault 引用不起作用。 若要使用虚拟网络集成连接到密钥保管库,需要在应用程序代码中调用 Key Vault。

虚拟网络触发器(非 HTTP)

目前,可以通过以下两种方式之一从虚拟网络内使用非 HTTP 触发器函数:

  • 在高级计划中运行函数应用,并启用虚拟网络触发器支持。
  • 在应用服务计划或应用服务环境中运行函数应用。

具有虚拟网络触发器的高级计划

运行高级计划时,可以将非 HTTP 触发器函数连接到在虚拟网络中运行的服务。 为此,必须为函数应用启用虚拟网络触发器支持。 在 Azure 门户的“配置” > “函数运行时设置”下可以找到“运行时规模监视”设置。

VNETToggle

还可以使用以下 Azure CLI 命令启用虚拟网络触发器:

az resource update -g <resource_group> -n <function_app_name>/config/web --set properties.functionsRuntimeScaleMonitoringEnabled=1 --resource-type Microsoft.Web/sites

提示

启用虚拟网络触发器可能会影响应用程序的性能,因为应用服务计划实例需要监视触发器来确定何时缩放。 这种影响可能非常小。

版本 2.x 和更高版本的 Functions 运行时支持虚拟网络触发器。 支持以下非 HTTP 触发器类型。

分机 最低版本
Microsoft.Azure.WebJobs.Extensions.Storage 3.0.10 或更高版本
Microsoft.Azure.WebJobs.Extensions.EventHubs 4.1.0 或更高版本
Microsoft.Azure.WebJobs.Extensions.ServiceBus 3.2.0 或更高版本
Microsoft.Azure.WebJobs.Extensions.CosmosDB 3.0.5 或更高版本
Microsoft.Azure.WebJobs.Extensions.DurableTask 2.0.0 或更高版本

重要

启用虚拟网络触发器支持时,只有上表中显示的触发器类型才能随应用程序进行动态缩放。 仍可以使用不在该表中的触发器,但它们不会缩放到超出其预热实例计数。 有关触发器的完整列表,请参阅触发器和绑定

具有虚拟网络触发器的应用服务计划和应用服务环境

函数应用在应用服务计划或应用服务环境中运行时,可以使用非 HTTP 触发器函数。 若要使函数可正确触发,必须使用可以访问触发器连接中定义的资源的访问权限来连接到虚拟网络。

例如,假设要将 Azure Cosmos DB 配置为仅接受来自虚拟网络的流量。 在这种情况下,必须在提供虚拟网络与该虚拟网络集成的应用服务计划中部署函数应用。 集成使函数可以由该 Azure Cosmos DB 资源触发。

混合连接

混合连接是可用于访问其他网络中的应用程序资源的一项 Azure 中继功能。 使用混合连接可以从应用访问应用程序终结点。 无法使用它访问应用程序。 在除消耗计划之外的所有计划中,混合连接可用于 Windows 上运行的函数。

在 Azure Functions 中使用时,每个混合连接与单个 TCP 主机和端口组合相关联。 这意味着,混合连接终结点可以位于任何操作系统和任何应用程序上,前提是你能够访问 TCP 侦听端口。 混合连接功能不知道也不关心应用程序协议或者要访问的内容是什么。 它只提供网络访问。

有关详细信息,请参阅应用服务文档中的“混合连接”。 Azure Functions 支持这些相同配置步骤。

重要

只有 Windows 计划才支持混合连接。 不支持 Linux。

出站 IP 限制

高级计划、应用服务计划或应用服务环境中提供出站 IP 限制。 可以为部署应用服务环境的虚拟网络配置出站限制。

将高级计划或应用服务计划中的函数应用与虚拟网络集成时,默认情况下,应用仍可对 Internet 进行出站呼叫。 通过添加应用程序设置 WEBSITE_VNET_ROUTE_ALL=1,可强制将所有出站流量发送到虚拟网络中,在其中可以使用网络安全组规则限制流量。

若要了解如何使用虚拟网络控制出站 IP,请参阅教程:使用 Azure 虚拟网络 NAT 网关控制 Azure Functions 出站 IP

自动化

以下 API 可让你以编程方式管理区域虚拟网络集成:

故障排除

虽然此功能很容易设置,但这并不意味着你的体验不会遇到任何问题。 如果在访问所需终结点时遇到问题,可以使用某些实用程序来测试从应用控制台发出的连接。 可以使用两种控制台。 一种是 Kudu 控制台,另一种是 Azure 门户中的控制台。 若要访问应用中的 Kudu 控制台,请转到“工具” > “Kudu”。 此外,还可以通过 [sitename].scm.chinacloudsites.cn 访问 Kudo 控制台。 打开网站负载后,转到“调试控制台”选项卡。若要从应用访问 Azure 门户托管的控制台,请转到“工具” > “控制台”。

工具

由于存在安全约束,因此无法通过控制台运行 ping、nslookup 和 tracert 工具 。 为了填补此空白,我们添加了两个单独的工具。 我们添加了名为 nameresolver.exe 的工具,用于测试 DNS 功能。 语法为:

nameresolver.exe hostname [optional: DNS Server]

可以使用 nameresolver 来检查应用所需的主机名。 可以通过这种方式来测试 DNS 是否配置错误,或者测试你是否有权访问 DNS 服务器。 若要了解可供应用在控制台中使用的 DNS 服务器,请查看环境变量 WEBSITE_DNS_SERVER 和 WEBSITE_DNS_ALT_SERVER。

可以使用下一工具测试与主机的 TCP 连接情况,以及端口组合情况。 该工具名为 tcpping,语法为:

tcpping.exe hostname [optional: port]

tcpping 实用程序会告知是否可访问特定主机和端口。 只有满足以下条件才会显示成功:存在侦听主机和端口组合的应用程序,且可从应用对指定主机和端口进行网络访问。

调试对虚拟网络托管的资源的访问

许多因素可能会阻止应用访问特定的主机和端口。 大多数情况下为以下因素之一:

  • 存在防火墙。 如果存在防火墙,则会发生 TCP 超时。 本例中的 TCP 超时为 21 秒。 使用 tcpping 工具测试连接性。 除了防火墙外,还有多种原因可能导致 TCP 超时。
  • DNS 不可访问。 每个 DNS 服务器的 DNS 超时为 3 秒。 如果具有 2 个 DNS 服务器,则超时为 6 秒。 使用 nameresolver 查看 DNS 是否正常工作。 不能使用 nslookup,因为它不使用为虚拟网络配置的 DNS。 如果无法访问,则表明可能有防火墙或 NSG 在阻止对 DNS 的访问,或者该 DNS 可能已停机。

如果这些方法未解决问题,请首先检查以下因素:

需要网关的 VNet 集成

  • 点到站点地址范围是否在 RFC 1918 范围内 (10.0.0.0-10.255.255.255 / 172.16.0.0-172.31.255.255 / 192.168.0.0-192.168.255.255)?
  • 网关在门户中是否显示为已启动? 如果网关处于关闭状态,则将其重新启动。
  • 证书是否显示正在同步?或者,你是否怀疑网络配置已更改? 如果证书未同步,或者你怀疑对虚拟网络配置做出了与 ASP 不同步的更改,请选择“同步网络”。
  • 如果通过 VPN 传输,本地网关是否配置为将流量路由回 Azure? 如果可以访问虚拟网络中的终结点,但不能访问本地的终结点,请检查路由。
  • 你是否正在尝试使用一个既支持点到站点连接,又支持 ExpressRoute 的共存网关? VNet 集成不支持共存网关。

调试网络问题很有难度,因为你看不到哪些因素在阻止访问特定的“主机:端口”组合。 部分原因包括:

  • 在主机上开启了防火墙,导致无法从点到站点 IP 范围访问应用程序端口。 跨子网通常需要公共访问权限。
  • 目标主机已关闭。
  • 应用程序已关闭。
  • IP 或主机名错误。
  • 应用程序所侦听的端口与你预期的端口不同。 可以使用终结点主机上的“netstat -aon”匹配进程 ID 和侦听端口。
  • 网络安全组的配置方式导致无法从点到站点 IP 范围访问应用程序主机和端口。

你不知道应用实际使用的地址。 它可能是集成子网中或点到站点地址范围内的任意地址,因此你需要允许从整个地址范围进行访问。

其他调试步骤包括:

  • 连接到虚拟网络中的某个 VM,尝试在该处访问资源主机:端口。 若要针对 TCP 访问权限进行测试,请使用 PowerShell 命令 test-netconnection。 语法为:
test-netconnection hostname [optional: -Port]
  • 在某个 VM 中启动应用程序,然后使用 tcpping 测试能否在应用的控制台中访问该主机和端口。

本地资源

如果应用无法访问本地资源,请检查是否能够通过虚拟网络访问该资源。 请使用 test-netconnection PowerShell 命令来针对 TCP 访问权限进行测试。 如果 VM 无法访问本地资源,原因可能是未正确配置 VPN 或 ExpressRoute 连接。

如果虚拟网络托管的 VM 能够访问本地系统但应用无法访问,则可能是由于以下某个原因:

  • 在本地网关中未使用子网或点到站点地址范围配置路由。
  • 网络安全组阻止点到站点 IP 范围的访问。
  • 本地防火墙阻止来自点到站点 IP 范围的流量。

后续步骤

若要详细了解网络和 Azure Functions: