Share via


Control del tráfico de salida de una instancia de Azure Spring Apps

Este artículo se aplica a: ✔️ Java ✔️ C#

La información de este artículo puede ponerse en práctica en: ✔️ Básico o Estándar ✔️ Enterprise

En este artículo se describe cómo proteger el tráfico saliente de las aplicaciones hospedadas en Azure Spring Apps. En el artículo se proporciona un ejemplo de una instancia de ruta definida por el usuario. Una ruta definida por el usuario es una característica avanzada que le permite controlar completamente el tráfico de salida. Puede usar una ruta definida por el usuario en escenarios como no permitir una dirección IP pública generada automáticamente de Azure Spring Apps.

Requisitos previos

Creación de una red virtual mediante una ruta definida por el usuario

En la ilustración siguiente se muestra un ejemplo de una red virtual de Azure Spring Apps que usa una ruta definida por el usuario (UDR).

Diagrama que muestra la arquitectura de una red virtual de Azure Spring Apps que usa una ruta definida por el usuario (UDR).

En este diagrama se muestran las siguientes características de la arquitectura:

  • El tráfico de entrada público debe fluir a través de filtros de firewall.
  • Cada instancia de Azure Spring Apps está aislada dentro de una subred dedicada.
  • Los clientes poseen y administran el firewall.
  • Esta estructura garantiza que el firewall habilita un entorno correcto para todas las funciones que necesita.
  • Azure Spring Apps no genera automáticamente recursos de dirección IP pública.

Definición de las variables de entorno

En el ejemplo siguiente se muestra cómo definir un conjunto de variables de entorno que se usarán en la creación de recursos:

export PREFIX="asa-egress"
export RG="${PREFIX}-rg"
export LOC="eastus"
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"

Creación de una red virtual con varias subredes

En esta sección se muestra cómo aprovisionar una red virtual con tres subredes independientes: una para las aplicaciones de usuario, otra para el entorno de ejecución del servicio y otra para el firewall.

En primer lugar, cree un grupo de recursos, como se muestra en el ejemplo siguiente:

# Create a resource group.

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

A continuación, cree una red virtual con tres subredes para hospedar las instancias de Azure Spring Apps y Azure Firewall, como se muestra en el ejemplo siguiente:

# 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

Configuración de una instancia de Azure Firewall con una ruta definida por el usuario

Use el siguiente comando para crear y configurar una instancia de Azure Firewall con una ruta definida por el usuario y configurar las reglas de salida de Azure Firewall. El firewall permite configurar reglas de tráfico de salida pormenorizadas desde Azure Spring Apps.

Importante

Si el clúster o la aplicación crea un gran número de conexiones de salida dirigidas al mismo destino o a un subconjunto de destinos más reducido, es posible que necesite más direcciones IP de front-end de firewall para evitar que se agoten los puertos por dirección IP de front-end. Para más información sobre cómo crear una instancia de Azure Firewall con varias direcciones IP, consulte Inicio rápido: Creación de instancia de Azure Firewall con varias direcciones IP públicas: plantilla de ARM. Cree un recurso de dirección IP pública de SKU estándar para su uso como dirección front-end de Azure Firewall.

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

En el ejemplo siguiente se muestra cómo instalar la extensión de la CLI de Azure Firewall (versión preliminar) e implementar Azure Firewall:

# 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

En el ejemplo siguiente se muestra cómo asignar la dirección IP que creó al front-end del firewall.

Nota:

La configuración de la dirección IP pública en la instancia de Azure Firewall puede tardar unos minutos. Para usar un nombre de dominio completo (FQDN) en las reglas de red, habilite un proxy DNS. Cuando habilite el proxy, el firewall escucha en el puerto 53 y reenvía las solicitudes DNS al servidor DNS especificado. A continuación, el firewall puede traducir automáticamente el 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

Una vez completada la operación, anote la dirección IP de front-end del firewall para la configuración posterior, como se muestra en el ejemplo siguiente:

# 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:]')

Creación de una ruta definida por el usuario con un salto a Azure Firewall

Azure enruta automáticamente el tráfico entre redes locales, las redes virtuales y las subredes de Azure. Si quiere cambiar el enrutamiento predeterminado en Azure, debe crear una tabla de rutas.

En el ejemplo siguiente se muestra cómo crear una tabla de rutas que se asociará a una subred especificada. La tabla de rutas define el próximo salto, como en la instancia de Azure Firewall que creó. Cada subred puede tener una tabla de rutas asociada o podría no tener ninguna tabla de rutas asociada.

# 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

Adición de reglas de firewall

En el ejemplo siguiente se muestra cómo agregar reglas al firewall. Para más información, consulte Responsabilidades del cliente para ejecutar Azure Spring Apps en una red virtual.

# 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 "AzureCloud" \
    --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

Asociación de tablas de rutas con subredes

Para asociar el clúster con el firewall, asegúrese de que la subred dedicada al clúster hace referencia a la tabla de rutas que ha creado. Las subredes en tiempo de ejecución de aplicaciones y servicios deben estar asociadas a las tablas de rutas correspondientes. En el ejemplo siguiente se muestra cómo asociar una tabla de rutas a una subred:

# 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

Adición de un rol para un proveedor de recursos de Azure Spring Apps

En el siguiente ejemplo se muestra cómo agregar un rol para el proveedor de recursos de Azure Spring Apps. El rol se asigna a todos los usuarios identificados por la cadena 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

Creación de una instancia de Azure Spring Apps con enrutamiento definido por el usuario

En el ejemplo siguiente se muestra cómo crear una instancia de Azure Spring Apps con enrutamiento definido por el usuario:

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

Ahora puede acceder a la dirección IP pública del firewall desde Internet. El firewall enruta el tráfico a subredes de Azure Spring Apps según las reglas de enrutamiento.

Pasos siguientes