Share via


Configuración de una única dirección IP pública para el tráfico entrante y saliente a un grupo de contenedores

La configuración de un grupo de contenedores con una dirección IP externa permite a los clientes externos usar la dirección IP para tener acceso a un contenedor del grupo. Por ejemplo, un explorador puede acceder a una aplicación web que se ejecute en un contenedor. Sin embargo, actualmente un grupo de contenedores usa una dirección IP diferente para el tráfico saliente. Esta dirección IP de salida no se expone mediante programación, lo que hace que la supervisión del grupo de contenedores y la configuración de las reglas del firewall cliente sean más complejas.

En este artículo encontrará los pasos para configurar un grupo de contenedores en una red virtual integrada en Azure Firewall. Al configurar una ruta definida por el usuario para el grupo de contenedores y las reglas de firewall, puede enrutar e identificar el tráfico hacia y desde el grupo de contenedores. La entrada y la salida del grupo de contenedores usan la dirección IP pública del firewall. Una única dirección IP de salida puede usarse en varios grupos de contenedores implementados en la subred delegada en Azure Container Instances de dicha red virtual.

En este artículo, se usa la CLI de Azure para crear los recursos para este escenario:

  • Grupos de contenedores implementados en una subred delegada en la red virtual
  • Una instancia de Azure Firewall implementada en la red con una dirección IP pública estática
  • Una ruta definida por el usuario en la subred de los grupos de contenedores
  • Una regla NAT para la entrada de firewall y una regla de aplicación para la salida

A continuación, validará la entrada y salida de los grupos de contenedores de ejemplo a través del firewall.

Si no tiene una suscripción a Azure, cree una cuenta gratuita de Azure antes de empezar.

Requisitos previos

Inicio de Azure Cloud Shell

Azure Cloud Shell es un shell interactivo gratuito que puede usar para ejecutar los pasos de este artículo. Tiene las herramientas comunes de Azure preinstaladas y configuradas para usarlas en la cuenta.

Para abrir Cloud Shell, seleccione Pruébelo en la esquina superior derecha de un bloque de código. También puede ir a https://shell.azure.com para iniciar Cloud Shell en una pestaña independiente del explorador.

Cuando se abra Cloud Shell, compruebe que Bash está seleccionado para el entorno. En las sesiones siguientes se usará la CLI de Azure en un entorno de Bash, seleccione Copiar para copiar los bloques de código, péguelos en Cloud Shell y, luego, presione Entrar para ejecutarlos.

Inicio de sesión en Azure

Cloud Shell se autentica de forma automática en la cuenta inicial con la que ha iniciado sesión. Use el script siguiente para iniciar sesión con otra suscripción, y reemplace <Subscription ID> con el id. de la suscripción de Azure. Si no tiene una suscripción a Azure, cree una cuenta gratuita de Azure antes de empezar.

subscription="<subscriptionId>" # add subscription here

az account set -s $subscription # ...or use 'az login'

Para más información, vea Establecimiento de la suscripción activa o Inicio de sesión de forma interactiva

Nota:

Para descargar el script completo, vaya al script completo.

Introducción

En este tutorial, se usa una variable aleatoria. Si usa un grupo de recursos existente, modifique el valor de esta variable adecuadamente.

resourceGroup=resourceGroup$RANDOM

Grupo de recursos de Azure: si aún no tiene un grupo de recursos de Azure, cree un grupo de recursos con el comando az group create. Modifique el valor de ubicación según sea necesario.

az group create --name $resourceGroup --location eastus

Implementación de ACI en una red virtual

En un caso típico, es posible que ya tenga una instancia de Azure Virtual Network donde implementar un grupo de contenedores. Para fines de demostración, los siguientes comandos crean una red virtual y una subred cuando se crea el grupo de contenedores. La subred se delega en Azure Container Instances.

El grupo de contenedores ejecuta una pequeña aplicación web desde la imagen aci-helloworld. Como se muestra en otros artículos de la documentación, esta imagen empaqueta una pequeña aplicación web escrita en Node.js que sirve una página HTML estática.

Cree el grupo de contenedores con el comando az container create:

az container create \
  --name appcontainer \
  --resource-group $resourceGroup \
  --image mcr.microsoft.com/azuredocs/aci-helloworld \
  --vnet aci-vnet \
  --vnet-address-prefix 10.0.0.0/16 \
  --subnet aci-subnet \
  --subnet-address-prefix 10.0.0.0/24

Sugerencia

Ajuste el valor de --subnet address-prefix para el espacio de direcciones IP que necesita en la subred. La subred compatible más pequeña es /29, que proporciona ocho direcciones IP. Ciertas direcciones IP están reservadas para uso por parte de Azure.

Para su uso en un paso posterior, obtenga la dirección IP privada del grupo de contenedores con el comando [az container show][az-container-show]:

aciPrivateIp="$(az container show --name appcontainer \
  --resource-group $resourceGroup \
  --query ipAddress.ip --output tsv)"

Implementación de Azure Firewall en la red

En las secciones siguientes, use la CLI de Azure para implementar una instancia de Azure Firewall en la red virtual. Para obtener información general, consulte Tutorial: Implementación y configuración de Azure Firewall mediante Azure Portal.

En primer lugar, use az network vnet subnet create para agregar una subred denominada AzureFirewallSubnet para el firewall. AzureFirewallSubnet es el nombre obligatorio de esta subred.

az network vnet subnet create \
  --name AzureFirewallSubnet \
  --resource-group $resourceGroup \
  --vnet-name aci-vnet   \
  --address-prefix 10.0.1.0/26

Use los siguientes comandos de la CLI de Azure para crear un firewall en la subred.

Si aún no está instalada, agregue la extensión de firewall a la CLI de Azure mediante el comando az extension add:

az extension add --name azure-firewall

Cree los recursos del firewall mediante la ejecución del comando az network firewall create:

az network firewall create \
  --name myFirewall \
  --resource-group $resourceGroup \
  --location eastus

az network public-ip create \
  --name fw-pip \
  --resource-group $resourceGroup \
  --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 $resourceGroup \
  --vnet-name aci-vnet

Actualice la configuración del firewall mediante el comando az network firewall update:

az network firewall update \
  --name myFirewall \
  --resource-group $resourceGroup

Para obtener la dirección IP privada del firewall, use el comando az network firewall ip-config list. Esta dirección IP privada se usa en un comando posterior.

fwPrivateIp="$(az network firewall ip-config list \
  --resource-group $resourceGroup \
  --firewall-name myFirewall \
  --query "[].privateIpAddress" --output tsv)"

Para obtener la dirección IP pública del firewall, use el comando az network public-ip show. Esta dirección IP pública se usa en un comando posterior.

fwPublicIp="$(az network public-ip show \
  --name fw-pip \
  --resource-group $resourceGroup \
  --query ipAddress --output tsv)"

Definición de la ruta definida por el usuario en la subred de ACI

Defina una ruta definida por el uso en la subred de ACI para desviar el tráfico a Azure Firewall. Para obtener más información, consulte Enrutamiento del tráfico de red.

Creación de una tabla de rutas

En primer lugar, ejecute el comando siguiente az network route-table create para crear la tabla de rutas. Cree la tabla de rutas en la misma región que la red virtual.

az network route-table create \
  --name Firewall-rt-table \
  --resource-group $resourceGroup \
  --location eastus \
  --disable-bgp-route-propagation true

Creación de una ruta

Ejecute az network route-table route create para crear una ruta en la tabla de rutas. Para enrutar el tráfico al firewall, establezca el tipo de próximo salto en VirtualAppliance y pase la dirección IP privada del firewall como dirección del próximo salto.

az network route-table route create \
  --resource-group $resourceGroup \
  --name DG-Route \
  --route-table-name Firewall-rt-table \
  --address-prefix 0.0.0.0/0 \
  --next-hop-type VirtualAppliance \
  --next-hop-ip-address $fwPrivateIp

Asociación de una tabla de rutas a una subred de ACI

Ejecute el comando az network vnet subnet update para asociar la tabla de rutas con la subred delegada en Azure Container Instances.

az network vnet subnet update \
  --name aci-subnet \
  --resource-group $resourceGroup \
  --vnet-name aci-vnet \
  --address-prefixes 10.0.0.0/24 \
  --route-table Firewall-rt-table

Configuración de reglas en el firewall

De forma predeterminada, Azure Firewall deniega (bloquea) el tráfico entrante y saliente.

Configuración de la regla NAT en el firewall a la subred de ACI

Cree una regla NAT en el firewall para traducir y filtrar el tráfico entrante de Internet al contenedor de la aplicación que inició anteriormente en la red. Para obtener más detalles, consulte Filtrado del tráfico de entrada de Internet con la DNAT de Azure Firewall.

Cree una regla NAT y una colección mediante el comando az network firewall nat-rule create:

az network firewall nat-rule create \
  --firewall-name myFirewall \
  --collection-name myNATCollection \
  --action dnat \
  --name myRule \
  --protocols TCP \
  --source-addresses '*' \
  --destination-addresses $fwPublicIp \
  --destination-ports 80 \
  --resource-group $resourceGroup \
  --translated-address $aciPrivateIp \
  --translated-port 80 \
  --priority 200

Agregue reglas NAT según sea necesario para filtrar el tráfico a otras direcciones IP de la subred. Por ejemplo, otros grupos de contenedores de la subred podrían exponer direcciones IP para el tráfico entrante, o bien se podrían asignar otras direcciones IP internas al grupo de contenedores después de un reinicio.

Creación de una regla de aplicación de salida en el firewall

Ejecute el siguiente comando az network firewall application-rule create para crear una regla de salida en el firewall. Esta regla de ejemplo permite el acceso desde la subred delegada en Azure Container Instances al FQDN checkip.dyndns.org. El acceso HTTP al sitio se usa en un paso posterior para confirmar la dirección IP de salida desde Azure Container Instances.

az network firewall application-rule create \
  --collection-name myAppCollection \
  --firewall-name myFirewall \
  --name Allow-CheckIP \
  --protocols Http=80 Https=443 \
  --resource-group $resourceGroup \
  --target-fqdns checkip.dyndns.org \
  --source-addresses 10.0.0.0/24 \
  --priority 200 \
  --action Allow

Prueba del acceso del grupo de contenedores a través del firewall

En las secciones siguientes se verifica si la subred delegada en Azure Container Instances está configurada correctamente detrás de la instancia de Azure Firewall. En los pasos anteriores se enrutó el tráfico entrante a la subred y el tráfico saliente desde la subred a través del firewall.

Prueba de la entrada a un grupo de contenedores

Para probar el acceso de entrada al appcontainer que se ejecuta en la red virtual, vaya a la dirección IP pública del firewall. Anteriormente, almacenó la dirección IP pública en la variable $FW_PUBLIC_IP:

echo $fwPublicIp

La salida es parecida a esta:

52.142.18.133

Si la regla NAT en el firewall está configurada correctamente, verá lo siguiente al escribir la dirección IP pública del firewall en el explorador:

Browse to firewall's public IP address

Prueba de la salida desde un grupo de contenedores

Implemente el siguiente contenedor de ejemplo en la red virtual. Cuando se ejecuta, envía una única solicitud HTTP a http://checkip.dyndns.org, que muestra la dirección IP del remitente (la dirección IP de salida). Si la regla de aplicación en el firewall está configurada correctamente, se devuelve la dirección IP pública del firewall.

az container create \
  --resource-group $resourceGroup \
  --name testegress \
  --image mcr.microsoft.com/azuredocs/aci-tutorial-sidecar \
  --command-line "curl -s http://checkip.dyndns.org" \
  --restart-policy OnFailure \
  --vnet aci-vnet \
  --subnet aci-subnet

Vea los registros de contenedor para confirmar que la dirección IP sea la misma que la dirección IP pública del firewall.

az container logs \
  --resource-group $resourceGroup \
  --name testegress 

La salida es parecida a esta:

<html><head><title>Current IP Check</title></head><body>Current IP Address: 52.142.18.133</body></html>

Limpieza de recursos

Cuando ya no los necesite, puede usar el comando az group delete para quitar el grupo de recursos y todos los recursos relacionados como se indica a continuación. El parámetro --no-wait devuelve el control a la petición de confirmación sin esperar a que finalice la operación. El parámetro --yes confirma que desea eliminar los recursos sin pedir confirmación adicional.

az group delete --name $resourceGroup --yes --no-wait

Pasos siguientes

En este artículo, configuró grupos de contenedores en una red virtual detrás de una instancia de Azure Firewall. Configuró una ruta definida por el usuario y reglas NAT y de aplicación en el firewall. Mediante esta configuración, configuró una única dirección IP estática para la entrada y salida desde Azure Container Instances.

Para obtener más información sobre cómo administrar el tráfico y proteger los recursos de Azure, consulte la documentación de Azure Firewall.