azure - Azure 容器实例安全 VPN
问题描述
我有一个 azure 容器实例...我已将其添加到 vnet 中...具有私有 IP 地址..10.0.0.4
我只希望少数 azure 应用程序服务能够调用此 azure 容器实例公开的其余 API,如何让这些 azure 应用程序服务能够调用容器?
干杯安德鲁
解决方案
有几种方法可以实现这一目标。
一种方法是为到 Azure 容器组的出站和入站流量配置单个公共 IP 地址使用此方法,您可以在虚拟网络中部署 Azure 容器实例,就像您已经完成的那样。
然后,
在网络中部署 Azure 防火墙
首先,使用az network vnet subnet create为防火墙添加一个名为 AzureFirewallSubnet 的子网。AzureFirewallSubnet 是此子网的必需名称。
az network vnet subnet create \
--name AzureFirewallSubnet \
--resource-group $RESOURCE_GROUP_NAME \
--vnet-name $aci-vnet \
--address-prefix 10.0.1.0/26
使用以下Azure CLI 命令在子网中创建防火墙。
如果尚未安装,请使用az extension add命令将防火墙扩展添加到 Azure CLI:
az extension add --name azure-firewall
创建防火墙资源:
az network firewall create \
--name myFirewall \
--resource-group $RESOURCE_GROUP_NAME \
--location eastus
az network public-ip create \
--name fw-pip \
--resource-group $RESOURCE_GROUP_NAME \
--location eastus \
--allocation-method static \
--sku standard
az network firewall ip-config create \
--firewall-name myFirewall \
--name FW-config \
--public-ip-address fw-pip \
--resource-group $RESOURCE_GROUP_NAME \
--vnet-name $aci-vnet
使用az network firewall update命令更新防火墙配置:
az network firewall update \
--name myFirewall \
--resource-group $RESOURCE_GROUP_NAME
使用az network firewall ip-config list命令获取防火墙的专用 IP 地址。此私有 IP 地址将在后面的命令中使用。
FW_PRIVATE_IP="$(az network firewall ip-config list \
--resource-group $RESOURCE_GROUP_NAME \
--firewall-name myFirewall \
--query "[].privateIpAddress" --output tsv)"
使用az network public-ip show 命令获取防火墙的公共 IP 地址。此公共 IP 地址将在后面的命令中使用。
FW_PUBLIC_IP="$(az network public-ip show \
--name fw-pip \
--resource-group $RESOURCE_GROUP_NAME \
--query ipAddress --output tsv)"
在 ACI 子网上定义用户定义的路由
在 ACI 子网上定义用户定义的路由,以将流量转移到 Azure 防火墙。有关详细信息,请参阅路由网络流量。
创建路由表
首先,运行以下az network route-table create命令来创建路由表。在与虚拟网络相同的区域中创建路由表。
az network route-table create \
--name Firewall-rt-table \
--resource-group $RESOURCE_GROUP_NAME \
--location eastus \
--disable-bgp-route-propagation true
创建路线
运行az network-route-table route create以在路由表中创建路由。要将流量路由到防火墙,请将下一跳类型设置为VirtualAppliance
,并将防火墙的私有 IP 地址作为下一跳地址。
az network route-table route create \
--resource-group $RESOURCE_GROUP_NAME \
--name DG-Route \
--route-table-name Firewall-rt-table \
--address-prefix 0.0.0.0/0 \
--next-hop-type VirtualAppliance \
--next-hop-ip-address $FW_PRIVATE_IP
将路由表关联到 ACI 子网
运行az network vnet subnet update命令以将路由表与委派给 Azure 容器实例的子网相关联。
az network vnet subnet update \
--name $aci-subnet \
--resource-group $RESOURCE_GROUP_NAME \
--vnet-name $aci-vnet \
--address-prefixes 10.0.0.0/24 \
--route-table Firewall-rt-table
最后,
在防火墙上配置规则
默认情况下,Azure 防火墙拒绝(阻止)入站和出站流量。
将防火墙上的 NAT 规则配置到 ACI 子网
在防火墙上创建NAT 规则,以将入站 Internet 流量转换和过滤到您之前在网络中启动的应用程序容器。有关详细信息,请参阅使用 Azure 防火墙 DNAT 过滤入站 Internet 流量
使用az network firewall nat-rule create命令创建 NAT 规则和集合:
az network firewall nat-rule create \
--firewall-name myFirewall \
--collection-name myNATCollection \
--action dnat \
--name myRule \
--protocols TCP \
--source-addresses '$SOURCE_ADDRESSES' \
--destination-addresses $FW_PUBLIC_IP \
--destination-ports 80 \
--resource-group $RESOURCE_GROUP_NAME \
--translated-address $ACI_PRIVATE_IP \
--translated-port 80 \
--priority 200
根据需要添加 NAT 规则以过滤到子网中其他 IP 地址的流量。例如,子网中的其他容器组可能会公开入站流量的 IP 地址,或者其他内部 IP 地址可以在重新启动后分配给容器组。
注意:将 $SOURCE_ADDRESSES 替换为应用服务的出站 IP 地址的空格分隔列表。
在防火墙上创建出站应用程序规则
运行以下az network firewall application-rule create e 命令在防火墙上创建出站规则。此示例规则允许从委派给 Azure 容器实例的子网访问 FQDN checkip.dyndns.org
。在后续步骤中使用对站点的 HTTP 访问来确认来自 Azure 容器实例的出口 IP 地址。
az network firewall application-rule create \
--collection-name myAppCollection \
--firewall-name myFirewall \
--name Allow-CheckIP \
--protocols Http=80 Https=443 \
--resource-group $RESOURCE_GROUP_NAME \
--target-fqdns checkip.dyndns.org \
--source-addresses 10.0.0.0/24 \
--priority 200 \
--action Allow
另一种方法是将应用服务与 Azure 虚拟网络集成。使用Azure 虚拟网络 (VNet),您可以将许多 Azure 资源放置在非 Internet 可路由网络中。VNet 集成功能使您的应用程序能够访问 VNet 中或通过 VNet 的资源。VNet 集成不会让您的应用程序可以私下访问。
请在此处找到图片示例。然后,您可以通过Vnet-to-Vnet 对等互连或Vnet-to-Vnet VPN 网关将应用服务虚拟网络与 ACI 虚拟网络连接起来
但是,使用此方法,您必须将所有将连接到您的 ACI 的 Azure 应用服务与虚拟网络集成。
推荐阅读
- python - Can't import pygame even though it is installed
- oauth-2.0 - 如何在“使用 Apple 登录”同意屏幕中设置徽标?
- python - 如何通过响应式进度条重复使用 Qthread
- php - PHP - 通过 $_GET 链接选择一个下拉项目
- java - 停止程序,直到从 JTextField 获得输入
- angular - Angular Material Dialog:带有数据的解析器?
- python - ValueError:张量原型大于 2GB
- java - SpringBoot 覆盖 AnnotationConfigApplicationContext 抛出未定义的此类 bean
- php - 当您想在数据更新页面上显示单选按钮时如何设置它
- php - 更新单个列