Compartilhar via


Configurar um IP para tráfego de entrada e de 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 os 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 as etapas para configurar um grupo de contêineres em uma rede virtual integrada ao Firewall do Azure. Ao configurar a 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 a saída do grupo de contêineres usam o IP do firewall. Vários grupos de contêineres implantados na sub-rede da rede virtual podem usar um único endereço IP de saída.

Neste artigo, a CLI do Azure é usada 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 IP estático
  • Uma rota definida pelo usuário na sub-rede dos grupos de contêineres
  • Uma regra NAT para a entrada de firewall e uma regra de aplicativo para a saída

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

Caso você não tenha uma assinatura do Azure, crie uma conta gratuita do Azure antes de começar.

Pré-requisitos

Iniciar o Azure Cloud Shell

O Azure Cloud Shell é um shell gratuito e interativo que poderá ser usado para executar as etapas deste artigo. Ele tem ferramentas do Azure instaladas e configuradas para usar com sua conta.

Para abrir o Cloud Shell, basta selecionar Experimentar no canto superior direito de um bloco de código. Você também pode iniciar o Cloud Shell em uma guia separada do navegador indo até https://shell.azure.com.

Quando o Cloud Shell abrir, verifique se o Bash está selecionado para o 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-os no Cloud Shell e pressione Enter para executá-los.

Entrar no Azure

O Cloud Shell é autenticado automaticamente na conta inicial usada para entrar. Use o seguinte script para entrar com outra assinatura, substituindo subscriptionId pela ID de sua assinatura do Azure.

Caso você não tenha uma assinatura do Azure, crie uma conta gratuita do Azure antes de começar.

subscription="subscriptionId" # Set Azure subscription ID here

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

Para saber mais, confira definir assinatura ativa ou fazer logon de forma interativa.

Observação

Para baixar o script completo, acesse script completo.

Introdução

Este tutorial usa uma variável aleatória. Se você usou um grupo de recursos que já existe, modifique o valor dessa variável adequadamente.

resourceGroup=resourceGroup$RANDOM

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

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

Implantar as Instâncias de Contêiner do Azure em uma rede virtual

Normalmente, já existe 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 para as Instâncias de Contêiner do Azure.

O grupo de contêineres executa um pequeno aplicativo Web da imagem aci-helloworld. Conforme mostrado em outros artigos da documentação, essa imagem empacota um pequeno aplicativo Web escrito em Node.js que atende a 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

Dica

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

Obtenha o endereço IP privado do grupo de contêineres executando o comando[az container show][az-container-show], que será usado em uma etapa posterior:

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 saber mais sobre isso, confira Tutorial: implantar e configurar o Firewall do Azure usando o portal do Azure.

Use o comando az network vnet subnet create para adicionar uma sub-rede chamada AzureFirewallSubnet para o firewall. O nome dessa sub-rede deve ser AzureFirewallSubnet.

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

Use os comandos da CLI do Azure a seguir 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. Esse endereço IP privado vai ser usado em um comando posterior.

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

Obtenha o IP do firewall usando o comando az network public-ip show. Esse IP vai ser usado em um comando posterior.

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

Determinar a rota definida pelo usuário na sub-rede das Instâncias de Contêiner do Azure

Para desviar o tráfego para o Firewall do Azure, determine uma rota definida pelo usuário na sub-rede da ACI. Para obter mais informações, confira Rotear o tráfego de rede.

Criar tabela de rotas

Execute o comando az network route-table create a seguir 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 o comando az network-route-table route create para criar uma rota na tabela de rotas. Para rotear o tráfego para o firewall, defina o tipo do próximo salto como VirtualAppliance e passe o endereço IP privado do firewall como o 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 a tabela de rotas à sub-rede das Instâncias de Contêiner do Azure

Execute o comando az network vnet subnet update para associar a tabela de rotas à sub-rede delegada para as 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) os tráfegos de entrada e de saída.

Configurar a regra NAT no firewall para a sub-rede das Instâncias de Contêiner do Azure

Crie uma regra NAT no firewall para converter e filtrar o tráfego de Internet de entrada para o contêiner de aplicativos que você iniciou anteriormente na rede. Para saber mais detalhes, confira Filtrar o tráfego da Internet de entrada com o 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 o 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 os endereços IP para o 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 comando az network firewall application-rule create a seguir para criar uma regra de saída no firewall. Essa regra de exemplo permite o acesso da sub-rede delegada às Instâncias de Contêiner do Azure para o 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 para 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 na sub-rede e o tráfego de saída da sub-rede por meio do firewall.

Testar a entrada em um grupo de contêineres

Teste o acesso de entrada no appcontainer em execução na rede virtual navegando até o IP do firewall. Anteriormente, você armazenou o IP 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ê vai ver o seguinte ao inserir o IP do firewall em seu navegador:

Navegar até o IP do firewall

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

Implante o contêiner de exemplo a seguir na rede virtual. Quando é executado, ele envia uma solicitação HTTP para http://checkip.dyndns.org, 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 IP do firewall vai 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

Veja os logs de contêiner para confirmar se o endereço IP é o mesmo que o IP 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>

Limpar os recursos

Quando não for mais necessário, use az group delete para remover o grupo de recursos e todos os recursos relacionados, como demonstrado a seguir. O parâmetro --no-wait retorna o controle ao prompt sem aguardar a conclusão da operação. O parâmetro --yes confirma que você deseja excluir os recursos sem outro prompt para fazer isso.

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

Próximas etapas

Nesse artigo, você configurou grupos de contêineres em uma rede virtual por trás de um firewall do Azure. Você configurou uma rota definida pelo usuário e as regras NAT e de aplicativo no firewall. Ao usar essa configuração, você configurou um endereço IP estático para a entrada e a saída de Instâncias de Contêiner do Azure.

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