Premesso che di ACL Cisco ne esistono una miriade, le tre tipologie più utilizzate sono le seguenti:
1) standard;
2) estese;
3) nominali.
Esse si differenziano per le funzionalità che offrono e per il tipo di filtraggio che possono mettere in atto.
Ad esempio, le ACL standard (il cui ID può essere compreso tra 1 e 99) consentono di filtrare il traffico relativo ad una determinata sorgente. Eccone un esempio:
access-list 1 permit 172.16.0.0 0.0.255.255
Le ACL estese (ID da 100 a 199), invece, consentono di specificare sorgente e destinazione del traffico, oltre al tipo di protocollo che deve essere filtrato. Ad esempio:
access-list 101 deny tcp 172.16.2.0 0.0.0.255 172.16.4.0 0.0.0.255 eq 21
access-list 101 permit ip 172.16.3.0 0.0.0.255 any
nega il traffico FTP (tcp eq 21) proveniente dalla net 172.16.2.0/24 e diretto alla net 172.16.4.0/24, permette tutto il traffico (ip) proveniente dalla net 172.16.3.0/24 e nega tutto il resto (il deny any any è implicito).
Infine, le ACL nominali offrono le stesse funzionalità delle ACL estese, ma anzichè essere caratterizzate da un ID, può essere assegnato loro un nome. Inoltre, se un'ACL nominale deve essere aggiornata, non è necessario rimuoverla completamente, ricrearla con le opportune modifiche e ricaricarla sul dispositivo Cisco, ma è sufficiente aggiungere la nuova regola in una posizione ben precisa. Ad esempio, date le seguenti regole associate all'ACL nominale chiamata inbound:
access-list inbound line 1 permit tcp any host 192.168.1.1 eq 4662
access-list inbound line 2 permit udp any host 192.168.1.1 eq 4666
se volessimo aggiungere una regola in posizione 2, basterebbe scrivere:
access-list inbound line 2 permit tcp any host 192.168.1.1 eq 6881
e dopo uno sh access-list inbound otterremo il seguente output:
access-list inbound line 1 permit tcp any host 192.168.1.1 eq 4662
access-list inbound line 2 permit tcp any host 192.168.1.1 eq 6881
access-list inbound line 3 permit udp any host 192.168.1.1 eq 4666
La posizione delle regole è molto importante nelle ACL, in quanto esse seguono una logica top-down e si arrestano al primo hit.
Se ad esempio definissimo un'ACL del tipo:
access-list inbound line 1 permit tcp any host 192.168.1.1 eq 4662
access-list inbound line 2 deny tcp any host 192.168.1.1 eq 4662
access-list inbound line 3 permit udp any host 192.168.1.1 eq 4666
il traffico tcp diretto alla porta 4662 dell'host 192.168.1.1 sarebbe consentito, e la entry immediatamente successiva verrebbe completamente ignorata.
Un'altra comodità delle ACL nominali è data dalla possibilità di cancellare solo una determinata regola. Ad esempio, mediante il comando:
no access-list inbound line 2 deny tcp any host 192.168.1.1 eq 4662
verrebbe rimossa solo la regola numero 2 e non l'intera ACL (come accadrebbe se utilizzassimo un'ACL standard o estesa).
Assegnazione dell'ACL ad un'interfaccia
Una volta creata l'ACL sarà necessario assegnarla ad un'interfaccia.
Il comando da utilizzare è il seguente:
Router(config-if)# ip access-group <ID o nome ACL> in
per filtrare il traffico in ingresso, oppure:
Router(config-if)# ip access-group <ID o nome ACL> out
per filtrare il traffico in uscita.
Esiste comunque una convenzione relativa al posizionamento delle ACL, ovvero:
1) le ACL standard devono essere posizionate il più vicino possibile alla destinazione del traffico;
2) le ACL estese devono essere posizionate il più vicino alla sorgente del traffico.
Visualizzazione delle ACL
Per avere l'intera lista delle ACL presenti sulla nostra macchina, basta digitare:
Router# sh access-list
mentre se volessimo listare le regole che costituiscono una determinata ACL, occorre lanciare il comando:
Router# sh access-list <ID o nome ACL>
Con questi comandi sarà anche possibile visualizzare il numero di pacchetti che hanno matchato l'ACL (ovvero il cosiddetto hit count, e non hitch count come ho sentito dire a qualche pseudo sistemista).
Eccone un esempio:
Router#sh access-list 101
Extended IP access list 101
10 deny ip host 255.255.255.255 any log
20 deny ip 10.0.0.0 0.255.255.255 any log (33 matches)
30 deny ip 172.16.0.0 0.15.255.255 any log
40 deny ip 192.168.0.0 0.0.255.255 any log (7298 matches)
50 deny ip 224.0.0.0 15.255.255.255 any log
Logging del traffico matchato dalle ACL
Abilitare il logging delle delle regole ACL matchate è banale. Basta infatti aggiungere il suffisso log alla regola stessa:
access-list 101 deny tcp 172.16.2.0 0.0.0.255 172.16.4.0 0.0.0.255 eq 21 log
Operazioni sulle ACL
Se si lavora con le ACL standard o estese è opportuno fare molta attenzione. La prima regola consiste nel disassociare l'ACL all'interfaccia, in modo da non rischiare di perdere la connettività verso il dispositivo Cisco (se stiamo interagendo con una sessione vty).
Il comando da utilizzare è il seguente:
Router(config-if)#no ip access-group <ID o nome ACL> in
In secondo luogo, conviene copiare tutto il contenuto dell'ACL ed incollarlo in un editor di testo, in modo da avere piena visione delle regole e poterle modificare con un basso margine di errore.
Logica di creazione delle ACL
Le ACL possono essere create seguendo due logiche:
1) negare esplicitamente il traffico vietato e consentire tutto il resto;
2) negare esplicitamente il traffico vietato, consentire quello lecito e negare tutto il resto.
Inutile dire che la seconda logica è molto più sicura ma implica un maggiore numero di regole. Di seguito un esempio di ACL che nega tutto il traffico non esplicitamente consentito:
access-list 101 deny ip host 255.255.255.255 any log
access-list 101 deny ip 10.0.0.0 0.255.255.255 any log
access-list 101 deny ip 172.16.0.0 0.15.255.255 any log
access-list 101 deny ip 192.168.0.0 0.0.255.255 any log
access-list 101 deny ip 224.0.0.0 15.255.255.255 any log
access-list 101 permit tcp any any eq 2283
access-list 101 permit tcp any any eq 443
access-list 101 permit tcp any any eq 3000
access-list 101 permit tcp any any eq 6881
access-list 101 permit tcp any any eq 6882
access-list 101 permit tcp any any eq 4662
access-list 101 permit udp any any eq 4666
access-list 101 permit udp any any eq 20
access-list 101 permit tcp any any eq ftp
access-list 101 permit tcp any any eq 123
access-list 101 permit tcp any any eq 5002
access-list 101 permit udp any any eq 5002
access-list 101 permit tcp any eq www any log
access-list 101 permit tcp any eq 443 any log
access-list 101 permit tcp any eq ftp any log
access-list 101 permit udp any eq 20 any log
access-list 101 permit tcp any eq 22 any log
access-list 101 permit tcp any eq 2283 any log
access-list 101 permit tcp any eq telnet any log
access-list 101 permit tcp any eq smtp any log
access-list 101 permit tcp any eq 465 any log
access-list 101 permit tcp any eq 995 any log
access-list 101 permit tcp any eq 993 any log
access-list 101 permit tcp any eq pop3 any log
access-list 101 permit tcp any eq domain any log
access-list 101 permit udp any eq domain any log
access-list 101 permit tcp any gt 1023 any log
access-list 101 permit icmp any any echo-reply log
Prima nego il traffico IP spoofing, successivamente consento il traffico da Internet verso alcuni servizi della LAN, consento anche alcuni tipi di traffico della LAN verso Internet e nego tutto il resto (come già detto, il deny any any è implicito).
CBAC ed ip inspect
Alcuni device di casa Cisco possiedono un firewall embedded che crea automaticamente delle ACL (CBAC) per consentire il traffico proveniente dalla LAN e diretto all'esterno (Internet), realizzando inoltre dei meccanismi di stateful inspection. Inutile dire che tale funzionalità è molto comoda, in quanto riduce notevolmente il numero di regole ACL da dichiarare (almeno per ciò che concerne il traffico rete interna -> Internet).
Il comando per abilitare il CBAC è ip inspect (come illustrato in questo post) e per farlo funzionare occorre associarlo all'interfaccia del router che si affaccia alla rete interna (ed esempio e0), in modo da controllare il traffico in uscita:
Router(config-if)# ip inspect <nome dell'insieme delle regole di firewalling> out
Fine del post, alla prossima.