Come accennato in precedenza, così come configurato il mio castello di carte non stà in piedi: Mancando il supporto VLAN allo switch e mischiando tutte le reti sullo stesso mezzo fisico, sarebbe estremamente semplice configurare un pc con un IP statico appartenente alla rete 192.168.200.0/24 e agganciarsi alla rete wireless OPEN, ottenendo così l'accesso alla rete "privata".
Per il corretto funzionamento delle reti così come le ho previste, ho dovuto quindi apportare qualche modifica al firewall del mio serverino.
Il server è configurato per operare come router quindi per smistare pacchetti da una rete all'altra: Non può sapere quali reti per me sono interne o esterne o quali voglio far comunicare e quali isolare quindi è necessario definire queste indicazioni nello script che gestisce il firewall.
Avendo aggiunto diverse interfacce di rete “inside” ho preferito apportare alcune modifiche alla sezione “Local Settings” iniziale dove vengono definite le reti che diventa da così:
codice:
# Internet Interface
INET_IFACE="eth0"
INET_ADDRESS="192.168.50.150"
# Local Interface Information
LOCAL_IFACE="eth1"
LOCAL_IP="192.168.100.150"
LOCAL_NET="192.168.100.0/24"
LOCAL_BCAST="192.168.100.255"
[...]
a così:
codice:
# Internet Interface
INET_IFACE="eth0"
INET_ADDRESS="192.168.50.2"
# Local Interface Information
LOCAL_IP="192.168.200.1"
WIRED_IFACE="eth1"
WLAN_IFACE="eth1.150"
WLAN_OSPITI_IFACE="eth1.100"
WIRED_NET="192.168.200.0/24"
WLAN_NET="192.168.150.0/24"
WLAN_OSPITI_NET="192.168.100.0/24"
WIRED_BCAST="192.168.200.255"
WLAN_BCAST="192.168.150.255"
WLAN_OSPITI_BCAST="192.168.100.255"
INSIDE_NET="$WIRED_NET $WLAN_NET $WLAN_OSPITI_NET"
INSIDE_IFACE="eth1 eth1.150 eth1.100"
INSIDE_BCAST="$WIRED_BCAST $WLAN_BCAST $WLAN_OSPITI_BCAST"
# Trusted Networks and source IP
TRUSTED_IFACE="$WIRED_IFACE $WLAN_IFACE"
TRUSTED_NET="$WIRED_NET $WLAN_NET"
TRUSTED_BCAST="$WIRED_BCAST $WLAN_BCAST"
# Untrusted Networks and source IP
DMZ_IFACE="$WLAN_OSPITI_IFACE"
DMZ_NET="$WLAN_OSPITI_NET"
DMZ_BCAST="$WLAN_OSPITI_BCAST"
[…]
In pratica non ho fatto altro che sostituire la sezione “Local Interface Information” con tre sezioni, ognuna dedicata alla propria interfaccia (WIRED, WLAN e WLAN_OSPITI). Non ho specificato l'IP della singola rete perchè non ne ho bisogno e ho lasciato come unica variabile “local” proprio l'IP della dell'interfaccia di rete cablata.
Ho poi definito delle variabili composite, che comprendano diverse reti: Questo mi permette con un'unica riga nel firewall di impostare la stessa regola per più valori. Dato che tutto lo script è ormai di poco meno di 900 righe compresi commenti, stringerlo un pò non è male.
Nelle reti “INSIDE” ho messo tutto quello che non è l'interfaccia eth0 ed internet, nelle reti “trusted” ho messo solo la rete cablata e la wireless privata mentre come rete “Untrusted” ho riportato la rete wireless “Open”.
Come prima cosa, ho aggiunto una sezione che si occupa di isolare la rete wireless OPEN da tutte le altre: Permetto il traffico DHCP da e verso il server ed i client presenti in questa rete ma non permetto ai client altre comunicazioni con il server (INPUT).
Il router deve poter effettuare il forward del pacchetti dalla rete untrusted verso internet ($INET_IFACE) ma deve impedire il passaggio da e verso tutte le altre reti (DROP).
codice:
###############################################################################
# Set up DMZ isolation
# Permetto alle reti "UNTRUSTED" di accedere solo ad internet e non al server stesso od alle altre reti.
# La prima riga permette solo il funzionamento del servizio DHCP, gestito dal server:
for X in $DMZ_IFACE; do $IPT -A INPUT -p UDP -i $X --source-port 68 --destination-port 67 -j ACCEPT; done;
for X in $DMZ_IFACE; do $IPT -A INPUT -p ALL -i $X -j DROP; done;
for X in $DMZ_IFACE; do $IPT -A FORWARD -p ALL -i $X -o $INET_IFACE -j ACCEPT; done;
for X in $DMZ_IFACE; do $IPT -A FORWARD -p ALL -i $X -j DROP; done;
Ho utilizzato dei cicli di "for" per ripetere l'applicazione della regola per tutti i valori inseriti nella variabile "$DMZ_IFACE", definita nella parte iniziale dello script. Nel mio caso ho solo la rete WLAN_OSPITI ma la regola dovrebbe funzionare bene anche se la variabile contenesse più valori.
Apporto poi una importante modifica alla chain denominata “bad_packets”: Definisco come “bad” tutti i pacchetti che provengono da una rete diversa da quella che ho proposto in fase di configurazione. In questo modo, eventuali pc con IP statici assegnati alla reti “trusted” che dovessero collegarsi alla wireless OPEN non potrebbero comunque andare in giro per le altre reti perchè, avendo definito delle VLAN, i pacchetti arriverebbero da un'associazione rete/interfaccia non corrispondente a quelle che ho autorizzato. Questa da rendere con un ciclo è già molto più difficile, quindi ho preferito esplicitare le singole reti:
codice:
# bad_packets chain
#
# Drop packets received on the external interface
# claiming a source of the local network
$IPT -A bad_packets -p ALL -i $INET_IFACE -s $LOCAL_NET -j LOG --log-prefix "Illegal source: "
for X in $INSIDE_NET; do $IPT -A bad_packets -p ALL -i $INET_IFACE -s $X -j DROP; done;
# Questa e' una aggiunta alla precedente: Si accerta che i pacchetti che si
# con un determinato IP provengano solo dall'interfaccia cui ho assegnato quella configurazione.
$IPT -A bad_packets -p ALL -i $WIRED_IFACE ! -s $WIRED_NET -j DROP
$IPT -A bad_packets -p ALL -i $WLAN_IFACE ! -s $WLAN_NET -j DROP
$IPT -A bad_packets -p ALL -i $WLAN_OSPITI_IFACE ! -s $WLAN_OSPITI_NET -j DROP
Anche questa è molto più difficile da rendere con un ciclo, perchè finirebbe per incrociare i valori delle rete trusted tra loro, quindi preferisco esplicitarle. Sono due regole per ogni rete.
codice:
INPUT chain:
# Rules for the private network (accessing gateway system itself)
$IPT -A INPUT -p ALL -i $WIRED_IFACE -s $WIRED_NET -j ACCEPT
$IPT -A INPUT -p ALL -i $WIRED_IFACE -d $WIRED_BCAST -j ACCEPT
$IPT -A INPUT -p ALL -i $WLAN_IFACE -s $WLAN_NET -j ACCEPT
$IPT -A INPUT -p ALL -i $WLAN_IFACE -d $WLAN_BCAST -j ACCEPT
E questa è necessaria per permettere il funzionamento delle connessioni che richiedono una risposta da parte del client:
codice:
# Inbound Internet Packet Rules
# Accept Established Connections
$IPT -A INPUT -p ALL -i $INET_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
for X in $DMZ_IFACE; do $IPT -A INPUT -p ALL -i $X -m state --state ESTABLISHED,RELATED -j ACCEPT; done;
codice:
###############################################################################
#
# FORWARD Chain
#
echo "Process FORWARD chain ..."
# Used if forwarding for a private network
# Drop bad packets
$IPT -A FORWARD -p ALL -j bad_packets
# Accept TCP packets we want to forward from internal sources
#$IPT -A FORWARD -p tcp -i $LOCAL_IFACE -j tcp_outbound
for X in $INSIDE_IFACE; do $IPT -A FORWARD -p tcp -i $X -j tcp_outbound; done;
# Accept UDP packets we want to forward from internal sources
#$IPT -A FORWARD -p udp -i $LOCAL_IFACE -j udp_outbound
for X in $INSIDE_IFACE; do $IPT -A FORWARD -p udp -i $X -j udp_outbound; done;
# If not blocked, accept any other packets from the internal interface
#$IPT -A FORWARD -p ALL -i $LOCAL_IFACE -j ACCEPT
for X in $INSIDE_IFACE; do $IPT -A FORWARD -p ALL -i $X -j ACCEPT; done;
# Deal with responses from the internet
$IPT -A FORWARD -i $INET_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
for X in $DMZ_IFACE; do $IPT -A FORWARD -p ALL -i $X -m state --state ESTABLISHED,RELATED -j ACCEPT; done;
Queste sopra riportate sono le uniche modifiche strettamente necessarie. Volendo si possono applicare anche le seguenti:
codice:
# sshd
for X in $TRUSTED_NET; do $IPT -A tcp_inbound -p TCP -s $X --destination-port 22 -j ACCEPT; done;
# User specified allowed TCP protocol
# Webmin
for X in $TRUSTED_NET; do $IPT -A tcp_inbound -p TCP -s $X --destination-port 15000 -j ACCEPT; done;