Access Control Lists

Descrizione e configurazione delle ACL

CCNA

3/10/2023

Un'ACL identifica il traffico in base alle caratteristiche del pacchetto come l'indirizzo IP sorgente, quello di destinazione e il numero della porta.
Il router o switch poi compie un'azione in base al risultato dell'ACL.
Le ACL sono supportate sia dai router sia dagli switch.
L'uso originale delle ACL era per sicurezza:all'inizio venivano usate per decidere se il traffico potesse passare attraverso il router.
Di default un router permette a tutto il traffico di passare attraverso le sue interfacce, ma quando vengono impostate delle ACL il router prima identifica il traffico e poi lo lascia passare (o meno) a seconda delle regole nell'ACL.
Le ACL vengono anche usate in altre politiche di software quando il traffico deve essere identificato, per esempio:

  • Identificare il traffico per dare un servizio migliore in una politica QoS (Quality of Service)

  • Identificare il traffico per tradurlo in un IP differente in una politica NAT (Network Address Translation)


Le ACL sono costituite di Access Control Entries (ACE) che sono una serie di regole che permettono o meno qualcosa.
Ogni ACE è scritta in una riga separata.
Vediamone un esempio:

R2(config)#access-list 100 deny tcp 10.10.30.0 0.0.0.255 gt 49151 10.10.20.1 0.0.0.0 eq 23

Dove:

  • 100: Identifica se l'ACL è Standard o Estesa

  • deny: Qui viene specificata l'ACE

  • tcp: Indica il protocollo a cui verrà applicata l'ACE

  • 10.10.30.0: Indirizzo IP sorgente

  • 0.0.0.255: Wildcard della sorgente

  • gt: Un qualifier, che può essere less than (lt), equal (e), greater than (gt)

  • 49151: Numero della porta sorgente

  • 10.10.20.1: Indirizzo IP di destinazione

  • 0.0.0.0: Wildcard di destinazione

  • eq: Qualifier

  • 23: Numero della porta di destinazione

Implementazione Originale: ACL Standard ed Estese

Le ACL standard controllano solo l'indirizzo sorgente, mentre le ACL Estese controllano il protocollo, l'indirizzo sorgente, l'indirizzo di destinazione e il numero della porta.
Range delle ACL Standard: 1 - 99, 1300 - 1999.
Range delle ACL Estese: 100 - 199, 2000 - 2699.
Esempio ACL Standard:

R1(config)#access-list 1 deny 10.10.10.10 0.0.0.0
R1(config)#access-list 1 permit 10.10.10.0 0.0.0.255

Ricorda: viene utilizzata la maschera di wildcard.
Nell'ACL che abbiamo configurato la prima riga impedisce a tutto il traffico proveniente dall'host 10.10.10.10 di passare, mentre la seconda permette il passaggio di tutto il traffico proveniente dalla sottorete 10.10.10.0.
La wildcard mask per un'ACL Standard di default è pari a 0.0.0.0, quindi un singolo indirizzo host, mentre per le ACL Estese NON c'è nessuna wildcard di default.
Attenzione: non dimenticare di inserire la wildcard quando si specifica una sottorete intera (10.10.10.0).

Esempio ACL Estesa:

R1(config)#access-list 100 deny tcp 10.10.10.10 0.0.0.0 gt 49151 10.10.50.10 0.0.0.0 eq 23
R1(config)#access-list 100 permite tcp 10.10.10.0 0.0.255 gt 49151 10.10.50.10 0.0.0.0 eq telnet

Ci si può riferire alle ACL tramite il numero o il nome.
Le ACL a cui viene dato un nome vanno configurate modificando il comando "R1(config)#access-list ?" in "R1(config)#ip access-list".
Vediamo come configurare un'ACL con nome:

R1(config)#ip access-list standard Hayden-Demo
R1(config-std-nacl)#deny 10.10.10.10 0.0.0.0
R1(config-std-nacl)#permit 10.10.10.0 0.0.0.255

Se si vuole che l'ACE venga applicata al traffico di un'applicazione tra l'indirizzo sorgente e di destinazione, bisogna usare TCP o UDP.
Esempio:
R1(config)#access-list 100 deny tcp 10.10.10.0 0.0.0.255 10.10.50.0 0.0.0.255 eq 80

Se si vuole che l'ACE venga applicata a tutto il traffico da l'indirizzo sorgente e di destinazione bisogna usare IP.
Esempio:
R1(config)#access-list 100 deny ip 10.10.10.0 0.0.0.255 10.10.50.0 0.0.0.255 eq 80

Le wildcard di default permettono di risparmiare tempo perché non si ha bisogno di specificarle.
Vediamo un esempio di due regole che sono uguali:

R1(config)#access-list 100 permit tcp 10.10.10.10 0.0.0.0
R1(config)#access-list 100 permit tcp host 10.10.10.10


La prima ACE ha una wildcard mask di 0.0.0.0 che corrisponde ad una subnet mask di 255.255.255.255, quindi significa che stiamo controllando il traffico da un host particolare, ma invece di dover scrivere 10.10.10.10 possiamo semplicemente aggiungere il parametro "host" prima dell'IP.

Vediamo un altro esempio:

R1(config)#access-list 100 permit tcp 0.0.0.0 255.255.255.255
R1(config)#access-list 100 permit tcp any

Nella prima riga permettiamo al traffico proveniente da ogni sottorete a causa della wildcard di 255.255.255.255 che corrisponde ad una subnet mask di 0.0.0.0, ma possiamo sostituire l'IP e la wildcard con il parametro "any".

Non è obbligatorio inserire il numero della porta, di default sono tutte le porte.
Dopo aver inserito l'indirizzo di destinazione, le flag TCP e gli indirizzi si possono inserire ulteriori opzioni, consultabili con il comando:
R1(config)#access-list 100 permit tcp host 10.10.10.10 10.10.20.0 0.0.0.255 ?

Vediamo ora un esempio di un'ACE completa:

R1(config)#access-list 100 deny tcp host 10.10.10.10 10.10.20.0 0.0.0.255 eq www log

Il parametro "log" non è richiesto per contare il numero di volte di accesso, viene usato per accedere alla console o ad un server di monitoraggio esterno.

Gruppi d'Accesso

Le ACL vengono applicate al livello interfaccia con il comando "access-group" e possono essere applicate al traffico inviato o ricevuto.
Si possono avere al massimo un'ACL per direzione su di un'interfaccia, quindi si possono avere un'ACL per il traffico inviato e un'altra per il traffico in arrivo, ma non si possono avere due ACL per il traffico solo in entrata o solo in uscita.
Un'interfaccia può, quindi, non avere ACL oppure può averla solo per il traffico in arrivo oppure solo per quello in uscita oppure ancora ACL in entrambe le direzioni.
Vediamo un esempio di configurazione:

R1(config)#interface GigabitEthernet0/1
R1(config-if)#ip access-group 100 out
R1(config-if)#ip access-group 101 in

Per verificare la configurazione dei gruppi di accesso si può usare il comando seguente:

R1#show ip interface f1/0 | include access list

Le ACL vengono lette dal router procedendo dall'alto verso il basso: l'ordine delle regole è molto importante perché appena una regola combacia con un pacchetto, viene applicata l'azione di permesso (o meno) e l'ACL non viene più processata.
La seguente ACL nega l'host 10.10.10.10 ma permette il resto della sottorete 10.10.10.0/24
R1(config)#access-list 1 deny host 10.10.10.10
R1(config)#access-list 1 permit 10.10.10.0 0.0.0.255

La seguente ACL permette, invece TUTTO il traffico dalla sottorete 10.10.10.0/24 incluso l'host 10.10.10.10 perché una volta che il router ha applicato la prima riga smette di processare l'ACL:
R1(config)#access-list 1 permit 10.10.10.0 0.0.0.255
R1(config)#access-list 1 deny host 10.10.10.10

Le ACE vengono numerate automaticamente con incrementi di 10, per poterle vedere è possibile inserire il comando "show access-lists 110".
E' possibile anche iniettare delle ACE in delle ACL esistenti:

R1(config)#ip access-list extended 110
R1(config-ext-nacl)#15 deny tcp host 10.10.10.11 host 10.10.50.10 eq telnet

Alla fine dell'ACL c'è una regola implicita detta "deny any any", la quale significa che se non c'è nessuna ACL per un'interfaccia allora tutto il traffico è permesso, mentre se viene applicata un'ACL allora tutto il traffico è negato tranne quello permesso esplicitamente.
Esempio:
R1(config)#access-list 1 permit 10.10.10.0 0.0.0.255
Questa ACL permette solo il traffico proveniente dalla sottorete 10.10.10.0/24, mentre tutto il resto verrà bloccato.


Molte organizzazioni includono una regola explicita per loggare tutto il traffico illegale:
R1(config)#access-list 1 permit 10.10.10.0 0.0.0.255
R1(config)#access-list 1 deny any log

Se viene applicata un'ACL, tutto il traffico è bloccato tranne quello che è permesso esplicitamente.
Se si vuole ottenere il contrario, ossia tutto il traffico permesso tranne quello negato esplicitamente, si deve aggiungere una riga particolare alla fine dell'ACL:
R1(config)#access-list 1 deny 10.10.10.0 0.0.0.255
R1(config)#access-list 1 permit any
In questo caso tutto il traffico da 10.10.10.0/24 non può passare, tutto il resto è permesso.

Le ACL applicate ad un'interfaccia non vengono applicate anche al traffico che viene originato dal router stesso.

Configurazione:
R1(config)#access-list 100 deny tcp any any eq 23
R1(config)#interface f1/0
R1(config)#ip access-group 100 out

Considerando l'immagine e la configurazione sovrastanti possiamo vedere che gli host nella sottorete 10.1.1.0/24 non possono usare Telnet per connettersi ad R2, mentre un admin può usarlo per connettersi ad R2 dalla CLI di R1.