Impostare un firewall con uno script iptables: differenze tra le versioni

Vai alla navigazione Vai alla ricerca
(Creata pagina con '== Introduzione == Questa guida non vuole essere il solito howto dove si spiega che in <code>iptables</code> ci sono le catene, le policy di default, quali sono e come funzionano...')
 
 
(46 versioni intermedie di 4 utenti non mostrate)
Riga 1: Riga 1:
{{Versioni compatibili}}
== Introduzione ==
== Introduzione ==
Questa guida non vuole essere il solito howto dove si spiega che in <code>iptables</code> ci sono le catene, le policy di default, quali sono e come funzionano, ma vuole essere una versione più pratica di un howto e spiegare come configurare un firewall per linux con le seguenti caratteristiche:
Questa guida non vuole essere il solito howto dove si spiega che in <code>iptables</code> ci sono le catene, le policy di default, quali sono e come funzionano, ma vuole essere un promemoria per ricordare velocemente come configurare un firewall per linux con le seguenti caratteristiche:
# policy di default: drop di tutti i pacchetti
# policy di default: drop di tutti i pacchetti
# permettere solo ai servizi che ci interessano di essere accessibili dall’esterno
# permettere solo ai servizi che ci interessano di essere accessibili dall’esterno
# permettere a certi servizi di essere accessibili solo dalla LAN
# permettere a certi servizi di essere accessibili solo dalla LAN


== Descrizione delle regole ==
== Lo script ==
Creiamo quindi un nuovo file:
<pre>
# nano /etc/iptables-firewall.sh
</pre>
e diamogli questo contenuto, che sarà analizzato nel paragrafo successivo:
<pre>
#!/bin/sh
 
###########################
# Imposto alcune variabili
###########################
 
# Il path di iptables
IPT="/sbin/iptables"
 
# Interfaccia di rete esterna
IFACE=bond0
 
 
########################
# Un messaggio di avvio
########################
 
echo -n " Loading iptables rules..."
 
 
#####################################
# Pulisco la configurazione corrente
#####################################
 
# Cancellazione delle regole presenti nelle chains
$IPT -F
$IPT -F -t nat
 
# Eliminazione delle chains non standard vuote
$IPT -X
 
# Inizializzazione dei contatori (utile per il debugging)
$IPT -Z
 
 
###################################################
# Blocco tutto il traffico tranne quello in uscita.
# NOTA: per ragioni di sicurezza sarebbe opportuno
# bloccare anche il traffico in uscita e stabilire
# poi delle regole selettive
###################################################
 
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT
 
 
##############################
# Abilito il traffico locale
##############################
 
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
 
 
#####################################################
# Imposto alcune regole per i pacchetti ICMP di ping
#####################################################
 
$IPT -A INPUT -p icmp --icmp-type echo-reply -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type echo-request -m limit --limit 5/s -m state --state NEW -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type destination-unreachable -m state --state NEW -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type time-exceeded -m state --state NEW -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type timestamp-request -m state --state NEW -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type timestamp-reply -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
$IPT -A OUTPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
 
 
###############################################
# Mi difendo dallo spoofing
###############################################
 
$IPT -A INPUT -s 10.0.0.0/8 -j DROP
$IPT -A INPUT -s 169.254.0.0/16 -j DROP
$IPT -A INPUT -s 172.16.0.0/12 -j DROP
$IPT -A INPUT -s 127.0.0.0/8 -j DROP
$IPT -A INPUT -s 192.168.0.0/24 -j DROP
$IPT -A INPUT -s 192.168.1.0/24 -j DROP
$IPT -A INPUT -s 192.168.10.0/24 -j DROP
$IPT -A INPUT -s 224.0.0.0/4 -j DROP
$IPT -A INPUT -d 224.0.0.0/4 -j DROP
$IPT -A INPUT -s 240.0.0.0/5 -j DROP
$IPT -A INPUT -d 240.0.0.0/5 -j DROP
$IPT -A INPUT -s 0.0.0.0/8 -j DROP
$IPT -A INPUT -d 0.0.0.0/8 -j DROP
$IPT -A INPUT -d 239.255.255.0/24 -j DROP
$IPT -A INPUT -d 255.255.255.255 -j DROP
 
 
########################################
# Mi proteggo da attacchi SMURF
########################################
 
$IPT -A INPUT -p icmp -m icmp --icmp-type address-mask-request -j DROP
$IPT -A INPUT -p icmp -m icmp --icmp-type timestamp-request -j DROP
$IPT -A INPUT -p icmp -m icmp -m limit --limit 1/second -j ACCEPT
$IPT -A INPUT -p tcp -m tcp --tcp-flags RST RST -m limit --limit 2/second --limit-burst 2 -j ACCEPT
 
 
#####################################
# Elimino pacchetti non validi
#####################################
 
$IPT -A INPUT -m state --state INVALID -j DROP
$IPT -A FORWARD -m state --state INVALID -j DROP
$IPT -A OUTPUT -m state --state INVALID -j DROP
 
 
##############################################
# Impedisco i port scan e loggo i tentativi
# Gli IP sono bloccati per 24 ore
##############################################
 
$IPT -A INPUT -m recent --name portscan --rcheck --seconds 86400 -j DROP
$IPT -A FORWARD -m recent --name portscan --rcheck --seconds 86400 -j DROP
$IPT -A INPUT -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "portscan:"
$IPT -A INPUT -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP
 
 
###############################################
# Blocco le nuove connessioni senza SYN e
# mi proteggo dagli attacchi Denial of Service
###############################################
 
$IPT -N syn-flood
$IPT -A INPUT -i $IFACE -p tcp --syn -j syn-flood
$IPT -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN
$IPT -A syn-flood -j DROP
$IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
 
 
#########################################################
# Consento il traffico delle connessioni gia' stabilite
#########################################################
 
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 
 
#########################################################
# Regole sulle porte. Da modificare secondo le esigenze
# Per ogni regola nel commento viene indicato:
# 1) il numero della porta
# 2) il nome del servizio
# 3) il protocollo
# 4) il livello di accesso
#    - pubblico = accesso permesso a tutti
#    - LAN = accesso permesso solo ai client della LAN
#########################################################
 
# 21 - ProFTPD - FTP - pubblico
$IPT -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT
# Abilito le porte dinamiche. Configurare correttamente la
# direttiva PassivePorts in /etc/proftpd/proftpd.conf
$IPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 60000:65000 -j ACCEPT
 
# 25 - Postfix - SMTP - pubblico
$IPT -A INPUT -p tcp --dport 25 -m state --state NEW -j ACCEPT
 
# 80/443 - Apache - HTTP - pubblico
$IPT -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
$IPT -A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT
 
# 110 - Dovecot - POP3 - pubblico
$IPT -A INPUT -p tcp --dport 110 -m state --state NEW -j ACCEPT
 
# 111 - Ulogd - Syslog Server - LAN
$IPT -A INPUT -p tcp --dport 111 -m state --state NEW -s 192.168.90.0/24 -j ACCEPT
$IPT -A INPUT -p tcp --dport 111 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
$IPT -A INPUT -p udp --dport 111 -m state --state NEW -s 192.168.90.0/24 -j ACCEPT
$IPT -A INPUT -p udp --dport 111 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
 
# 143 - Dovecot - IMAP - pubblico
$IPT -A INPUT -p tcp --dport 143 -m state --state NEW -j ACCEPT
 
# 667 - Darkstat - Statistiche - LAN
$IPT -A INPUT -p tcp --dport 667 -m state --state NEW -s 192.168.90.0/24 -j ACCEPT
$IPT -A INPUT -p tcp --dport 667 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
 
# 993 - Dovecot - IMAPs - pubblico
$IPT -A INPUT -p tcp --dport 993 -m state --state NEW -j ACCEPT
 
# 995 - Dovecot - POP3s - pubblico
$IPT -A INPUT -p tcp --dport 995 -m state --state NEW -j ACCEPT
 
# 1050/1051 - Zabbix - Monitor - LAN
$IPT -A INPUT -p tcp --dport 1050 -m state --state NEW -s 192.168.90.0/24 -j ACCEPT
$IPT -A INPUT -p tcp --dport 1050 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
$IPT -A INPUT -p tcp --dport 1051 -m state --state NEW -s 192.168.90.0/24 -j ACCEPT
$IPT -A INPUT -p tcp --dport 1051 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
 
# 1194 - OpenVPN - pubblico
$IPT -A INPUT -p tcp --dport 1194 -m state --state NEW -j ACCEPT
echo 1 > /proc/sys/net/ipv4/ip_forward
 
# 2000 - Sieve - Spam filter - localhost
# Non ha bisogno di configurazione
 
# 2293 - OpenSSH - SSH - pubblico
$IPT -A INPUT -p tcp --dport 2293 -m state --state NEW -j ACCEPT
 
# 2605 - BitMeter - Monitor - LAN
$IPT -A INPUT -p tcp --dport 2605 -m state --state NEW -s 192.168.90.0/24 -j ACCEPT
$IPT -A INPUT -p tcp --dport 2605 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
 
# 2812 - Monit - Monitor - LAN
$IPT -A INPUT -p tcp --dport 2812 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
 
# 3000 - ntop - Monitor - LAN
$IPT -A INPUT -p tcp --dport 3000 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
 
# 3306 - MySQL - localhost
# Non ha bisogno di configurazione
 
# 10000  Webmin - Monitor - LAN
$IPT -A INPUT -p tcp --dport 10000 -m state --state NEW -s 192.168.90.0/24 -j ACCEPT
$IPT -A INPUT -p tcp --dport 10000 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
 
# 10024/10025 - Amavis - localhost
# Non ha bisogno di configurazione
 
# 8980 - OpenNMS - Server Monitor - LAN
$IPT -A INPUT -p tcp --dport 8980 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
$IPT -A INPUT -p udp --dport 8980 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
 
# 9000 - 9200 - 9300 - 8514 - GrayLOG - LOG Monitor - LAN
$IPT -A INPUT -p tcp --dport 9000 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
$IPT -A INPUT -p tcp --dport 9200 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
$IPT -A INPUT -p tcp --dport 9300 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
$IPT -A INPUT -p tcp --dport 8514 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
$IPT -A INPUT -p udp --dport 9000 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
$IPT -A INPUT -p udp --dport 9200 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
$IPT -A INPUT -p udp --dport 9300 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
$IPT -A INPUT -p udp --dport 8514 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
 
# 5353 mDNS - LAN
$IPT -A INPUT -p udp -m udp --dport 5353 --sport 5353 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
 
# 67-68 DHCP - LAN
$IPT -A INPUT -p udp -m udp --dport 67 --sport 68 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
 
# 4200 - Shell in a Box - LAN
$IPT -A INPUT -p tcp --dport 4200 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
$IPT -A INPUT -p udp --dport 4200 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
 
# 173 - 138 - 139 - 445 - 389 - 901 - Samba - LAN
$IPT -A INPUT -p tcp --dport 137 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
$IPT -A INPUT -p udp --dport 137 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
$IPT -A INPUT -p tcp --dport 138 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
$IPT -A INPUT -p udp --dport 138 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
$IPT -A INPUT -p tcp --dport 139 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
$IPT -A INPUT -p udp --dport 139 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
$IPT -A INPUT -p tcp --dport 445 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
$IPT -A INPUT -p udp --dport 445 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
$IPT -A INPUT -p tcp --dport 389 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
$IPT -A INPUT -p udp --dport 389 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
$IPT -A INPUT -p tcp --dport 901 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
$IPT -A INPUT -p udp --dport 901 -m state --state NEW -s 10.0.0.0/24 -j ACCEPT
 
 
###############################################################
# Regole di sicurezza
# Block fragments and Xmas tree as well as SYN,FIN and SYN,RST
###############################################################
 
$IPT -A INPUT -p ip -f -j DROP
$IPT -A INPUT -p tcp --tcp-flags ALL ACK,RST,SYN,FIN -j DROP
$IPT -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
$IPT -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
 
 
###############################
# Concludo lo script firewall
###############################
 
# echo -n "Iptables successfully configured."
 
</pre>
 
== Descrizione delle regole precedenti ==
Dopo aver dichiarato alcune variabili passiamo alla pulizia delle chains e alla reinizializzazione dei contatori:
Dopo aver dichiarato alcune variabili passiamo alla pulizia delle chains e alla reinizializzazione dei contatori:
<pre>
<pre>
Riga 22: Riga 309:
Infine, è possibile utilizzare altri due target speciali, RETURN e QUEUE, che però non approfondiremo.
Infine, è possibile utilizzare altri due target speciali, RETURN e QUEUE, che però non approfondiremo.
<br/>
<br/>
Siamo finalmente giunti alle regole vere e proprie. Cominciamo accettando esplicitamente tutto il traffico, in uscita ed in entrata, sull'interfaccia di loopback. Si tratta di una scelta consigliata e assolutamente sicura, poichè il loopback non rappresenta un collegamento alla rete, ma viene utilizzato da alcune applicazioni per il loro correttto funazionamento:
Siamo finalmente giunti alle regole vere e proprie. Cominciamo accettando esplicitamente tutto il traffico, in uscita ed in entrata, sull'interfaccia di loopback. Si tratta di una scelta consigliata e assolutamente sicura, poiché il loopback non rappresenta un collegamento alla rete, ma viene utilizzato da alcune applicazioni per il loro corretto funzionamento:
<pre>
<pre>
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
Riga 52: Riga 339:
</pre>
</pre>


== Lo script ==
== Avviare il firewall ==
Creiamo quindi un nuovo file:
Arrivati a questo punto non ci resta che proteggere il file e renderlo eseguibile:
<pre>
# chmod 700 /etc/iptables-firewall.sh
# chown root:root /etc/iptables-firewall.sh
</pre>
Per avviare lo script direttamente al boot del nostro server sarà sufficiente modificare il file di configurazione delle impostazioni di rete:
<pre>
# nano /etc/network/interfaces
</pre>
aggiungendo una riga <code>pre-up</code> alla configurazione dell'interfaccia di rete pubblica:
<pre>
auto eth1
iface eth1 inet static
            address 192.168.0.111
            netmask 255.255.255.0
            gateway 192.168.0.1
            dns-search somedomain.org
            dns-nameservers 195.238.2.21 195.238.2.22
            broadcast 192.168.0.0
            pre-up /etc/iptables-firewall.sh
</pre>
 
== Impostare il ban di IP ostili ==
Per impostare il blocco di un IP è sempre possibile agire manualmente, in questo modo:
<pre>
# iptables -I INPUT -s 192.168.1.100 -j DROP
</pre>
ma l'amministrazione e la gestione manuale dei ban agli indirizzi IP ostili non è praticabile.
<br/>
A questo scopo ci può venire in aiuto uno strumento disponibile nei repository ufficiali di Debian:
<pre>
# apt-get install ipset
</pre>
Una volta installato, occorre creare la lista, che chiameremo ''blacklist'':
<pre>
# ipset create blacklist hash:net maxelem 1000000
</pre>
Con il comando:
<pre>
# ipset list
</pre>
possiamo vedere l'elenco delle liste già create.
<br/>
A questo punto è possibile aggiungere a mano il primo IP da bannare:
<pre>
# ipset add blacklist 1.1.2.0/24
# ipset add blacklist 1.1.3.0/24
</pre>
Controlliamo se i due IP sono stati aggiunti alla lista di ban:
<pre>
# ipset list
Name: blacklist
Type: hash:net
Revision: 6
Header: family inet hashsize 1024 maxelem 1000000
Size in memory: 472
References: 0
Number of entries: 2
Members:
1.1.3.0/24
1.1.2.0/24
</pre>
Aggiungere a mano tutti gli IP da bannare è un'impresa titanica; meglio affidarsi a liste già costruite, come quelle utilizzate qui di seguito, disponibili sotto licenza GPL.
<br/>
Per prima cosa installiamo un tool per convertire le liste di iBlockList nel formato accettato da Ipset.
<pre>
# apt-get install python-pip curl
</pre>
Quindi recuperiamo uno script che ci permetterà di mantenere aggiornata la nostra lista di IP ostili:
<pre>
# wget -O /usr/local/sbin/update-blacklist.sh https://raw.githubusercontent.com/trick77/ipset-blacklist/master/update-blacklist.sh
# chmod +x /usr/local/sbin/update-blacklist.sh
# mkdir -p /etc/ipset-blacklist
# wget -O /etc/ipset-blacklist/ipset-blacklist.conf https://raw.githubusercontent.com/trick77/ipset-blacklist/master/ipset-blacklist.conf
</pre>
Quindi salviamo l'attuale configurazione di ipset:
<pre>
# ipset save > /etc/ipset-blacklist/ip-blacklist.restore
</pre>
Modifichiamo il file di configurazione adattandolo alle nostre necessità:
<pre>
# nano /etc/ipset-blacklist/ipset-blacklist.conf
</pre>
Impostiamo un cronjob che ogni domenica a mezzanotte aggiornerà le nostre liste:
<pre>
crontab -e
0 0 * * 7 /usr/local/sbin/update-blacklist.sh /etc/ipset-blacklist/ipset-blacklist.conf
</pre>
Aggiungiamo la nuova regola al nostro script iptables:
<pre>
<pre>
# nano /etc/iptables-firewall.sh
# nano /etc/iptables-firewall.sh
# Imposto le regole ipset
iptables -I INPUT -m set --match-set blacklist src -j DROP
iptables -I FORWARD -m set --match-set blacklist src -j DROP
</pre>
e facciamo in modo che ipset sia impostato correttamente dopo un riavvio, aggiungendo la direttiva:
<pre>
pre-up  ipset restore -! < /etc/ipset-blacklist/ip-blacklist.restore
</pre>
</pre>
e diamogli questo contenuto, mettendo in pratica quanto visto nel paragrafo precedente:
alla sezione della scheda di rete principale nel file <tt>/etc/network/interfaces</tt>, stando attenti a inserirla '''''prima''''' della direttiva <tt>pre up</tt> impostata in precedenza per l'avvio dello script di iptables.
 
<br/>
<br/>
 
== Sitografia ==
http://www.sitepoint.com/secure-server-iptables/
<br/>
http://news.dediserve.com/2009/09/23/configuring-iptables-on-your-vps/
<br/>
http://www.temporini.net/configurare-un-firewall-con-iptables
<br/>
http://www.commedia.it/ccontavalli/docs-it/iptables/iptables4dummies/
<br/><br/>
 
{{Autori
|Autore = [[Utente:Ferdybassi|Ferdybassi]] 16:02, 17 apr 2011 (CEST)
}}
 
[[Categoria:Firewall]]
[[Categoria:Monitoraggio]]

Menu di navigazione