Condividi tramite


Configurare un singolo indirizzo IP pubblico per il traffico in uscita e in ingresso a un gruppo di contenitori

La configurazione di un gruppo di contenitori con un indirizzo IP esterno consente ai client esterni di usare l'indirizzo IP per accedere a un contenitore nel gruppo. Ad esempio, un browser può accedere a un'app Web in esecuzione in un contenitore. Tuttavia, attualmente un gruppo di contenitori usa un indirizzo IP diverso per il traffico in uscita. Questo indirizzo IP in uscita non è esposto a livello di codice, che rende più complesso il monitoraggio e la configurazione dei gruppi di contenitori delle regole del firewall client.

Questo articolo illustra la procedura per configurare un gruppo di contenitori in una rete virtuale integrata con Firewall di Azure. Configurando una route definita dall'utente per il gruppo di contenitori e le regole del firewall, è possibile instradare e identificare il traffico da e verso il gruppo di contenitori. L'ingresso e l'uscita del gruppo di contenitori usano l'indirizzo IP pubblico del firewall. Più gruppi di contenitori distribuiti nella subnet della rete virtuale possono usare un singolo indirizzo IP in uscita.

In questo articolo viene usata l'interfaccia della riga di comando di Azure per creare le risorse per questo scenario:

  • Gruppi di contenitori distribuiti in una subnet delegata nella rete virtuale
  • Un firewall di Azure distribuito nella rete con un indirizzo IP pubblico statico
  • Route definita dall'utente nella subnet dei gruppi di contenitori
  • Una regola NAT per l'ingresso del firewall e una regola dell'applicazione per l'uscita

Si convalida quindi l'ingresso e l'uscita dai gruppi di contenitori di esempio attraverso il firewall.

Se non si ha una sottoscrizione di Azure, creare un account Azure gratuito prima di iniziare.

Prerequisiti

Avviare Azure Cloud Shell

Azure Cloud Shell è una shell interattiva gratuita che può essere usata per eseguire la procedura di questo articolo. Include strumenti comuni di Azure preinstallati e configurati per l'uso con l'account.

Per aprire Cloud Shell, basta selezionare Prova nell'angolo superiore destro di un blocco di codice. È anche possibile avviare Cloud Shell in una scheda separata del browser visitando https://shell.azure.com.

Quando si apre Cloud Shell, verificare che sia selezionato Bash per l'ambiente. Le sessioni successive useranno l'interfaccia della riga di comando di Azure in un ambiente Bash. Selezionare Copia per copiare i blocchi di codice, incollarli in Cloud Shell e premere INVIO per eseguirli.

Accedere ad Azure

Cloud Shell viene autenticato automaticamente con l'account iniziale con cui è stato eseguito l'accesso. Usare lo script seguente per accedere usando una sottoscrizione diversa, sostituendo subscriptionId con l'ID sottoscrizione di Azure.

Se non si ha una sottoscrizione di Azure, creare un account Azure gratuito prima di iniziare.

subscription="subscriptionId" # Set Azure subscription ID here

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

Per altre informazioni, vedere Impostare una sottoscrizione attiva o accedere in modo interattivo.

Nota

Per scaricare lo script completo, passare a Script completo.

Operazioni preliminari

Questa esercitazione usa una variabile casuale. Se è stato usato un gruppo di risorse esistente, modificare il valore di questa variabile in modo appropriato.

resourceGroup=resourceGroup$RANDOM

Gruppo di risorse di Azure: se non si dispone già un gruppo di risorse di Azure, creare un gruppo di risorse con il comando az group create. Modificare il valore della posizione in base alle esigenze.

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

Distribuire Istanze di Azure Container in una rete virtuale

In un caso tipico, potrebbe essere già disponibile una rete virtuale di Azure in cui distribuire un gruppo di contenitori. A scopo dimostrativo, i comandi seguenti creano una rete virtuale e una subnet quando viene creato il gruppo di contenitori. La subnet viene delegata a Istanze di Azure Container.

Il gruppo di contenitori esegue una piccola app Web dall'immagine aci-helloworld. Come illustrato in altri articoli della documentazione, in questa immagine è inclusa una piccola app Web scritta in Node.js che distribuisce una pagina HTML statica.

Creare il gruppo di contenitori con il 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

Suggerimento

Modificare il valore di --subnet address-prefix per lo spazio di indirizzi IP necessario nella subnet. La subnet più piccola supportata è /29, che fornisce otto indirizzi IP. Alcuni indirizzi IP sono riservati per l'uso da parte di Azure.

Per usarlo in un passaggio successivo, ottenere l'indirizzo IP privato del gruppo di contenitori eseguendo il comando [az container show][az-container-show]:

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

Distribuire Firewall di Azure in rete

Nelle sezioni seguenti usare l'interfaccia della riga di comando di Azure per distribuire un firewall di Azure nella rete virtuale. Per informazioni generali, vedere Esercitazione: distribuire e configurare Firewall di Azure usando il portale di Azure.

Per prima cosa, usare az network vnet subnet create per aggiungere una subnet denominata AzureFirewallSubnet per il firewall. AzureFirewallSubnet è il nome obbligatorio di questa subnet.

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

Usare i comandi dell'interfaccia della riga di comando di Azure seguenti per creare un firewall nella subnet.

Se non è già installato, aggiungere l'estensione del firewall all'interfaccia della riga di comando di Azure usando il comando az extension add:

az extension add --name azure-firewall

Creare le risorse del firewall usando il 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

Aggiornare la configurazione del firewall usando il comando az network firewall update:

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

Ottenere l'indirizzo IP privato del firewall usando il comando az network firewall ip-config list. Questo indirizzo IP privato viene usato in un comando successivo.

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

Ottenere l'indirizzo IP pubblico del firewall usando il comando az network public-ip show. Questo indirizzo IP pubblico viene usato in un comando successivo.

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

Definire una route definita dall'utente nella subnet ACI

Per deviare il traffico verso il firewall di Azure, definire una route definita dall'uso nella subnet ACI. Per altre informazioni, vedere Instradare il traffico di rete.

Creare una tabella di route

Eseguire prima di tutto il comando az network route-table createseguente per creare la tabella di route. Creare la tabella di route nella stessa area della rete virtuale.

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

Creare una route

Eseguire az network-route-table route create per creare una route nella tabella di route. Per instradare il traffico al firewall, impostare il tipo di hop successivo su VirtualAppliance e passare l'indirizzo IP privato del firewall come indirizzo hop successivo.

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

Associare la tabella di route alla subnet ACI

Eseguire il comando az network vnet subnet update per associare la tabella di route alla subnet delegata a Istanze di Azure Container.

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

Configurare le regole nel firewall

Per impostazione predefinita, Firewall di Azure nega (blocchi) il traffico in ingresso e in uscita.

Configurare la regola NAT nel firewall per la subnet ACI

Creare una regola NAT nel firewall per convertire e filtrare il traffico Internet in ingresso nel contenitore dell'applicazione avviato in precedenza nella rete. Per informazioni dettagliate, vedere Filtrare il traffico Internet in ingresso con DNAT di Firewall di Azure

Creare una regola e una raccolta NAT usando il 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

Aggiungere regole NAT in base alle esigenze per filtrare il traffico ad altri indirizzi IP nella subnet. Ad esempio, altri gruppi di contenitori nella subnet potrebbero esporre indirizzi IP per il traffico in ingresso, oppure altri indirizzi IP interni potrebbero essere assegnati al gruppo di contenitori dopo un riavvio.

Creare una regola dell'applicazione in uscita nel firewall

Eseguire il comando az network firewall application-rule createseguente per creare una regola in uscita nel firewall. Questa regola di esempio consente l'accesso dalla subnet delegata a Istanze di Azure Container al nome di dominio completo checkip.dyndns.org. L'accesso HTTP al sito viene usato in un passaggio successivo per confermare l'indirizzo IP in uscita da Istanze di Azure Container.

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

Testare l'accesso al gruppo di contenitori tramite il firewall

Le sezioni seguenti verificano che la subnet delegata a Istanze di Azure Container sia configurata correttamente dietro il firewall di Azure. I passaggi precedenti instradavano il traffico in ingresso alla subnet e al traffico in uscita dalla subnet attraverso il firewall.

Testare l'ingresso in un gruppo di contenitori

Testare l'accesso in ingresso al appcontainer in esecuzione nella rete virtuale passando all'indirizzo IP pubblico del firewall. In precedenza, l'indirizzo IP pubblico è stato archiviato nella variabile $FW_PUBLIC_IP:

echo $fwPublicIp

L'output è simile a:

52.142.18.133

Se la regola NAT nel firewall è configurata correttamente, quando si immette l'indirizzo IP pubblico del firewall nel browser viene visualizzato quanto segue:

Passare all'indirizzo IP pubblico del firewall

Testare l'uscita da un gruppo di contenitori

Distribuire il contenitore di esempio seguente nella rete virtuale. Al momento dell’esecuzione, invia una singola richiesta HTTP a http://checkip.dyndns.org, che visualizza l'indirizzo IP del mittente (indirizzo IP in uscita). Se la regola dell'applicazione nel firewall è configurata correttamente, viene restituito l'indirizzo IP pubblico 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

Visualizzare i log del contenitore per verificare che l'indirizzo IP corrisponda all'indirizzo IP pubblico del firewall.

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

L'output è simile a:

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

Pulire le risorse

Quando il gruppo di risorse e tutte le risorse correlate non sono più necessari, è possibile usare il comando az group delete per rimuoverli come segue. Il parametro --no-wait restituisce il controllo al prompt senza attendere il completamento dell'operazione. Il parametro --yes conferma che si vogliono eliminare le risorse senza una richiesta aggiuntiva a tale scopo.

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

Passaggi successivi

Questo articolo illustra come configurare i gruppi di contenitori in una rete virtuale dietro un firewall di Azure. È stata configurata una route definita dall'utente e le regole NAT e dell'applicazione nel firewall. Usando questa configurazione, viene configurato un singolo indirizzo IP statico per l'ingresso e l'uscita da Istanze di Azure Container.

Per altre informazioni sulla gestione del traffico e sulla protezione delle risorse di Azure, vedere la documentazione Firewall di Azure.