【发布时间】:2021-09-03 17:10:48
【问题描述】:
我有一个 azure 容器实例...我已将它添加到 vnet 中...具有私有 IP 地址..10.0.0.4
我只希望少数 azure 应用服务能够调用此 azure 容器实例公开的其余 API,如何让这些 azure 应用服务能够调用容器?
干杯 安德鲁
【问题讨论】:
标签: azure azure-container-instances vnet
我有一个 azure 容器实例...我已将它添加到 vnet 中...具有私有 IP 地址..10.0.0.4
我只希望少数 azure 应用服务能够调用此 azure 容器实例公开的其余 API,如何让这些 azure 应用服务能够调用容器?
干杯 安德鲁
【问题讨论】:
标签: azure azure-container-instances vnet
有几种方法可以实现这一目标。
一个是Configure a single public IP address for outbound and inbound traffic to an Azure container group 使用这种方法,你可以deploy an Azure Container Instance in a Virtual network,就像你已经做的那样。
那么,
首先,使用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 commands 在子网中创建防火墙。
如果尚未安装,请使用 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 子网上定义用户定义的路由,将流量转移到 Azure 防火墙。如需更多信息,请参阅Route network traffic。
首先,运行以下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
运行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 rule,以转换和过滤到您之前在网络中启动的应用程序容器的入站互联网流量。详情见Filter inbound Internet traffic with Azure Firewall DNAT
使用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 替换为您的 App Services' outbound IP Addresses 的空格分隔列表。
运行以下az network firewall application-rule create 命令在防火墙上创建出站规则。此示例规则允许从委派给 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
另一种方法可以是Integrate your App Service with an Azure virtual network。使用Azure Virtual Network (VNets),您可以将许多 Azure 资源放置在不可 Internet 路由的网络中。 VNet 集成功能使您的应用程序能够访问 VNet 中或通过 VNet 的资源。 VNet 集成无法让您的应用私下访问。
请查找图片示例here。然后您可以通过Vnet-toVnet peering 或Vnet-to-Vnet VPN Gateway 将应用服务虚拟网络与ACI 虚拟网络连接
但是,使用此方法,您必须将所有将连接到您的 ACI 的 Azure 应用服务与虚拟网络集成。
【讨论】: