控制 Azure Spring Apps 实例的出口流量

注意

基本、标准和企业计划将从 2025 年 3 月中旬开始弃用,停用期为 3 年。 建议转换到 Azure 容器应用。 有关详细信息,请参阅 Azure Spring Apps 停用公告

标准消耗和专用计划将于 2024 年 9 月 30 日开始弃用,并在六个月后完全关闭。 建议转换到 Azure 容器应用。

本文介绍如何保护来自 Azure Spring Apps 中托管的应用程序的出站流量。 本文提供了用户定义的路由的示例。 用户定义的路由是可用于完全控制出口流量的高级功能。 在不允许使用 Azure Spring Apps 自动生成的公共 IP 地址等情况下,可以使用用户定义的路由。

先决条件

使用用户定义的路由创建虚拟网络

下图显示了使用用户定义的路由 (UDR) 的 Azure Spring Apps 虚拟网络示例。

此图显示了使用用户定义的路由 (UDR) 的 Azure Spring Apps 虚拟网络的体系结构。

此图演示了体系结构的以下功能:

  • 公共入口流量必须流经防火墙筛选器。
  • 每个 Azure Spring Apps 实例在专用子网内部隔离。
  • 客户拥有和管理防火墙。
  • 此结构可确保防火墙为所需的所有功能启用一个正常的环境。
  • Azure Spring Apps 不会自动生成公共 IP 资源。

定义环境变量

以下示例演示如何定义一组环境变量,以便在创建资源时使用:

export PREFIX="asa-egress"
export RG="${PREFIX}-rg"
export LOC="chinanorth2"
export ASANAME="${PREFIX}"
export VNET_NAME="${PREFIX}-vnet"
export ASA_APP_SUBNET_NAME="asa-app-subnet"
export ASA_SERVICE_RUNTIME_SUBNET_NAME="asa-service-runtime-subnet"
# Do not change FWSUBNET_NAME. This is currently a requirement for Azure Firewall.
export FWSUBNET_NAME="AzureFirewallSubnet"
export FWNAME="${PREFIX}-fw"
export FWPUBLICIP_NAME="${PREFIX}-fwpublicip"
export FWIPCONFIG_NAME="${PREFIX}-fwconfig"
export APP_ROUTE_TABLE_NAME="${PREFIX}-app-rt"
export SERVICE_RUNTIME_ROUTE_TABLE_NAME="${PREFIX}-service-runtime-rt"
export FWROUTE_NAME="${PREFIX}-fwrn"
export ASA_NAME="${PREFIX}-instance"

创建包含多个子网的虚拟网络

本部分介绍如何使用三个单独的子网预配虚拟网络:一个子网用于用户应用,一个子网用于服务运行时,一个子网用于防火墙。

首先如以下示例中所示创建一个资源组:

# Create a resource group.

az group create --name $RG --location $LOC

然后如以下示例中所示,创建包含三个子网的虚拟网络来托管 Azure Spring Apps 和 Azure 防火墙实例:

# Dedicated virtual network with an Azure Spring Apps app subnet.

az network vnet create \
    --resource-group $RG \
    --name $VNET_NAME \
    --location $LOC \
    --address-prefixes 10.42.0.0/16 \
    --subnet-name $ASA_APP_SUBNET_NAME \
    --subnet-prefix 10.42.1.0/24

# Dedicated subnet for the Azure Spring Apps service runtime subnet.

az network vnet subnet create \
    --resource-group $RG \
    --vnet-name $VNET_NAME \
    --name $ASA_SERVICE_RUNTIME_SUBNET_NAME\
    --address-prefix 10.42.2.0/24

# Dedicated subnet for Azure Firewall. (Firewall name can't be changed.)

az network vnet subnet create \
    --resource-group $RG \
    --vnet-name $VNET_NAME \
    --name $FWSUBNET_NAME \
    --address-prefix 10.42.3.0/24

使用用户定义的路由设置 Azure 防火墙实例

运行以下命令使用用户定义的路由创建并设置 Azure 防火墙实例,然后配置 Azure 防火墙出站规则。 该防火墙允许从 Azure Spring Apps 配置精细的出口流量规则。

重要

如果群集或应用程序创建大量定向到相同目标或小部分目标的出站连接,则你可能需要分配更多防火墙前端 IP 地址,以避免达到每个前端 IP 地址的端口数上限。 有关如何创建使用多个 IP 地址的 Azure 防火墙实例的详细信息,请参阅快速入门:创建使用多个公共 IP 地址的 Azure 防火墙实例 - ARM 模板。 创建用作 Azure 防火墙前端地址的标准 SKU 公共 IP 资源。

az network public-ip create \
    --resource-group $RG \
    --name $FWPUBLICIP_NAME -l $LOC \
    --sku "Standard"

以下示例演示如何安装 Azure 防火墙预览版 CLI 扩展和部署 Azure 防火墙:

# Install the Azure Firewall preview CLI extension.

az extension add --name azure-firewall

# Deploy Azure Firewall.

az network firewall create \
    --resource-group $RG \
    --name $FWNAME -l $LOC \
    --enable-dns-proxy true

以下示例演示如何将创建的 IP 地址分配到防火墙前端。

注意

为 Azure 防火墙实例设置公共 IP 地址可能需要几分钟时间。 若要在网络规则中使用完全限定的域名 (FQDN),请启用 DNS 代理。 启用代理后,防火墙会侦听端口 53,并将 DNS 请求转发到指定的 DNS 服务器。 然后防火墙可以自动转换 FQDN。

# Configure the firewall IP address.

az network firewall ip-config create \
    --resource-group $RG \
    --firewall-name $FWNAME \
    --name $FWIPCONFIG_NAME \
    --public-ip-address $FWPUBLICIP_NAME \
    --vnet-name $VNET_NAME

操作完成后,保存防火墙前端 IP 地址供稍后在配置中使用,如以下示例中所示:

# Capture the firewall IP address for later use.

export FWPUBLIC_IP=$(az network public-ip show \
    --resource-group $RG \
    --name $FWPUBLICIP_NAME \
    --query "ipAddress" \
    --output tsv)
export FWPRIVATE_IP=$(az network firewall show \
    --resource-group $RG \
    --name $FWNAME \
    --query "ipConfigurations[0].privateIPAddress" \
    --output tsv | tr -d '[:space:]')

创建包含 Azure 防火墙跃点的用户定义的路由

Azure 自动在 Azure 子网、虚拟网络与本地网络之间路由流量。 如果你想要更改 Azure 中的默认路由,请创建一个路由表。

以下示例演示如何创建要与指定的子网关联的路由表。 该路由表定义下一个跃点,如创建的 Azure 防火墙实例中所示的那样。 每个子网可以关联一个路由表,也可以不关联任何路由表。

# Create a user-defined route and add a route for Azure Firewall.

az network route-table create \
    --resource-group $RG -l $LOC \
    --name $APP_ROUTE_TABLE_NAME
az network route-table route create \
    --resource-group $RG \
    --name $FWROUTE_NAME \
    --route-table-name $APP_ROUTE_TABLE_NAME \
    --address-prefix 0.0.0.0/0 \
    --next-hop-type VirtualAppliance \
    --next-hop-ip-address $FWPRIVATE_IP
az network route-table create \
    --resource-group $RG -l $LOC \
    --name $SERVICE_RUNTIME_ROUTE_TABLE_NAME
az network route-table route create \
    --resource-group $RG \
    --name $FWROUTE_NAME \
    --route-table-name $SERVICE_RUNTIME_ROUTE_TABLE_NAME \
    --address-prefix 0.0.0.0/0 \
    --next-hop-type VirtualAppliance \
    --next-hop-ip-address $FWPRIVATE_IP

添加防火墙规则

以下示例演示如何向防火墙添加规则。 有关详细信息,请参阅在虚拟网络中运行 Azure Spring Apps 的客户责任

# Add firewall network rules.

az network firewall network-rule create \
    --resource-group $RG \
    --firewall-name $FWNAME \
    --collection-name 'asafwnr' \
    --name 'springcloudtcp' \
    --protocols 'TCP' \
    --source-addresses '*' \
    --destination-addresses "AzureChinaCloud" \
    --destination-ports 443 445 \
    --action allow \
    --priority 100

# Add firewall application rules.

az network firewall application-rule create \
    --resource-group $RG \
    --firewall-name $FWNAME \
    --collection-name 'aksfwar'\
    --name 'fqdn' \
    --source-addresses '*' \
    --protocols 'https=443' \
    --fqdn-tags "AzureKubernetesService" \
    --action allow \
    --priority 100

将路由表与子网相关联

若要将群集与防火墙相关联,请确保群集的专用子网引用你创建的路由表。 应用和服务运行时子网必须与相应的路由表相关联。 以下示例演示如何将路由表与子网相关联:

# Associate the route table with a next hop to the firewall for the Azure Spring Apps subnet.

az network vnet subnet update \
    --resource-group $RG \
    --vnet-name $VNET_NAME \
    --name $ASA_APP_SUBNET_NAME \
    --route-table $APP_ROUTE_TABLE_NAME

az network vnet subnet update
    --resource-group $RG \
    --vnet-name $VNET_NAME \
    --name $ASA_SERVICE_RUNTIME_SUBNET_NAME \
    --route-table $SERVICE_RUNTIME_ROUTE_TABLE_NAME

为 Azure Spring Apps 资源提供程序添加角色

以下示例演示如何为 Azure Spring Apps 资源提供程序添加角色。 该角色将分配到由字符串 e8de9221-a19c-4c81-b814-fd37c6caf9d2 标识的所有用户:

export VIRTUAL_NETWORK_RESOURCE_ID=$(az network vnet show \
    --name $VNET_NAME \
    --resource-group $RG \
    --query "id" \
    --output tsv)

az role assignment create \
    --role "Owner" \
    --scope ${VIRTUAL_NETWORK_RESOURCE_ID} \
    --assignee e8de9221-a19c-4c81-b814-fd37c6caf9d2

export APP_ROUTE_TABLE_RESOURCE_ID=$(az network route-table show \
    --name $APP_ROUTE_TABLE_NAME \
    --resource-group $RG \
    --query "id" \
    --output tsv)

az role assignment create \
    --role "Owner" \
    --scope ${APP_ROUTE_TABLE_RESOURCE_ID} \
    --assignee e8de9221-a19c-4c81-b814-fd37c6caf9d2

export SERVICE_RUNTIME_ROUTE_TABLE_RESOURCE_ID=$(az network route-table show \
    --name $SERVICE_RUNTIME_ROUTE_TABLE_NAME \
    --resource-group $RG \
    --query "id" \
    --output tsv)

az role assignment create \
    --role "Owner" \
    --scope ${SERVICE_RUNTIME_ROUTE_TABLE_RESOURCE_ID} \
    --assignee e8de9221-a19c-4c81-b814-fd37c6caf9d2

使用用户定义的路由创建 Azure Spring Apps 实例

以下示例演示如何使用用户定义的路由创建 Azure Spring Apps 实例:

az spring create \
    --name $ASA_NAME \
    --resource-group $RG \
    --vnet $VNET_NAME \
    --app-subnet $ASA_APP_SUBNET_NAME \
    --service-runtime-subnet $ASA_SERVICE_RUNTIME_SUBNET_NAME \
    --outbound-type userDefinedRouting

现在可以从 Internet 访问防火墙的公共 IP 地址。 防火墙会根据你的路由规则将流量路由到 Azure Spring Apps 子网。

后续步骤