Sui router Cisco, l’implementazione delle tecnologie di firewalling, almeno per una configurazione base, si ottiene tramite le Access Control Lists (ACL), funzionalità che permette un filtraggio del traffico basato principalmente sull’indirizzamento IP e sulle porte TCP e UDP. Ad esempio, un’ACL può permettere agli utenti con uno specifico indirizzo di rete di scaricare files da Internet tramite una connessione FTP, bloccando altri tipi di connessioni dalla stessa rete e bloccando inoltre qualsiasi altro traffico da indirizzi IP sorgenti diversi da quelli specificati.
Le ACL sono definite come insiemi di una o più regole, ognuna delle quali consente o nega il traffico in base ai parametri indicati. Il traffico è confrontato in sequenza con ciascuna istruzione, dall’alto verso il basso, fino a quando viene trovata una corrispondenza o fino a quando non ci sono più istruzioni. Non appena un pacchetto in transito soddisfa una regola, le istruzioni successive vengono scartate. L'ultima istruzione di una ACL è sempre una negazione implicita “deny ip any any” che nega qualsiasi tipo di traffico; si tratta di una regola inserita automaticamente alla fine di ogni ACL, anche se non visibile. Per questo motivo è fondamentale che in una ACL sia presente almeno un “permit”, diversamente l’unico risultato sarebbe la negazione di qualsiasi traffico per ogni direzione.
Le ACL non filtrano il traffico finché non vengono applicate ad un’interfaccia; bisogna poi specificare la direzione, che può essere in uscita o in ingresso sull’interfaccia. Il traffico in ingresso si riferisce al traffico che arriva sul router, prima dell’accesso alla tabella di routing. Il traffico in uscita si riferisce al traffico già entrato nel router e sottoposto ad elaborazione per l’inoltro; prima dell’inoltro verso un’interfaccia, viene esaminata l’ACL in uscita.
Si distinguono due gruppi fondamentali di ACL:
- ACL standard, individuano il traffico a livello 3, in base al solo IP sorgente. A quell’IP sarà pertanto concesso o negato l’accesso a qualsiasi servizio.
- ACL estese, individuano il traffico sino al livello 4, in base ai protocolli TCP o UDP e ai numeri di porta sorgente e di destinazione.
Sia le standard che le estese possono essere:
- Numbered (numeriche), con identificativo basato sui numeri da 1 a 99 e da 1300 a 1999 per le standard ACL, da 100 a 199 e da 2000 a 2699 per le ACL di tipo esteso.
- Named (con nome), identificate da un nome scelto dall’amministratore.
Su un router si può definire un' ACL per ogni protocollo routed di livello 3 (ad esempio IP, IPX, Appletalk), per ogni interfaccia logica (ogni interfaccia “subif” può avere la propria ACL), per ogni direzione (IN o OUT). Ad esempio, se prendiamo l’interfaccia Ethernet 0/0 di un router che instrada solo il protocollo IP, possiamo avere per quest’interfaccia al massimo 2 ACL, una in ingresso ed una in uscita.
Un altro aspetto molto importante è il posizionamento delle ACL:
- Posizionamento di ACL estese – Devono essere posizionate il più vicino possibile alla sorgente da filtrare. Posizionarle lontane dalla sorgente sarebbe inefficiente, poichè i pacchetti attraverserebbero troppe zone prima di essere bloccati o filtrati.
- Posizionamento di ACL standard - Devono essere posizionate il più vicino possibile alla destinazione. Infatti, poichè le ACL standard filtrano i pacchetti solo in base all’indirizzo sorgente, il posizionamento nei pressi dell’interfaccia sorgente potrebbe bloccare del traffico ritenuto valido. Ad esempio, se si volesse bloccare l’accesso ad un server da una determinata rete con un deny indirizzi_rete, se la negazione fosse vicina alla rete sorgente, verrebbero bloccate anche altre destinazioni ritenute valide o addiritura negato tutto il traffico in uscita.
I comandi
Configurazione di ACL standard numeriche
Sintassi:
Router(config)#access-list numero_ACL deny|permit ip_sorgente maschera_wildcard
Esempio: consentire l'accesso alla rete 172.16.2.144/29
access-list 1 permit 172.16.2.144 0.0.0.7
Configurazione di ACL estese numeriche
Sintassi:
Router(config)#access-list numero-ACL [deny|permit] protocollo ip-sorgente wildcard ip-destinazione wildcard condizione applicazione
Esempio: bloccare il traffico telnet dalla subnet 172.16.2.0/24 verso qualsiasi host
access-list 101 deny tcp 172.16.2.0 0.0.0.255 any eq telnet
Configurazione di ACL standard con nome
Si noti che, a differenza delle ACL numeriche, il comando access-list è preceduto dal comando IP.
Sintassi:
Router(config)#ip access-list standard nome_ACL
Router(config-std-nacl)# [deny|permit] ip-sorgente
Esempio:
ip access-list standard permit-ip
permit 172.16.2.144 0.0.0.7
Configurazione di ACL estese con nome
Di nuovo, si evidenzia che a differenza delle ACL numeriche, il comando access-list è preceduto dal comando IP.
Sintassi:
Router(config)#ip access-list extended nome-ACL
Router(config-ext-nacl)# deny|permit protocollo ip_sorgente wildcard_mask ip_destinazione wildcard_mask condizione applicazione
Esempio:
ip access-list extended blocco-telnet
access-list 101 deny tcp 172.16.2.0 0.0.0.255 any eq telnet
Uso dei parametri “host” e “any”
Quando si crea una ACL, i parametri host e any sono utilizzabili al posto delle wildcard:
access-list 9 deny 192.168.15.99 0.0.0.0 <=> access-list 9 deny host 192.168.15.99
access-list 9 permit 0.0.0.0 255.255.255.255 <=> access-list 9 permit any
Assegnare un' ACL a un’interfaccia
Il valore ACL può essere un numero nel caso di ACL numbered o un nome nel caso di ACL named.
Sintassi:
Router(config-if)#ip access-group ACL in|out
Esempio 1: assegnare l’ACL TESTACL sull’interfaccia Fa0/0 filtrando il traffico in ingresso.
interface fa 0/0
ip access-group TESTACL i
Esempio 2: assegnare l’ACL 5 sull’interfaccia Serial 0/0 filtrando il traffico in uscita.
interface serial 0/0
ip access-group 5 out
Assegnare un' ACL sulle VTY, Virtual Terminal Lines
Sintassi:
Router(config-line)#access-class ACL in|out
Commentare un' ACL
Sintassi per ACL numeriche:
Router(config)#access-list 101 remark commento
Sintassi per ACL con nome:
Router(config)#ip access-list extended nome_ACL
Router(config-std-nacl)#remark commento
Rimuovere un' ACL da un’interfaccia
Sintassi:
Router(config-if)#no ip access-group ACL
Modifica di un' ACL
Uno dei vantaggi di utilizzare le ACL con nome è costituito dal fatto che l’amministratore può eliminare una riga specifica entrando nella modalità di configurazione dell’ACL stessa (ACL subconfiguration mode), utilizzano il parametro “no”.
Cancellare un' ACL
Nelle ACL numeriche non è possibile eliminare singole linee: è necessario pertanto eliminare l’intera ACL.
Sintassi:
Router(config)#no access-list lista
Verifiche e troubleshooting
Abilitare i log sulle ACL
Il log si abilita utilizzando il parametro log alla fine della sintassi di una ACL:
R1(config)# access-list 101 permit tcp 192.168.1.0 0.0.0.255 192.168.2.0 0.0.0.255 eq 22 log
In questo modo, appena un pacchetto soddisfa una condizione presente nell’ACL, l’informazione viene registrata (sul buffer del router o su un syslog server, se configurato). Bisogna tener presente che la generazione di log impegna in modo consistente gli apparati. Vengono salvate diverse informazioni, quali:
- Action - permit or deny
- Protocol - TCP, UDP, or ICMP
- Indirizzo sorgente e di destinazione
- Porta sorgente e di destinazione, TCP e UDP
- Tipi di messaggi ICMP
Visualizzare il contenuto di una ACL
Sintassi:
Router#show access-list ACL
Visualizzare quante e quali ACL sono presenti nel router
Sintassi:
Router#show ip access-lists
Visualizzare il posizionamento e la direzione delle ACL
Il comando seguente permette di verificare su quali interfacce e in che direzione sono state applicate le ACL. Ad esempio, nell’output sottostante possiamo notare che l’interfaccia Fa0/1.1 ha l’ACL 150 applicata in uscita e nessuna ACL in ingresso.
Sintassi:
Router#show ip interface
Visualizzare le ACL applicate ad un’interfaccia specifica
Il comando restituisce le stesse informazioni del comando precedente, questa volta circoscritte all’interfaccia selezionata.
Sintassi:
Router#show ip interface interfaccia
Esempio: visualizzare le eventuali ACL presenti sulla seriale 0/0
show ip interface serial 0/0
Esempi pratici
Impedire che gli hosts della subnet 172.16.4.0 possano raggiungere la subnet 172.16.3.0 tramite l’interfaccia Fa0/0. Poichè esiste una negazione implicita alla fine di ogni ACL, è fondamentale che nella ACL sia presente almeno un “permit”, diversamente l’unico risultato sarebbe la negazione di qualsiasi traffico per ogni direzione.
access-list 1 deny 172.16.4.0 0.0.0.255
access-list 1 permit any
interface FastEthernet 0/0
ip access-group 1 out
Negare il traffico FTP dalla subnet 172.16.4.0/24 alla subnet 172.16.3.0/24. Tutto il resto è permesso. Ricordiamo che la porta TCP 21 è utilizzata per i comandi FTP, la porta TCP 20 per il trasferimento dati.
access-list 101 deny tcp 172.16.4.0 0.0.0.255 172.16.3.0 0.0.0.255 eq 21
access-list 101 deny tcp 172.16.4.0 0.0.0.255 172.16.3.0 0.0.0.255 eq 20
access-list 101 permit ip any any
interface fastethernet 0/1
ip access-group 101 in