Share via


Configurar um único endereço IP público para tráfego de entrada e saída para um grupo de contêineres

A configuração de um grupo de contêineres com um endereço IP externo permite que clientes externos usem o endereço IP para acessar um contêiner no grupo . Por exemplo, um navegador pode acessar um aplicativo Web em execução em um contêiner. No entanto, atualmente um grupo de contêineres usa um endereço IP diferente para o tráfego de saída. Esse endereço IP de saída não é exposto programaticamente, o que torna o monitoramento do grupo de contêineres e a configuração das regras de firewall do cliente mais complexos.

Este artigo fornece etapas para configurar um grupo de contêineres em uma rede virtual integrada ao Firewall do Azure. Ao configurar uma rota definida pelo usuário para o grupo de contêineres e as regras de firewall, você pode rotear e identificar o tráfego de e para o grupo de contêineres. A entrada e saída do grupo de contêineres usa o endereço IP público do firewall. Um único endereço IP de saída pode ser usado por vários grupos de contêineres implantados na sub-rede da rede virtual delegada às Instâncias de Contêiner do Azure.

Neste artigo, você usa a CLI do Azure para criar os recursos para este cenário:

  • Grupos de contêineres implantados em uma sub-rede delegada na rede virtual
  • Um firewall do Azure implantado na rede com um endereço IP público estático
  • Uma rota definida pelo usuário na sub-rede dos grupos de contêineres
  • Uma regra NAT para entrada de firewall e uma regra de aplicativo para saída

Em seguida, você valida a entrada e a saída de grupos de contêineres de exemplo por meio do firewall.

Se não tiver uma subscrição do Azure, crie uma conta gratuita do Azure antes de começar.

Pré-requisitos

  • Use o ambiente Bash no Azure Cloud Shell. Para obter mais informações, consulte Guia de início rápido para Bash no Azure Cloud Shell.

  • Se preferir executar comandos de referência da CLI localmente, instale a CLI do Azure. Se estiver a utilizar o Windows ou macOS, considere executar a CLI do Azure num contentor Docker. Para obter mais informações, consulte Como executar a CLI do Azure em um contêiner do Docker.

    • Se estiver a utilizar uma instalação local, inicie sessão no CLI do Azure ao utilizar o comando az login. Para concluir o processo de autenticação, siga os passos apresentados no seu terminal. Para outras opções de entrada, consulte Entrar com a CLI do Azure.

    • Quando solicitado, instale a extensão da CLI do Azure na primeira utilização. Para obter mais informações sobre as extensões, veja Utilizar extensões com o CLI do Azure.

    • Execute o comando az version para localizar a versão e as bibliotecas dependentes instaladas. Para atualizar para a versão mais recente, execute o comando az upgrade.

Iniciar o Azure Cloud Shell

O Azure Cloud Shell é um shell interativo gratuito que pode utilizar para executar os passos neste artigo. Tem as ferramentas comuns do Azure pré-instaladas e configuradas para utilização com a sua conta.

Para abrir o Cloud Shell, basta selecionar Experimentar no canto superior direito de um bloco de código. Também pode iniciar o Cloud Shell num separador do browser separado ao aceder a https://shell.azure.com.

Quando o Cloud Shell abrir, verifique se o Bash está selecionado para o seu ambiente. As sessões subsequentes usarão a CLI do Azure em um ambiente Bash, selecione Copiar para copiar os blocos de código, cole-o no Cloud Shell e pressione Enter para executá-lo.

Iniciar sessão no Azure

O Cloud Shell é autenticado automaticamente na conta inicial com a qual entrou conectado. Use o script a seguir para entrar usando uma assinatura diferente, substituindo <Subscription ID> por sua ID de Assinatura do Azure. Se não tiver uma subscrição do Azure, crie uma conta gratuita do Azure antes de começar.

subscription="<subscriptionId>" # add subscription here

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

Para obter mais informações, consulte definir assinatura ativa ou fazer login interativamente

Nota

Para baixar o script completo, vá para o script completo.

Introdução

Este tutorial faz uso de uma variável aleatória. Se você estiver usando um grupo de recursos existente, modifique o valor dessa variável apropriadamente.

resourceGroup=resourceGroup$RANDOM

Grupo de recursos do Azure: se você ainda não tiver um grupo de recursos do Azure, crie um grupo de recursos com o comando az group create . Modifique o valor do local conforme apropriado.

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

Implantar ACI em uma rede virtual

Em um caso típico, talvez você já tenha uma rede virtual do Azure na qual implantar um grupo de contêineres. Para fins de demonstração, os comandos a seguir criam uma rede virtual e uma sub-rede quando o grupo de contêineres é criado. A sub-rede é delegada às Instâncias de Contêiner do Azure.

O grupo de contêineres executa um pequeno aplicativo Web a partir da aci-helloworld imagem. Como mostrado em outros artigos da documentação, esta imagem empacota um pequeno aplicativo Web escrito em Node.js que serve uma página HTML estática.

Crie o grupo de contêineres com o 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

Gorjeta

Ajuste o valor de para o espaço de --subnet address-prefix endereço IP que você precisa em sua sub-rede. A menor sub-rede suportada é /29, que fornece oito endereços IP. Alguns endereços IP são reservados para uso pelo Azure.

Para uso em uma etapa posterior, obtenha o endereço IP privado do grupo de contêineres executando o comando [az container show][az-container-show]:

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

Implantar o Firewall do Azure na rede

Nas seções a seguir, use a CLI do Azure para implantar um firewall do Azure na rede virtual. Para obter plano de fundo, consulte Tutorial: Implantar e configurar o Firewall do Azure usando o portal do Azure.

Primeiro, use a sub-rede az network vnet create para adicionar uma sub-rede chamada AzureFirewallSubnet para o firewall. AzureFirewallSubnet é o nome necessário desta sub-rede.

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

Use os seguintes comandos da CLI do Azure para criar um firewall na sub-rede.

Se ainda não estiver instalado, adicione a extensão de firewall à CLI do Azure usando o comando az extension add :

az extension add --name azure-firewall

Crie os recursos de firewall usando o 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

Atualize a configuração do firewall usando o comando az network firewall update :

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

Obtenha o endereço IP privado do firewall usando o comando az network firewall ip-config list . Este endereço IP privado é usado em um comando posterior.

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

Obtenha o endereço IP público do firewall usando o comando az network public-ip show . Esse endereço IP público é usado em um comando posterior.

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

Definir rota definida pelo usuário na sub-rede ACI

Defina uma rota definida pelo uso na sub-rede ACI para desviar o tráfego para o firewall do Azure. Para obter mais informações, consulte Rotear tráfego de rede.

Criar tabela de rotas

Primeiro, execute o seguinte comando az network route-table create para criar a tabela de rotas. Crie a tabela de rotas na mesma região da rede virtual.

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

Criar rota

Execute az network-route-table route create para criar uma rota na tabela de rotas. Para rotear o tráfego para o firewall, defina o próximo tipo de salto como , e passe o endereço IP privado do firewall como VirtualApplianceo endereço do 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

Associar tabela de rotas à sub-rede ACI

Execute o comando az network vnet subnet update para associar a tabela de rotas à sub-rede delegada às Instâncias de Contêiner do Azure.

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

Configurar regras no firewall

Por padrão, o Firewall do Azure nega (bloqueia) o tráfego de entrada e saída.

Configurar a regra NAT no firewall para a sub-rede ACI

Crie uma regra NAT no firewall para traduzir e filtrar o tráfego de entrada da Internet para o contêiner de aplicativo iniciado anteriormente na rede. Para obter detalhes, consulte Filtrar tráfego de entrada da Internet com DNAT do Firewall do Azure

Crie uma regra NAT e uma coleção usando o 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

Adicione regras NAT conforme necessário para filtrar o tráfego para outros endereços IP na sub-rede. Por exemplo, outros grupos de contêineres na sub-rede podem expor endereços IP para tráfego de entrada ou outros endereços IP internos podem ser atribuídos ao grupo de contêineres após uma reinicialização.

Criar regra de aplicativo de saída no firewall

Execute o seguinte comando az network firewall application-rule create para criar uma regra de saída no firewall. Esta regra de exemplo permite o acesso da sub-rede delegada às Instâncias de Contêiner do Azure ao FQDN checkip.dyndns.org. O acesso HTTP ao site é usado em uma etapa posterior para confirmar o endereço IP de saída das Instâncias de Contêiner do Azure.

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

Testar o acesso ao grupo de contêineres por meio do firewall

As seções a seguir verificam se a sub-rede delegada às Instâncias de Contêiner do Azure está configurada corretamente por trás do firewall do Azure. As etapas anteriores rotearam o tráfego de entrada para a sub-rede e o tráfego de saída da sub-rede através do firewall.

Testar a entrada em um grupo de contêineres

Teste o appcontainer acesso de entrada à execução na rede virtual navegando até o endereço IP público do firewall. Anteriormente, você armazenava o endereço IP público na variável $FW_PUBLIC_IP:

echo $fwPublicIp

A saída é semelhante a:

52.142.18.133

Se a regra NAT no firewall estiver configurada corretamente, você verá o seguinte quando inserir o endereço IP público do firewall no navegador:

Browse to firewall's public IP address

Testar a saída de um grupo de contêineres

Implante o seguinte contêiner de exemplo na rede virtual. Quando é executado, ele envia uma única solicitação HTTP para http://checkip.dyndns.orgo , que exibe o endereço IP do remetente (o endereço IP de saída). Se a regra de aplicativo no firewall estiver configurada corretamente, o endereço IP público do firewall será retornado.

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

Exiba os logs do contêiner para confirmar se o endereço IP é o mesmo que o endereço IP público do firewall.

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

A saída é semelhante a:

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

Clean up resources (Limpar recursos)

Quando não for mais necessário, você pode usar az group delete para remover o grupo de recursos e todos os recursos relacionados da seguinte maneira. O parâmetro --no-wait devolve o controlo à linha de comandos, sem aguardar a conclusão da operação. O parâmetro --yes confirma que pretende eliminar os recursos sem uma linha de comandos adicional para fazê-lo.

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

Próximos passos

Neste artigo, você configura grupos de contêineres em uma rede virtual atrás de um firewall do Azure. Você configurou uma rota definida pelo usuário e regras de NAT e aplicativo no firewall. Usando essa configuração, você configura um único endereço IP estático para entrada e saída das Instâncias de Contêiner do Azure.

Para obter mais informações sobre como gerenciar o tráfego e proteger os recursos do Azure, consulte a documentação do Firewall do Azure.