Una delle applicazioni principali di un firewall è quella di esporre un servizio all’esterno in (maggiore) sicurezza, limitando comunque l’accesso da internet al server che il servizio sta fornendo.
In parole povere, se desidero pubblicare un server web, voglio che soltanto la porta 80 sia accessibile, mentre tutto il resto delle porte debbono essere filtrate. A questo scopo si usano due delle colonne portanti delle configurazioni (di base) dei firewall: il NAT statico ed il filtraggio mediante Access List.
Il NAT (Network Access Translation) statico mi consente di rendere visibile “all’esterno” su un determinato indirizzo IP, un server che si trova su una subnet protetta dal firewall, con un indirizzo diverso. Il firewall si frappone tra “rete esterna” e subnet interna di residenza del server, mascherandone il reale indirizzo IP.
Il filtraggio mediante access list è la più semplice e basilare forma di filtraggio del traffico di rete che un firewall può eseguire: in sostanza filtriamo in base ad indirizzo di provenienza, ed indirizzo e porta di destinazione il traffico. Una access list prende la forma di una lista ordinata di regole che vengono applicate ad una determinata interfaccia ed un determinato verso del traffico di rete (spesso indicato come ingress, in ingresso al firewall, ed egress, in uscita dal firewall).
Supponiamo di avere applicato all’interfaccia outside del firewall, in ingresso, l’insieme di regole che segue:
Azione | Origine | Destinazione | Protocollo | Porta |
permit | 10.10.10.100/32 | 192.168.100.100/32 | tcp | 80 |
deny | 10.10.20.0/24 | 192.168.100.100/32 | tcp | 80 |
permit | 10.10.0.0./16 | 192.168.100.100 | tcp | 80 |
deny | any | any | ip |
Ogni pacchetto in ingresso viene valutato, e se origine e destinazione soddisfano le condizioni poste da una riga, viene applicata l’azione corrispondente, altrimenti si passa alla valutazione della riga successiva. La tabella in esempio consente a tutti i pacchetti tcp inviati dall’indirizzo ip 10.10.10.100 a 192.168.100.100 verso la porta 80 di raggiungere il server, ma non a quelli diretti, ad esempio, alla porta 53.
Tutto il traffico dalla rete 10.10.20.0 verso il server viene bloccato, ma il traffico da qualunque altra rete 10.10.0.0/16 verso la porta 80 del server è consentito. L’ultima regola è di norma sottintesa, e dà istruzione di bloccare qualunque altro tipo di traffico. Conviene scriverla, per avere un’indicazione degli hit count (vale a dire di quante volte viene utilizzata).
Un esempio pratico.
Supponiamo di avere una configurazione come quella in figura. Il nostro obiettivo è quello di rendere visibile sulla rete esterna, all’indirizzo 192.168.100.100 i servizi di un server web.
Come anticipato, non vogliano che tutti servizi (per meglio dire tutte le porte) del server siano accessibili, per cui il server viene posto alle spalle di un firewall (in questo caso il 5505 che viene fornito dall’emulatore Cisco Packet Tracer).
Nella configurazione del firewall, assegnamo innanzi tutto gli indirizzi al’interfaccia outside(192.168.100.1) e inside(192.168.1.1).
interface Ethernet0/0 switchport access vlan 2 interface Ethernet0/1 ... interface Vlan1 nameif inside security-level 100 ip address 192.168.1.1 255.255.255.0 interface Vlan2 nameif outside security-level 0 ip address 192.168.100.1 255.255.255.0
Il server è connesso all’interfaccia interna, all’indirizzo 192.168.1.100.
Come detto, desideriamo che questo server sia visibile dall’esterno, non con il suo indirizzo reale, ma piuttosto con un indirizzo che viene virtualmente assegnato all’interfaccia esterna del firewall; useremo l’indirizzo IP 192.168.100.100. Per ottenere questo risultato usiamo un NAT statico, vale a dire configuriamo il firewall in modo tale che, quando arriva sull’interfaccia esterna un pacchetto destinato all’indirizzo IP 192.168.100.100, il firewall lo accetti e lo inoltri all’interfaccia interna con l’indirizzo 192.168.1.100 (quello del server).
A questo scopo eefiniamo un NETWORK OBJECT (vale a dire un contenitore che può contenere un indirizzo, un servizio, etc.) di nome WebServer, cui associamo un indirizzo ed un nat statico.
La configurazione è semplicissima:
ciscoasa(config)#object network WebServer ciscoasa(config-network-object)#host 192.168.1.100 ciscoasa(config-network-object)#nat (inside,outside) static 192.168.100.100
Il risultato di questa operazione si può vedere, ad esempio, con il comando show xlate, che ci mostra tutti i NAT presenti nel firewall; di seguito il risultato, che è piuttosto espressivo:
ciscoasa#sh xlate
1 in use, 1 most used Flags: D – DNS, e – extended, I – identity, i – dynamic, r – portmap, s – static, T – twice, N – net-to-net NAT from inside:192.168.1.100/32 to outside:192.168.100.100/32 flags s idle 00:55:54, timeout 0:00:00
In questo modo abbiamo dato istruzione al firewall di associare un indirizzo IP virtuale all’interfaccia esterna.
Per verificare che le cose stiano proprio così possiamo dare dal PC esterno il comando arp-a. Vediamo che ai due indirizzi IP (del firewall e quello nattato del server) corrisponde lo stesso mac address.
PC>arp -a
Internet Address Physical Address Type
192.168.100.1 00d0.bc34.4630 dynamic
192.168.100.100 00d0.bc34.4630 dynamic
Se cerchiamo di raggiungere dall’esterno il server web, scopriamo che non è ancora accessibile. Infatti il firewall di default scarta tutte le connessioni che iniziano da una rete meno sicura e cercano di raggiungere una rete più sicura (quella interna). Dobbiamo dare istruzioni al firewall affinché accetti connesioni sulla porta 80 per l’indirizzo su cui abbiamo esposto il server.
A questo scopo creiamo una access-list che applichiamo all’interfaccia outside. La access list è semplicissima e dà semplicemente l’indicazione: consenti la connessione da qualunque indirizo IP all’host 192.168.100.100 sulla porta 80 (www).
access-list outside_access_in extended permit tcp any host 192.168.100.100 eq www
Il comando successivo applica l’access-list all’interfaccia esterna in ingresso (in):
access-group outside_access_in in interface outside
Il risultato finale è quello che vediamo dal browser di PC0:
Buon divertimento.