La prima regola per avere un firewall sicuro Γ¨ droppare tutto il traffico tranne quello che non soddisfa le chain impostate, non il contrario. Le prime righe di una tabella iptables quindi devono essere le seguenti
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPTche droppano tutte i pacchetti in ingresso e invece non filtrano i pacchetti in uscita.
Se vogliamo inoltre che il sever faccia da NAT devo permettere lβinoltro di pacchetti con la seguente riga
iptables -P FORWARD ACCEPTAltrimenti scrivo:
iptables -P FORWARD DROPSpesso voglio creare un firewall stateful, quindi che accetta tutti i pacchetti relativi ad una connessione giΓ in essere. Inoltre aggiungo una secoda riga che droppa tutti i pacchetti βinvalidiβ. Per fare questo scrivo:
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m conntrack --ctstate INVALID -j DROPInfine permetto i pacchetti che arrivano da lo (loopback) che possono essere utilizzati da applicazioni e serivizi interni al server
iptables -A INPUT -i lo -j ACCEPTEsempi
Caricamento di script iptables
Spesso puΓ² risultare comodo non avere tutti gli script di iptables nello stesso file monolitico, ma dividere in piΓΉ file che effettuano logiche distinte.
Posso creare una cartella (chiamata per esempio iptables.d) in cui inserire regole aggiuntive, e caricarle nello script principale (/etc/iptables) con il seguente codice:
for f in /etc/iptables.d/*
do
if [[ -x "$f" ]]
then
$f
fi
doneSSH con protezione brute force
Esigenza: voglio potermi connettere dallβesterno ad un determinato indirizzo IP in ssh nella maniera piΓΉ sicura possibile.
Per prima cosa Γ¨ necessario evitare di utilizzare la porta 22 in quanto Γ¨ la classica porta che viene testata per eventuali attacchi. Quindi effettuo un forward dei pacchetti indirizzati verso una porta scelta casualmente (es. 7253) verso la porta 22 di un indirizzo IP interno.
iptables -t nat -A PREROUTING -d 94.138.169.150 -p tcp --dport 7253 -j DNAT --to-destination 192.168.1.191:22Ora aggiungo un ulteriore livello di protezione permettendo solo 4 nuove connessioni al minuto:
iptables -t filter -A FORWARD -d 192.168.1.191 -p tcp -m tcp --dport 22 -m state --state NEW -m limit --limit 4/min --limit-burst 4 -j ACCEPTperΓ² devo indicare che tutti i pacchetti che sono riferiti a connessioni giΓ stabilite possono essere accettati
iptables -t filter -A FORWARD -d 192.168.1.191 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPTTutti i pacchetti invece che non rientrano nelle precedenti due chain devono invece essere droppati:
iptables -t filter -A FORWARD -d 192.168.1.191 -p tcp -m tcp --dport 22 -j DROPInfine devo rimappare i pacchetti in uscita dal mio indirizzo IP interno con lβindirizzo IP pubblico, altrimenti il ricevitore li droppa sicuramente in quanto non coerenti con lβindirizzo di destinazione.
iptables -t nat -A POSTROUTING -s 192.168.1.191 -p tcp --sport 22 -j SNAT --to-source 94.138.169.150