Firewalling per VPN
La configurazione di una VPN spesso si scontra con regole di firewalling errate che determinano problemi e perdite di tempo.
Alcuni principi fondamentali, validi per ogni VPN Linux in rete pubblica:
- I peer della VPN, sia in una configurazione lan to lan che roadwarrior devono avere un IP pubblico ed avere la porta usata per negoziare il tunnel accessibile (intervenire su catena di INPUT di iptables)
- Le interfaccie virtuali che vengono create per ogni connessione sono soggette ad Iptables. per cui va permesso nei termini che si desiderano per permettere ai client collegati di accedere ad host delle reti interne (intervendire su catena di FORWARD di iptables).
Esempio di iptables
Vediamo un esempio semplice, basato sulla policy che tutto il traffico in uscita è permesso mentre quello in entrata viene filtrato e i client collegati in VPN (siano essi roadwarrior o host di una LAN remota) accedono senza limiti alla LAN locale.
Le regole che seguono si applicano ad un VPN server, che fa da gateway (con natting) di una rete interna (10.0.0.0/24) con interfaccia esterna su IP pubblico (eth1), interfaccia interna su LAN (eth0) e interfacce dedicate al tunnel (ppp0, ipsec0, tun1 a seconda dei protocolli usati)
1- Policy di default (tutto bloccato)
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
2- Regole standard per loopback, traffico correlato e in uscita
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 10.0.0.0/255.255.255.0 -i eth0 -j ACCEPT
4- Regole per permettere l'accesso, la negoziazione e lo scambio dei dati del tunnel, queste si applicano agli IP pubblici dei peer e variano a seconda del protocollo.
Esempio per Ipsec (aperto a tutti):
iptables -A INPUT -p udp --dport 500 -j ACCEPT
iptables -A INPUT -p ah -j ACCEPT
iptables -A INPUT -p esp -j ACCEPT
Esempio per PPTP (aperto solo all'indirizzo IP 213.215.144.242)
iptables -A INPUT -p tcp --dport 1723 -s 213.215.144.242 -j ACCEPT
iptables -A INPUT -p gre -s 213.215.144.242 -j ACCEPT
Esempio per OpenVPN (aperto a tutti):
iptables -A INPUT -p udp --dport 1194 -j ACCEPT
4- Regole per permettere il traffico dagli host collegati al tunnel alla rete interna
iptables -A FORWARD -i ppp0 -j ACCEPT
iptables -A FORWARD -i ppp1 -j ACCEPT
iptables -A FORWARD -i ppp2 -j ACCEPT
Notare che, se si lavora a livello di interfaccia, va specificata una interfaccia per ogni tunnel aperto contemporaneamente, altrimenti, ma meno raccomandabile, si può specificare l'IP sorgente.
Le regole sopra si applicano a VPN PPTP, con Ipsec vanno usate interfacce tipo ipsec0, ipsec1, ipsec2..., con OpenVPN o altri software basati sui driver TUN/TAP i nomi sono tun0, tun1 ecc.
5- Logging di tutti i pacchetti prima che vengano droppati per policy di default (questa regola deve essere alla fine, nel nostro caso)
iptables -A INPUT -m pkttype --pkt-type unicast -j LOG --log-prefix "[INPUT DROP] "
iptables -A FORWARD -m pkttype --pkt-type ! broadcast -j LOG --log-prefix "[FORWARD DROP] "
iptables -A OUTPUT -m pkttype --pkt-type ! broadcast -j LOG --log-prefix "[OUTPUT DROP] "