Share via


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. Un singolo indirizzo IP in uscita può essere usato da più gruppi di contenitori distribuiti nella subnet della rete virtuale delegata a Istanze di Azure Container.

In questo articolo si usa 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 Bash sia selezionato per l'ambiente in uso. 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 eseguirlo.

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 <Subscription ID> con l'ID sottoscrizione di Azure. Se non si ha una sottoscrizione di Azure, creare un account Azure gratuito prima di iniziare.

subscription="<subscriptionId>" # add subscription 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 allo script completo.

Introduzione

Questa esercitazione usa una variabile casuale. Se si usa 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 ha 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 ACI 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, questa immagine include una piccola app Web scritta in Node.js che serve 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 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.

Usare prima di tutto il comando 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 seguenti dell'interfaccia della riga di comando di Azure 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

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

Creare una tabella di route

Eseguire prima di tutto il comando az network route-table create seguente 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 VirtualAppliancee 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 Firewall di Azure DNAT

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 gli indirizzi IP per il traffico in ingresso o altri indirizzi IP interni possono 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 create seguente per creare una regola in uscita nel firewall. Questa regola di esempio consente l'accesso dalla subnet delegata a Istanze di Azure Container all'FQDN 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 all'oggetto 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:

Browse to firewall's public IP address

Testare l'uscita da un gruppo di contenitori

Distribuire il contenitore di esempio seguente nella rete virtuale. Quando viene eseguita, 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 non è più necessario, è possibile usare az group delete per rimuovere il gruppo di risorse e tutte le risorse correlate come indicato di seguito. Il parametro --no-wait restituisce il controllo al prompt senza attendere il completamento dell'operazione. Il parametro --yes conferma che si desidera eliminare le risorse senza un prompt aggiuntivo 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, si configura 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.