NAT & ACL with AWS - Tutorial


NAT & ACL with AWS - Tutorial

Accesso ad AWS

Per questo tutorial, non è possibile usare l’account di classe perché alcune funzioni sono limitate, bisognerà usare il proprio free starter account.

Accedere alla console di AWS del proprio starter account (non quello della classe), potete farlo accedendo ad AWS educate con le solite credenziali e quindi selezionando in alto a destra su AWS Account e quindi su Starter Account.

Creazione NAT Gateway

Nella console, selezionate il Servizio VPC.

Nel menu a destra, selezionate NAT gateway e createne uno.

Associate un indirizzo IP elastico. Se non ne avete nessuno disponibile, fatevene creare uno sul momento.

Fine! Il NAT Gateway è pronto.

Impostazione ACL

Immaginiamo che la nostra subnet ospiti un sito web, che vogliamo far visitare anche dall’esterno. Modifichiamo le ACL di conseguenza.
Nel menu a destra, selezionate Netwoark ACLs e modificate le regole come specificato di seguito.

Regole inbound

Filtra i pacchetti in ingresso alla nostra rete. Impostiamole in modo che:

  • sia permesso il traffico HTTP e HTTPS da chiunque
  • sia permesso il traffico SSH da chiunque; nota: quando andremo in produzione dovremo ricordarci di limitare l’accesso solo ad un numero limitato di indirizzi IP affidabili
  • sia permesso il traffico di ritorno delle richieste della nostra subnet verso il mondo esterno; dobbiamo accettare il protocollo TCP da qualsiasi sorgente con il range di porte 32768-65535
  • sia permesso il ping
  • tutte le altre richieste devono essere negate (ricordatevi quindi di cancellare la regola che accetta tutto).

Regole outbound

Filtra i pacchetti in uscita alla nostra rete. Impostiamole in modo che:

  • sia permesso il traffico HTTP e HTTPS verso chiunque (utile se dobbiamo fare richieste ad altri server
  • sia permesso il traffico delle richieste originate dall’esterno verso il nostro server; dobbiamo accettare il protocollo TCP verso qualsiasi destinazione con il range di porte 32768-65535
  • sia permesso il ping
  • tutte le altre richieste devono essere negate (ricordatevi quindi di cancellare la regola che accetta tutto).

Verifica della configurazione

Per verificare la configurazione, dobbiamo creare delle macchine virtuali su EC2.

L’obiettivo è dimostrare che è possibile accedere ad internet dall’interno della nostra rete anche se una macchina non ha un indirizzo IP pubblico, ma solo quello privato.

Nota sull’accesso alle macchine dall’esterno

Per poter testare la configurazione, dobbiamo entrare in SSH all’interno delle nostre macchine dal nostro computer di casa o di scuola. Questo non è banale con il NAT perché le macchine interne hanno solo indirizzi IP privati e non sono quindi raggiungibili dall’esterno. Ricordiamo infatti che il NAT risolve il problema per una LAN di accedere all’esterno, ma non il problema di accedere dall’esterno ai computer della nostra LAN.

Per risolvere questa situazione ci sono diverse strategie:

  • port forwarding: diciamo al firewall che se proviamo ad accedere sulla porta 22, la richiesta deve essere reindirizzata ad una specifica macchina interna alla LAN; questa strategia non è semplice da implementare su AWS nella nostra configurazione
  • bastion host (computer bastione): una macchina con indirizzo IP pubblico all’interno di una nostra subnet pubblica che accessibile dall’esterno e che ci fa da tramite per il resto della nostra rete interna.

Useremo questa seconda strategia, quindi andremo a creare due macchine: una la chiamiamo PC0-bastion e l’altra PC1.

Creazione delle macchine

Andiamo sul nostro account AWS e tra i servizi scegliamo EC2.

Useremo la subnet 0 come sottorete pubblica, e la subnet 1 come sottorete privata.

PC0-bastion

Andiamo a sinistra su Istanze, quindi in alto a destra Lancia instanze. Lasciamo Amazon Linux 2 AMI e premiamo su Seleziona. Lasciamo t2.micro e ancora Next: Configura dettagli istanza.

Nella schermata di configurazione, selezioniamo la VPC di default (o quella che volete) e la Subnet 0. Nella voce Auto-assign Public IP mettiamo Enable, perché questa macchina deve essere accessibile anche dall’esterno. Premiamo ora su Next diverse volte finché non arriviamo a Security groups.

Qui mettiamo le seguenti regole:

  • accesso via SSH
  • ping (All ICMP - IPv4).

PC1

Lanciamo una nuova istanza sempre Amazon Linux 2 AMI di tipo t2.micro.

Nella schermata di configurazione, selezioniamo la stessa VPC ma stavolta con la subnet 0. Nella voce Auto-assign Public IP mettiamo Disable, perché questa macchina non deve essere accessibile anche dall’esterno. Nel Security Group, mettiamo le stesse regole del PC0-bastion (SSH e ping), andiamo su Review and Launch e lanciamo la macchina.

Configurazione del routing

Il diagramma di rete che andremo ad usare è qualcosa di simile al seguente, preso dalla documentazione ufficiale.

Diagramma di rete NAT

Dobbiamo fare in modo che:

  • la tabella di routing della nostra sottorete pubblica, nel nostro caso subnet 0, abbia come rotta di default l’Internet Gateway
  • la tabella di routing della nostra sottorete privata, nel nostro caso subnet 1, abbia come rotta di default il NAT Gateway.

Per farlo, andiamo su AWS, nei servizi selezioniamo VPC-> Route Tables -> Route 0 (se non esiste, createla), nei dettagli in basso controllate che sia associata alla subnet 0, quindi andate sulla tab Routes e quindi Edit routes. Nella tabella ci devono essere due rotte: la local (lasciatela così) e 0.0.0.0/0 che deve puntare all’Internet Gateway (potete selezionarlo dal menù a tendina, comincia con igw; se non avete un Internet Gateway, createlo nella voce dedicata del menù a sinistra).

Ripetiamo la stessa operazione con la tabella Route 1, anche qui se non esiste createla. Lasciate la rotta local così com’é e aggiungete la rotta 0.0.0.0/0 con destinazione il NAT Gateway (qualcosa che comincia con nat).

Esecuzione del test

Andate su Servizi->EC2.

Per comodità, nella lista delle istanze rinominiamo le macchine come PC0-bastion e PC1.

Selezioniamo PC1 e dai dettagli in basso ci segniamo il suo indirizzo IPv4 privato, nel mio caso è 172.30.0.213.

Ora dobbiamo accedere a PC0-bastion che ci farà da ponte per PC1. Ma c’è un problema: per collegarci via ssh da PC0-bastion a PC1 dovremmo avere la nostra chiave su PC0-bastion, che per definizione è poco sicuro. Come facciamo a fare da ponte senza copiare la chiave?

Ci viene in aiuto una funzionalità di SSH che si chiama agent forwarding. Con questo metodo, possiamo collegarci ad una macchina e poi da lì ad un altra, usando la stessa chiave. Nota: questo metodo funziona solo se tutti i computer usano la stessa chiave.

Per abilitare l’agent forwarding, basta usare l’opzione -A. Dal vostro computer di casa, Navigate nella cartella che contiene la chiave e scrivete:

ssh -A -i "miachiave.pem" ec2-user@18.212.212.224

Se non dovesse funzionare, su mac, Linux o git-bash prima di questo comando aggiungete la chiave al vostro portachiavi con il comando:

ssh-add -K myPrivateKey.pem

Ora che sono sul bastian host, mi collego al PC1:

# sono dentro PC0-bastion
ssh ec2-user@172.30.0.213

ed automaticamente ssh usa le stesse credenziali con cui sono entrato in PC0-bastion.

Infine, da dentro PC1 pingo il server google:

ping www.google.com

Ci siamo, funziona!

Verifica del traffico sul NAT Gateway

Se tornate su VPC->NAT Gateway, potete vedere il traffico che passa attraverso il gateway.

Written with StackEdit.