你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

将 Azure API 管理实例部署到虚拟网络 - 内部模式

适用于:开发人员 | 高级

可将 Azure API 管理部署(注入)在 Azure 虚拟网络 (VNet) 内部,以访问该网络中的后端服务。 有关 VNet 连接选项、要求和注意事项,请参阅:

本文介绍如何在内部模式下为 API 管理实例设置 VNet 连接。 在这种模式下,只能在由你控制的 VNet 内访问下列 API 管理终结点。

  • API 网关
  • 开发人员门户
  • 直接管理
  • Git

注意

  • 这些 API 管理终结点均未在公共 DNS 上注册。 在为 VNET 配置 DNS 之前,终结点将保持不可访问状态。
  • 若要在此模式下使用自承载网关,还需启用与自承载网关配置终结点的专用连接。

在内部模式中使用 API 管理可以:

  • 通过使用 Azure VPN 连接或 Azure ExpressRoute,使专用数据中心内托管的 API 可由其外部的第三方安全地访问。
  • 通过公共网关公开基于云的 API 和本地 API,以便启用混合云方案。
  • 使用单一网关终结点管理托管在多个地理位置的 API。

连接到内部 VNet

对于特定于外部模式的配置,可以从公共 Internet 访问 API 管理终结点,而后端服务位于网络中,请参阅将 Azure API 管理实例部署到虚拟网络 - 外部模式

注意

建议使用 Azure Az PowerShell 模块与 Azure 交互。 请参阅安装 Azure PowerShell 以开始使用。 若要了解如何迁移到 Az PowerShell 模块,请参阅 将 Azure PowerShell 从 AzureRM 迁移到 Az

先决条件

在开始之前,请查看将 API 管理注入虚拟网络的网络资源要求

某些先决条件因托管 API 管理实例的stv2的版本(stv2stv1)而异。

提示

使用门户创建或更新现有 API 管理实例的网络连接时,该实例将托管在 stv2 计算平台上。

  • 虚拟网络和子网位于 API 管理实例所在的区域和订阅中。

    • 用于连接到 API 管理实例的子网可能包含其他 Azure 资源类型。
    • 子网不应启用任何委派。 应将子网的设置“将子网委派给服务”设置为“”。
  • 附加到上述子网的网络安全组。 网络安全组 (NSG) 需要显式允许入站连接,因为 API 管理在内部使用的负载均衡器默认是安全的,并且会拒绝所有入站流量。 有关具体的配置,请参阅本文稍后的配置 NSG 规则

  • 对于某些方案,启用子网中的服务终结点到依赖的服务,例如 Azure 存储或 Azure SQL。 有关详细信息,请参阅本文后面的使用 ExpressRoute 或网络虚拟设备强制通过隧道将流量传输到本地防火墙

  • 标准 SKU 公共 IPv4 地址。 为外部或内部访问设置虚拟网络时,需要公共 IP 地址资源。 使用内部虚拟网络时,公共 IP 地址仅用于管理操作。 详细了解 API 管理的 IP 地址

    • IP 地址必须与 API 管理实例和虚拟网络位于同一区域和订阅中。

    • 创建公共 IP 地址资源时,请确保为其分配“DNS 名称标签”。 一般情况下,应该使用与 API 管理实例相同的 DNS 名称。 如果对其进行更改,请重新部署实例,以便应用新的 DNS 标签。

    • 为获取最佳网络性能,建议使用默认的“路由首选项”:“Microsoft 网络”。

    • 计划为 API 管理实例启用区域冗余的区域中创建公共 IP 地址时,请配置“区域冗余”设置。

    • IP 地址的值被分配作为该区域中 API 管理实例的虚拟公共 IPv4 地址。

    • 从外部虚拟网络更改为内部虚拟网络(反之亦然),并且在更改网络中的子网,或更新 API 管理实例的可用性区域时,必须配置其他公共 IP 地址。

启用 VNet 连接

使用 Azure 门户启用 VNet 连接(stv2 平台)

  1. 转到 Azure 门户,查找 API 管理实例。 搜索并选择“API 管理服务”。

  2. 选择你的 API 管理实例。

  3. 选择“网络”>“虚拟网络”。

  4. 选择“内部”访问类型。

  5. 在预配了 API 管理服务的位置(区域)列表中:

    1. 选择“位置” 。
    2. 选择“虚拟网络”、“子网”和“IP 地址” 。
      • 系统将在 VNet 列表中填充你所配置区域内设置的 Azure 订阅中的可用资源管理器 VNet。
  6. 选择“应用”。 API 管理实例的“虚拟网络”页将使用新的 VNet 和子网选项进行更新。 在 Azure 门户中设置内部 VNet

  7. 继续为 API 管理实例的其余位置配置 VNet 设置。

  8. 在顶部导航栏中,选择“保存”,然后选择“应用网络配置”。

    更新 API 管理实例可能需要 15 到 45 分钟。 开发人员层级在此过程中有故障时间。 基本 SKU 和更高级别的 SKU 在此过程中没有停机时间。

成功部署后,你应该能在“概述”边栏选项卡中查看你 API 管理服务的专用虚拟 IP 地址和公共虚拟 IP 地址。 有关 IP 地址的详细信息,请参阅本文中的路由

Azure 门户中的公共和专用 IP 地址

注意

由于网关 URL 未在公共 DNS 上注册,Azure 门户上提供的测试控制台不适用于内部 VNet 部署的服务。 应改用开发人员门户上提供的测试控制台。

使用资源管理器模板(stv2 平台)启用连接

  • Azure 资源管理器模板(API 版本 2021-08-01)

    用于将资源管理器模板部署到 Azure 的按钮。

使用 Azure PowerShell cmdlet 启用连接(stv1 平台)

在 VNet 中创建更新 API 管理实例。

配置 NSG 规则

在 API 管理子网中配置自定义网络规则,以筛选进出 API 管理实例的流量。 建议使用以下最低 NSG 规则,以确保正确操作和访问实例。 仔细查看环境,以确定可能需要的更多规则。

重要

根据缓存和其他功能的使用情况,可能需要配置下表中最低规则之外的其他 NSG 规则。 有关详细设置,请参阅虚拟网络配置参考

  • 在大多数情况下,请使用指示的服务标记(而不是服务 IP 地址)来指定网络源和目标。
  • 将这些规则的优先级设置为高于默认规则的优先级。
源/目标端口 方向 传输协议 服务标记
源/目标
用途 VNet 类型
* / [80], 443 入站 TCP Internet / VirtualNetwork 客户端与 API 管理的通信 仅外部
* / 3443 入站 TCP ApiManagement / VirtualNetwork Azure 门户和 PowerShell 的管理终结点 外部和内部
* / 6390 入站 TCP AzureLoadBalancer / VirtualNetwork Azure 基础结构负载均衡器 外部和内部
* / 443 入站 TCP AzureTrafficManager / VirtualNetwork 用于多区域部署的 Azure 流量管理器路由 仅外部
* / 443 出站 TCP VirtualNetwork / Storage 依赖 Azure 存储来获取核心服务功能 外部和内部
* / 1433 出站 TCP VirtualNetwork / SQL 访问 Azure SQL 终结点以获取核心服务功能 外部和内部
* / 443 出站 TCP VirtualNetwork / AzureKeyVault 访问 Azure Key Vault 以获取核心服务功能 外部和内部
* / 1886、443 出站 TCP VirtualNetwork / AzureMonitor 发布诊断日志和指标资源运行状况Application Insights 外部和内部

DNS 配置

在内部 VNet 模式下,必须管理自己的 DNS,才能对 API 管理终结点进行入站访问。

我们建议:

  1. 配置 Azure DNS 专用区域
  2. 将 Azure DNS 专用区域链接到已部署 API 管理服务的 VNet。

了解如何在 Azure DNS 中设置专用区域

注意

API 管理服务不会侦听其 IP 地址上的请求。 它只响应到发往其终结点上配置的主机名的请求。 这些终结点包括:

  • API 网关
  • Azure 门户
  • 开发人员门户
  • 直接管理终结点
  • Git

基于默认主机名的访问权限

当你创建 API 管理服务(例如,contosointernalvnet)时,将默认配置以下终结点:

端点 终结点配置
API Gateway contosointernalvnet.azure-api.net
开发人员门户 contosointernalvnet.portal.azure-api.net
新的开发人员门户 contosointernalvnet.developer.azure-api.net
直接管理终结点 contosointernalvnet.management.azure-api.net
Git contosointernalvnet.scm.azure-api.net

基于自定义域名的访问权限

如果不想通过默认主机名访问 API 管理服务,则可为所有终结点设置自定义域名,如下图所示:

设置自定义域名

配置 DNS 记录

在你的 DNS 服务器中创建记录,以访问可从 VNet 中访问的终结点。 将终结点记录映射到服务的专用虚拟 IP 地址

出于测试目的,可以在连接到部署了 API 管理的 VNet 的子网中的虚拟机上更新主机文件。 假设服务的专用虚拟 IP 地址为 10.1.0.5,可按下面所示映射 hosts 文件。 主机映射文件位于 %SystemDrive%\drivers\etc\hosts (Windows) 或 /etc/hosts(Linux、macOS)。

内部虚拟 IP 地址 终结点配置
10.1.0.5 contosointernalvnet.azure-api.net
10.1.0.5 contosointernalvnet.portal.azure-api.net
10.1.0.5 contosointernalvnet.developer.azure-api.net
10.1.0.5 contosointernalvnet.management.azure-api.net
10.1.0.5 contosointernalvnet.scm.azure-api.net

然后即可从创建的虚拟机访问所有 API 管理终结点。

路线规划

为内部虚拟网络中的 API 管理实例配置以下虚拟 IP 地址。

虚拟 IP 地址 说明
专用虚拟 IP 地址 来自 API 管理实例子网范围内部的负载均衡 IP 地址 (DIP),通过该地址可以访问 API 网关、开发人员门户、管理和 Git 终结点。

用 VNet 使用的 DNS 服务器注册此地址。
公共虚拟 IP 地址 仅用于通过端口 3443 传输到管理终结点的控制平面流量。 可以锁定到 ApiManagement 服务标记。

负载均衡的公共和专用 IP 地址可以在 Azure 门户的“概述”边栏选项卡上找到。

有关详细信息和注意事项,请参阅 Azure API 管理的 IP 地址

VIP 和 DIP 地址

动态 IP (DIP) 地址将分配给服务中每个基础虚拟机,用于访问 VNet 和对等 VNet 中的终结点和资源。 API 管理服务的公共虚拟 IP (VIP) 地址将用于访问面向公共的资源。

如果使用 IP 限制列表保护 VNet 或对等 VNet 内的资源,那么建议指定部署 API 管理服务的整个子网范围,以授予或限制该服务的访问权限。

详细了解建议的子网大小

示例

如果在高级层上的内部 VNet 中部署 1 个容量单位的 API 管理,则会使用 3 个 IP 地址:1 个地址用于专用 VIP,另外两个地址用于两个 VM 的 DIP。 如果横向扩展到 4 个单位,则会将子网中的其他 IP 用于附加的 DIP。

如果目标终结点上只有固定的一组 DIP 加入了允许列表,则将来添加新单位会导致连接失败。 出于此原因,并且由于子网完全由你控制,我们建议将后端中的整个子网加入允许列表。

使用 ExpressRoute 或网络虚拟设备,强制通过隧道将流量传输到本地防火墙

借助强制隧道,可将来自子网的全部 Internet 绑定流量重定向或“强制”返回到本地位置,以进行检查和审核。 通常可以通过配置及定义自己的默认路由 (0.0.0.0/0),以使来自 API 管理子网的所有流量强制穿过本地防火墙或流入网络虚拟设备。 此流量流会中断与 API 管理的连接,因为出站流量会在本地遭到阻止,或者已经过 NAT 处理,变为一组无法再与各种 Azure 终结点配合工作的无法识别的地址。 可通以下方法解决此问题:

  • 在部署以下服务的 API 管理所在的子网上启用服务终结点

    • Azure SQL(仅在 API 管理服务部署到多个区域的情况下主要区域才需要使用)
    • Azure 存储
    • Azure 事件中心
    • Azure 密钥保管库(在 stv2 平台上部署 API 管理时需要)

    通过直接从 API 管理子网为这些服务启用终结点,可以使用 Microsoft Azure 主干网络为服务流量提供最佳路由。 如果使用带有强制隧道的 API 管理服务终结点,前面的 Azure 服务的流量就不会强制通过隧道传输。 其他 API 管理服务依赖项流量将依然强制通过隧道传输。 确保防火墙或虚拟设备不会阻止此流量,否则 API 管理服务可能无法正常工作。

    注意

    强烈建议直接从 API 管理子网为支持服务终结点的依赖服务(例如 Azure SQL 和 Azure 存储)启用服务终结点。 但是,某些组织可能要求强制通过隧道传送来自API 管理子网的所有流量。 在这种情况下,请确保将防火墙或虚拟设备配置为允许此流量。 你需要允许每个依赖服务的完整 IP 地址范围,并在 Azure 基础结构更改时使此配置保持最新。 由于强制通过隧道传送此网络流量,API 管理服务也可能会遇到延迟或意外超时。

  • 所有从 Internet 传输至 API 管理服务之管理终结点的控制平面流量均通过由 API 管理托管的一组特定入站 IP 进行路由,这些 IP 包含在 ApiManagement 服务标记。 当强制通过隧道传输流量时,响应不会对称地映射回这些入站源 IP,并且与管理终结点的连接也会丢失。 若要克服此限制,请为这些 ApiManagement 服务标记配置用户定义的路由 (UDR),并将下一跃点类型设置为 Internet,以将流量引导回 Azure。

    注意

    允许“API 管理”的管理流量绕过本地防火墙或网络虚拟应用程序不视为重大安全风险。 API 管理子网的推荐配置只允许来自 ApiManagement 服务标记所包含的 Azure IP 地址集的端口 3443 入站管理流量。 建议的 UDR 配置仅适用于此 Azure 流量的返回路径。

  • (外部 VNet 模式)尝试从 Internet 访问API 管理网关和开发人员门户的客户端数据平面流量也将默认删除,因为强制隧道引入了非对称路由。 对于需要访问权限的每个客户端,请配置下一跃点类型为“Internet”的显式 UDR,以绕过防火墙或虚拟网络设备。

  • 对于强制通过隧道传输流量的其他 API 管理服务依赖项,应解析主机名并访问相应终结点。 其中包括:

    • 指标和运行状况监视
    • Azure 门户诊断
    • SMTP 中继
    • 开发人员门户验证码
    • Azure KMS 服务器

有关更多信息,请参阅虚拟网络配置参考

常见网络配置问题

本部分已移到其他位置。 请参阅虚拟网络配置参考

疑难解答

在子网中初次部署 API 管理服务失败

  • 将虚拟机部署到相同子网。
  • 连接到虚拟机,并验证与 Azure 订阅中以下其中一项资源的连接:
    • Azure 存储 Blob
    • Azure SQL 数据库
    • Azure 存储表
    • Azure 密钥保管库(适用于 stv2 平台上托管的 API 管理实例)

重要

验证连接后,先删除子网中的所有资源,然后将 API 管理部署到子网中(当 API 管理托管在 stv1 平台上时需要执行此操作)。

验证网络状态

  • 在将 API 管理部署到子网后,应使用门户来检查实例与依赖项(如 Azure 存储)之间的连接性。

  • 在门户中左侧菜单中的“部署和基础结构”下,选择“网络”“网络状态”。

    在门户中验证网络连接状态的屏幕截图。

Filter 说明
必需 选择“必需”,以查看 API 管理与必需 Azure 服务之间的连接性。 如果失败,则表示该实例无法执行核心操作来管理 API。
可选 选择“可选”,以查看 API 管理与可选服务之间的连接性。 如果连接失败,仅表示特定功能(如 SMTP)将无法正常工作。 连接失败可能会导致使用和监视 API 管理实例以及提供所承诺 SLA 的能力下降。

要帮助排查连接问题,请选择:

  • 指标 - 查看网络连接状态指标

  • 诊断 - 在指定时间段内运行虚拟网络验证程序

若要解决连接问题,请查看网络配置设置并修复所需的网络设置。

增量更新

更改网络时,请参阅NetworkStatus API,以验证 API 管理服务是否仍具有关键资源的访问权限。 连接状态应每 15 分钟更新一次。

若要使用门户来应用对 API 管理实例的网络配置更改,请执行以下操作:

  1. 在实例的左侧菜单中的“部署和基础结构”下,选择“网络”>“虚拟网络”。
  2. 选择“应用网络配置”。

托管在stv1计算平台上的 API 管理实例在部署到某个资源管理器 VNet 子网后,将通过创建资源导航链接来保留该子网。 如果子网已包含来自其他提供程序的资源,则部署将失败。 同样,当删除 API 管理服务或将其移至其他子网时,资源导航链接也将会删除。

将 API 管理实例重新分配到以前的子网时遇到的挑战

  • VNet 锁 - 将 API 管理实例移回其原始子网时,由于 VNet 锁最多需要 6 个小时才能删除,因此可能会导致无法立即重新分配。 如果原始子网具有其他 stv1 基于平台的 API 管理服务(基于云的服务),则需要删除这些服务并等待 6 小时,以便在同一子网中部署 stv2 基于平台的服务。
  • 资源组锁 - 另一种情况需要考虑的是在资源组级别或更高级别存在范围锁,从而阻碍了资源导航链接删除过程。 为解决此问题,需要删除范围锁,并允许在删除范围锁之前从原始子网取消链接 API 管理服务的操作延迟约 4-6 小时,从而允许部署到所需子网。

排查从 VNet 内部连接到 Microsoft Graph 的问题

使用 Microsoft Entra 标识提供者登录到开发人员门户等功能需要与 Microsoft Graph 建立网络连接。

若要从 VNet 内部排查与 Microsoft Graph 的连接问题:

  • 确保为从 API 管理实例到 Microsoft Graph 的出站连接配置 NSG 及其他网络规则(使用 AzureActiveDirectory 服务标记)。

  • 确保从 VNet 内部对 graph.microsoft.com 进行 DNS 解析和网络访问。 例如,在 VNet 中预配新 VM、连接到它,并尝试从浏览器或者使用 cURL、PowerShell 或其他工具 GET https://graph.microsoft.com/v1.0/$metadata

后续步骤

了解有关以下方面的详细信息: