Introduzione

Iptables è il firewall software incluso nella maggior parte delle distribuzioni Linux per impostazione predefinita. Questa guida fornisce un rapido riferimento ai comandi iptables che creeranno le regole del firewall utili in scenari comuni di tutti i giorni. Ciò include esempi di iptables per consentire e bloccare vari servizi per porta, interfaccia di rete e indirizzo IP di origine.

Tieni presente che l'ordine delle tue regole è importante. Tutti questi comandi iptables utilizzano l'opzione -A per aggiungere la nuova regola alla fine di una catena. Se vuoi metterlo da qualche altra parte nella catena, puoi usare l'opzione -I che ti consente di specificare la posizione della nuova regola (o semplicemente posizionarla all'inizio della catena non specificando un numero di regola).

Nota: quando si lavora con i firewall, fare attenzione a non bloccarsi dal proprio server bloccando il traffico SSH (porta 22, per impostazione predefinita). Se si perde l'accesso a causa delle impostazioni del firewall, potrebbe essere necessario connettersi ad esso tramite la console del server fornita dal proprio provider per correggere l'accesso. Una volta connesso tramite la console, è possibile modificare le regole del firewall per consentire l'accesso SSH (o consentire tutto il traffico). Se le regole del firewall salvate consentono l'accesso SSH, un altro metodo è riavviare il server.

Ricorda che puoi controllare il tuo attuale set di regole iptables con il comando sudo iptables -S e sudo iptables -L.

Salvare le regole

Le regole di Iptables sono temporanee inizialmente, il che significa che devono essere salvate manualmente affinché possano persistere dopo un riavvio.

Ubuntu

Su Ubuntu, il modo più semplice per salvare le regole di iptables, in modo che sopravvivano al riavvio, è usare il pacchetto iptables-persistent. Installalo con apt-get in questo modo:

sudo apt-get update
sudo apt-get install iptables-persistent

Durante l'installazione, ti verrà chiesto se desideri salvare le tue attuali regole del firewall.

Se aggiorni le regole del firewall e desideri salvare le modifiche, esegui questo comando:

sudo netfilter-persistent save

Nelle versioni di Ubuntu precedenti alla 16.04, eseguire invece questo comando:

sudo invoke-rc.d iptables-persistent save

CentOS 8 e precedenti

Su CentOS 6 e precedenti — (CentOS 7 e successive utilizzano FirewallD per impostazione predefinita) — è possibile utilizzare lo script init iptables per salvare le regole di iptables:

sudo service iptables save

Ciò salverà le tue attuali regole iptables nel file /etc/sysconfig/iptables.

Regole generalmente utili

Questa sezione include una varietà di comandi iptables che creeranno regole che sono generalmente utili sulla maggior parte dei server.

Consenti connessioni loopback

L' interfaccia di loopback , indicata anche come lo, è ciò che un computer utilizza per inoltrare le connessioni di rete a se stesso. Ad esempio, se si esegue ping localhost o ping 127.0.0.1, il server eseguirà il ping stesso utilizzando il loopback. L'interfaccia di loopback viene utilizzata anche se si configura il server delle applicazioni per connettersi a un server di database con un indirizzo "localhost". Pertanto, vorrai essere sicuro che il tuo firewall consenta queste connessioni.

Per accettare tutto il traffico sull'interfaccia di loopback, eseguire questi comandi:

sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT

Consentire connessioni in entrata stabilite e correlate

Poiché il traffico di rete deve generalmente essere bidirezionale (in entrata e in uscita) per funzionare correttamente, è tipico creare una regola firewall che consenta il traffico in entrata stabilito (established) e correlato (related), in modo che il server consenta il traffico di ritorno alle connessioni in uscita avviate dal server si. Questo comando consentirà che:

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Consentire connessioni in uscita stabilite

Potresti voler consentire il traffico in uscita di tutte le connessioni stabilite, che sono in genere la risposta a connessioni in entrata legittime. Questo comando consentirà che:

sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT

Da interno a esterno

Supponendo che eth0 sia la tua rete esterna, ed eth1 è la tua rete interna, ciò consentirà al tuo interno di accedere a quello esterno:

sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

Rilasciare (DROP) pacchetti non validi

Alcuni pacchetti di traffico di rete vengono contrassegnati come non validi (invalid). A volte può essere utile registrare questo tipo di pacchetto, ma spesso va bene lasciarli cadere. Fallo con questo comando:

sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

Bloccare un indirizzo IP

Per bloccare le connessioni di rete che hanno origine da un indirizzo IP specifico, ad esempio 15.15.15.51, eseguire questo comando:

sudo iptables -A INPUT -s 15.15.15.51 -j DROP

In questo esempio, -s 15.15.15.51 specifica un indirizzo IP di origine di "15.15.15.51". L'indirizzo IP di origine può essere specificato in qualsiasi regola del firewall, tra cui una permettono (allow) regola.

Se invece vuoi rifiutare (reject) la connessione, che risponderà alla richiesta di connessione con un errore di "connection refused", sostituisci "DROP" con "REJECT" in questo modo:

sudo iptables -A INPUT -s 15.15.15.51 -j REJECT

Bloccare connessioni a un'interfaccia di rete

Per bloccare le connessioni da un indirizzo IP specifico, ad es 15.15.15.51, a una specifica interfaccia di rete, ad es eth0. Utilizzare questo comando:

sudo iptables -A INPUT -i eth0 -s 15.15.15.51 -j DROP

Questo è lo stesso dell'esempio precedente, con l'aggiunta di -i eth0. L'interfaccia di rete può essere specificata in qualsiasi regola del firewall ed è un ottimo modo per limitare la regola a una particolare rete.

Servizio: SSH

Se stai utilizzando un server cloud, probabilmente vorrai consentire le connessioni SSH in entrata (porta 22) in modo da poterti connettere e gestire il tuo server. Questa sezione illustra come configurare il firewall con varie regole relative a SSH.

Consentire SSH in entrata

Per consentire tutte le connessioni SSH in arrivo, eseguire questi comandi:

sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Il secondo comando, che consente il traffico in uscita delle connessioni SSH stabilite, è necessario solo se la politica OUTPUT non è impostata su ACCEPT.

Consentire SSH in entrata da indirizzo IP specifico o sottorete

Per consentire le connessioni SSH in arrivo da un indirizzo IP o sottorete specifico, specificare l'origine. Ad esempio, se si desidera consentire l'intera sottorete 15.15.15.0/24, eseguire questi comandi:

sudo iptables -A INPUT -p tcp -s 15.15.15.0/24 --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Il secondo comando, che consente il traffico in uscita delle connessioni SSH stabilite, è necessario solo se la politica OUTPUT non è impostata su ACCEPT.

Consentire SSH in uscita

Se il criterio OUTPUT del firewall non è impostato su ACCEPT e si desidera consentire connessioni SSH in uscita, ovvero il server che avvia una connessione SSH a un altro server, è possibile eseguire questi comandi:

sudo iptables -A OUTPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A INPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Consentire Rsync in entrata da un indirizzo IP o sottorete specifici

Rsync, che funziona sulla porta 873, può essere utilizzato per trasferire file da un computer a un altro.

Per consentire le connessioni rsync in entrata da un indirizzo IP o sottorete specifico, specificare l'indirizzo IP di origine e la porta di destinazione. Ad esempio, se si desidera consentire all'intera sottorete 15.15.15.0/24 di poter eseguire la risincronizzazione con il server, eseguire questi comandi:

sudo iptables -A INPUT -p tcp -s 15.15.15.0/24 --dport 873 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 873 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Il secondo comando, che consente il traffico in uscita delle connessioni rsync stabilite, è necessario solo se la politica OUTPUT non è impostata su ACCEPT.

Servizio: Web Server

I server Web, come Apache e Nginx, in genere ascoltano le richieste sulla porta 80 e 443 per le connessioni HTTP e HTTPS, rispettivamente. Se la tua politica predefinita per il traffico in entrata è impostata su drop o deny, ti consigliamo di creare regole che consentano al tuo server di rispondere a tali richieste.

Consentire HTTP in entrata

Per consentire tutte le connessioni HTTP in entrata (porta 80), eseguire questi comandi:

sudo iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Il secondo comando, che consente il traffico in uscita delle connessioni HTTP stabilite, è necessario solo se il criterio OUTPUT non è impostato su ACCEPT.

Consentire HTTPS in entrata

Per consentire tutte le connessioni HTTPS (porta 443) in arrivo, eseguire questi comandi:

sudo iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 443 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Il secondo comando, che consente il traffico in uscita delle connessioni HTTP stabilite, è necessario solo se il criterio OUTPUT non è impostato su ACCEPT.

Consentire HTTP e HTTPS in entrata

Se si desidera consentire il traffico HTTP e HTTPS, è possibile utilizzare il modulo multiport (multiporta) per creare una regola che consenta entrambe le porte. Per consentire tutte le connessioni HTTP e HTTPS (porta 443) in arrivo, eseguire questi comandi:

sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Il secondo comando, che consente il traffico in uscita delle connessioni HTTP e HTTPS stabilite, è necessario solo se il criterio OUTPUT non è impostato su ACCEPT.

Servizio: MySQL

MySQL è in ascolto delle connessioni client sulla porta 3306. Se il tuo server di database MySQL viene utilizzato da un client su un server remoto, devi essere sicuro di consentire quel traffico.

Consentire MySQL da un indirizzo IP o sottorete specifico

Per consentire connessioni MySQL in entrata da un indirizzo IP o sottorete specifico, specificare l'origine. Ad esempio, se si desidera consentire l'intera sottorete 15.15.15.0/24, eseguire questi comandi:

sudo iptables -A INPUT -p tcp -s 15.15.15.0/24 --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Il secondo comando, che consente il traffico in uscita delle connessioni MySQL stabilite, è necessario solo se la politica OUTPUT non è impostata su ACCEPT.

Consentire MySQL a un'interfaccia di rete specifica

Per consentire connessioni MySQL a una specifica interfaccia di rete eth1, ad esempio se si dispone di un'interfaccia di rete privata, utilizzare questi comandi:

sudo iptables -A INPUT -i eth1 -p tcp --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -o eth1 -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Il secondo comando, che consente il traffico in uscita delle connessioni MySQL stabilite, è necessario solo se la politica OUTPUT non è impostata su ACCEPT.

Servizio: PostgreSQL

PostgreSQL è in ascolto delle connessioni client sulla porta 5432. Se il tuo server di database PostgreSQL viene utilizzato da un client su un server remoto, devi essere sicuro di consentire quel traffico.

PostgreSQL da indirizzo IP specifico o sottorete

Per consentire le connessioni PostgreSQL in entrata da un indirizzo IP o sottorete specifico, specificare l'origine. Ad esempio, se si desidera consentire l'intera sottorete 15.15.15.0/24, eseguire questi comandi:

sudo iptables -A INPUT -p tcp -s 15.15.15.0/24 --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Il secondo comando, che consente il traffico in uscita delle connessioni PostgreSQL stabilite, è necessario solo se la politica OUTPUT non è impostata su ACCEPT.

Consentire PostgreSQL a un'interfaccia di rete specifica

Per consentire connessioni PostgreSQL a una specifica interfaccia di rete eth1, ad esempio se si dispone di un'interfaccia di rete privata , utilizzare questi comandi:

sudo iptables -A INPUT -i eth1 -p tcp --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -o eth1 -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Il secondo comando, che consente il traffico in uscita delle connessioni PostgreSQL stabilite, è necessario solo se la politica OUTPUT non è impostata su ACCEPT.

Servizio: posta

I server di posta, come Sendmail e Postfix, ascoltano su una varietà di porte a seconda dei protocolli utilizzati per la consegna della posta. Se si esegue un server di posta, determinare quali protocolli si stanno utilizzando e consentire i tipi di traffico appropriati. Ti mostreremo anche come creare una regola per bloccare la posta SMTP in uscita.

Bloccare posta SMTP in uscita

Se il tuo server non dovrebbe inviare posta in uscita, potresti voler bloccare quel tipo di traffico. Per bloccare la posta SMTP in uscita, che utilizza la porta 25, eseguire questo comando:

sudo iptables -A OUTPUT -p tcp --dport 25 -j REJECT

Questo configura iptables per rifiutare tutto il traffico in uscita sulla porta 25. Se devi rifiutare un servizio diverso dal suo numero di porta, anziché dalla porta 25, semplicemente sostituiscilo.

Consentire tutti gli SMTP in entrata

Per consentire al server di rispondere alle connessioni SMTP, porta 25, eseguire questi comandi:

sudo iptables -A INPUT -p tcp --dport 25 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 25 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Il secondo comando, che consente il traffico in uscita delle connessioni SMTP stabilite, è necessario solo se il criterio OUTPUT non è impostato su ACCEPT.

Nota: è comune per i server SMTP utilizzare la porta 587 per la posta in uscita.

Consentire tutto l'IMAP in entrata

Per consentire al server di rispondere alle connessioni IMAP, porta 143, eseguire questi comandi:

sudo iptables -A INPUT -p tcp --dport 143 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 143 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Il secondo comando, che consente il traffico in uscita delle connessioni IMAP stabilite, è necessario solo se il criterio OUTPUT non è impostato su ACCEPT.

Consentire tutti gli IMAP in arrivo

Per consentire al server di rispondere alle connessioni IMAPS, porta 993, eseguire questi comandi:

sudo iptables -A INPUT -p tcp --dport 993 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 993 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Il secondo comando, che consente il traffico in uscita delle connessioni IMAPS stabilite, è necessario solo se la politica OUTPUT non è impostata su ACCEPT.

Consentire tutti i POP3 in arrivo

Per consentire al server di rispondere alle connessioni POP3, porta 110, eseguire questi comandi:

sudo iptables -A INPUT -p tcp --dport 110 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 110 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Il secondo comando, che consente il traffico in uscita delle connessioni POP3 stabilite, è necessario solo se il criterio OUTPUT non è impostato su ACCEPT.

Consentire tutti i POP3S in arrivo

Per consentire al server di rispondere alle connessioni POP3S, porta 995, eseguire questi comandi:

sudo iptables -A INPUT -p tcp --dport 995 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 995 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Il secondo comando, che consente il traffico in uscita delle connessioni POP3S stabilite, è necessario solo se il criterio OUTPUT non è impostato su ACCEPT.

Conclusione

Questo tutorial dovrebbe coprire molti dei comandi che vengono comunemente utilizzati durante la configurazione di un firewall iptables. Naturalmente, iptables è uno strumento molto flessibile, quindi sentiti libero di provare e abbinare i comandi con diverse opzioni per soddisfare le tue esigenze specifiche se non sono coperte qui.