配置公共 IP 网络规则

默认情况下,Azure 容器注册表接受来自任何网络上的主机的 Internet 连接。 本文介绍如何将容器注册表配置为仅允许来自特定公共 IP 地址或地址范围的访问。 其中提供了使用 Azure CLI 和 Azure 门户的等效步骤。

IP 网络规则在公共注册表终结点上进行配置。 IP 网络规则不适用于配置有专用链接的专用终结点

可在“高级”容器注册表服务层级配置 IP 访问规则。 有关注册表服务层级和限制的信息,请参阅 Azure 容器注册表层级

每个注册表最多支持 100 个 IP 访问规则。

重要

某些功能可能不可用,或者需要在容器注册表中进行更多配置,以限制对专用终结点、选定子网或 IP 地址的访问。

  • 在禁止公用网络访问注册表时,某些受信任的服务(包括 Azure 安全中心)访问注册表就需要启用某个网络设置来绕过网络规则。
  • 禁用公用网络访问后,某些 Azure 服务(包括 Azure DevOps 服务)的实例当前无法访问容器注册表。
  • Azure DevOps 托管代理当前不支持专用终结点。 需要使用与专用终结点建立了网络直通的自托管代理。
  • 如果注册表具有已批准的专用终结点,并且公用网络访问已禁用,则无法使用 Azure 门户、Azure CLI 或其他工具在虚拟网络外部列出存储库和标记。

从所选的公用网络进行访问 - CLI

更改默认网络对注册表的访问权限

要将访问权限仅授予所选公用网络,请先将默认操作更改为拒绝访问。 在以下 az acr update 命令中,替换注册表的名称:

az acr update --name myContainerRegistry --default-action Deny

向注册表添加网络规则

使用 az acr network-rule add 命令向注册表添加允许从公共 IP 地址或范围进行访问的网络规则。 例如,替换容器注册表的名称和虚拟网络中 VM 的公共 IP 地址。

az acr network-rule add \
  --name mycontainerregistry \
  --ip-address <public-IP-address>

注意

添加规则后,它需要几分钟才能生效。

从所选的公用网络访问 - 门户

  1. 在门户中,导航到容器注册表。

  2. 在“设置”下选择“网络” 。

  3. 在“公共访问”选项卡上,选择允许从“所选网络”进行公共访问 。

  4. 在“防火墙”下,输入公共 IP 地址,如虚拟网络中 VM 的公共 IP 地址。 或者,以 CIDR 表示法输入包含 VM IP 地址的地址范围。

  5. 选择“保存”。

    Configure firewall rule for container registry

注意

添加规则后,它需要几分钟才能生效。

提示

或者,也可通过本地客户端计算机或 IP 地址范围启用注册表访问。 要允许此访问,需要计算机的公共 IPv4 地址。 可通过在 Internet 浏览器中搜索“我的 IP 地址是多少”来查找此地址。 在门户中的“网络”页面上配置防火墙设置时,当前客户端 IPv4 地址也会自动出现。

禁用公用网络访问

(可选)禁用注册表上的公共终结点。 禁用公共终结点会重写所有防火墙配置。 例如,建议使用专用链接禁用对虚拟网络中受保护注册表的公共访问。

注意

如果在虚拟网络中使用服务终结点设置了注册表,则禁用对注册表的公共终结点的访问也会在虚拟网络中禁用对注册表的访问。

禁用公共访问 - CLI

若要使用 Azure CLI 禁用公共访问,请运行 az acr update,并将 --public-network-enabled 设置为 falsepublic-network-enabled 参数需要 Azure CLI 2.6.0 或更高版本。

az acr update --name myContainerRegistry --public-network-enabled false

禁用公共访问 - 门户

  1. 在门户中,导航到容器注册表,选择“设置”>“网络”。

  2. 在“公共访问”选项卡上的“允许公用网络访问”中,选择“禁用” 。 再选择“保存”。

    Disable public access

还原公用网络访问

要重新启用公共终结点,请更新网络设置以允许公共访问。 启用公共终结点会重写所有防火墙配置。

还原公共访问 - CLI

运行 az acr update 并将 --public-network-enabled 设置为 true

注意

public-network-enabled 参数需要 Azure CLI 2.6.0 或更高版本。

az acr update --name myContainerRegistry --public-network-enabled true --default-action Allow

还原公共访问 - 门户

  1. 在门户中,导航到容器注册表,选择“设置”>“网络”。
  2. 在“公共访问”选项卡上的“允许公用网络访问”中,选择“所有网络” 。 再选择“保存”。

Public access from all networks

疑难解答

从 HTTPS 代理后面进行访问

如果设置了公用网络规则,或拒绝对注册表的公共访问,则尝试从禁止的公用网络登录注册表会失败。 如果未设置代理的访问规则,则从 HTTPS 代理后面进行的客户端访问也会失败。 你会看到类似于 Error response from daemon: login attempt failed with status: 403 ForbiddenLooks like you don't have access to registry 的错误消息。

如果使用网络访问规则所允许的 HTTPS 代理,但未在客户端环境中正确配置该代理,则也可能会发生这些错误。 检查 Docker 客户端和 Docker 守护程序均已针对代理行为进行了配置。 有关详细信息,请参阅 Docker 文档中的 HTTP/HTTPS 代理

从 Azure Pipelines 进行的访问

如果将 Azure Pipelines 与 Azure 容器注册表结合使用(注册表可将访问权限限制到特定 IP 地址),则由于管道的出站 IP 地址不是固定的,它可能无法访问注册表。 默认情况下,管道会使用 Microsoft 托管的代理在具有一组变化的 IP 地址的虚拟机池上运行作业。

一种解决方法是将用于运行管道的代理从 Microsoft 托管的代理更改为自托管代理。 通过在你管理的 WindowsLinux 计算机上运行的自托管代理,你可以控制管道的出站 IP 地址,并且可以将该地址添加到注册表 IP 访问规则中。

从 AKS 访问

如果将 AKS Azure Kubernetes 服务 (AKS) 与限制对特定 IP 地址的访问的 Azure 容器注册表结合使用,则默认情况下无法配置固定的 AKS IP 地址。 从 AKS 群集的出口 IP 地址是随机分配的。

若要允许 AKS 群集访问注册表,可以使用以下选项:

后续步骤