introduzione
iptables
è un potente strumento utilizzato per configurare il firewall integrato del kernel Linux. Viene preinstallato sulla maggior parte delle distribuzioni Ubuntu, tuttavia se si utilizza una versione Ubuntu personalizzata o si esegue all'interno di un contenitore, molto probabilmente sarà necessario installarlo manualmente.
sudo apt-get install iptables iptables-persistent
Dopo l'installazione, se ti viene chiesto se salvare le tue regole attuali, al momento non ha importanza perché rimuoverai o creerai nuove regole in seguito.
Suggerimenti
È possibile utilizzare il netcat
comando (su un computer diverso dal proprio server) per verificare quali porte sono aperte o chiuse.
nc -z -w5 -v SERVER_IP PORT
nc
è il comando netcat.
-z
basta inviare un pacchetto senza payload.
-w5
attendere fino a 5 secondi per una risposta.
-v
modalità dettagliata.
- Sostituisci
SERVER_IP
con il tuo indirizzo del server.
- Sostituire
PORT
con la porta che si desidera verificare se è aperta (ad es 22
.).
Sul tuo server puoi usare il netstat
comando per vedere quali porte sono attualmente in attesa di connessioni.
sudo netstat -tulpn
Nota: sebbene netstat
sia utile trovare le porte con cui si desidera lavorare, è necessario essere consapevoli delle applicazioni attualmente installate sul server e delle porte in ascolto, non è necessario consentire tutte le porte trovate netstat
nell'output .
Sintassi
sudo iptables -A INPUT -p tcp -m tcp --dport 22 --m geoip --src-cc PE -j ACCEPT
-A INPUT
aggiungere una regola alla INPUT
catena, una catena è un insieme di regole, quelle che usiamo più su questa guida sarà INPUT
, OUTPUT
e PREROUTING
.
-p tcp
impostato tcp
come protocollo a cui verrà applicata questa regola, è inoltre possibile utilizzare altri protocolli come udp
, icmp
o all
.
-m tcp
usa il tcp
modulo. iptables
supporta funzionalità aggiuntive tramite moduli, alcuni dei quali sono già preinstallati iptables
e altri, come il geoip
modulo.
--dport 22
i comandi che iniziano con --
indicano opzioni aggiuntive per il modulo precedentemente utilizzato, in questo caso diremo al tcp
modulo di applicare solo alla porta 22
.
-m geoip
usa il geoip
modulo. Limiterà i pacchetti su base nazionale (ulteriori informazioni al passaggio 5).
--src-cc PE
di 'al geoip
modulo di limitare i pacchetti in arrivo a quelli che provengono dal Perù. Per più codici paese cercare ISO 3166 country codes
su Internet.
-j ACCEPT
l' -j
argomento dice iptables
cosa fare se un pacchetto corrisponde ai vincoli specificati negli argomenti precedenti. In questo caso sarà ACCEPT
questi pacchetti, altre opzioni sono REJECT
, DROP
e altro ancora. Puoi trovare più opzioni cercando iptables jump targets
su Internet.
1. Nozioni di base
Elenca tutte le regole.
sudo iptables -L
Elenca tutti i comandi utilizzati per creare le regole attualmente utilizzate, utili per modificare o eliminare le regole.
sudo iptables -S
Per eliminare una regola specifica scegliere una regola sudo iptables -S
e sostituirla -A
con -D
.
# -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
sudo iptables -D INPUT -p tcp -m tcp --dport 22 -j ACCEPT
Elenca tutte le regole numerate nella INPUT
catena.
sudo iptables -L INPUT --line-numbers
Elimina una regola numerata.
sudo iptables -D INPUT 2
Per cancellare tutte le regole.
sudo iptables -F
Attenzione: potresti perdere la connessione se connesso tramite SSH .
Cancella solo le regole nella OUTPUT
catena.
sudo iptables -F OUTPUT
2. Creare regole iniziali
Consenti SSH
su eth0
un'interfaccia
sudo iptables -A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
-i eth0
applica la regola a un'interfaccia specifica, per consentire a qualsiasi interfaccia di rimuovere questo comando.
Limitare i pacchetti in entrata a un IP specifico (ad es 10.0.3.1/32
.).
sudo iptables -A INPUT -i eth0 -s 10.0.3.1/32 -p tcp -m tcp --dport 22 -j ACCEPT
-s 10.0.3.1/32
specifica un IP / sottorete da cui consentire le connessioni.
Imposta le regole di catena predefinite.
Attenzione: prima di procedere assicurarsi di aver applicato le regole SSH corrette se si lavora su un server remoto .
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
-P INPUT DROP
nega tutti i pacchetti in arrivo (ovvero nessuno sarà in grado di connettersi ai server in esecuzione come Apache, SQL, ecc.).
-P FORWARD DROP
nega tutti i pacchetti inoltrati (ovvero quando si utilizza il sistema come router).
-P OUTPUT ACCEPT
consente tutti i pacchetti in uscita (ovvero quando si esegue una HTTP
richiesta).
Consenti tutto il traffico sull'interfaccia di loopback ( consigliata ).
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
3. Rendi persistenti le regole
Salva le iptables
regole correnti .
sudo netfilter-persistent save
sudo netfilter-persistent reload
Se stai eseguendo un contenitore, il netfilter-persistent
comando molto probabilmente non funzionerà, quindi devi riconfigurare il iptables-persistent
pacchetto.
sudo dpkg-reconfigure iptables-persistent
4. Consenti connessioni in uscita
Consenti query DNS.
sudo iptables -A OUTPUT -p tcp --dport 53 -m state --state NEW -j ACCEPT
sudo iptables -A OUTPUT -p udp --dport 53 -m state --state NEW -j ACCEPT
Utilizzare il state
modulo per consentire RELATED
e i ESTABLISHED
pacchetti in uscita.
sudo iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Consentire le porte desiderate; in questo caso, HTTP
porte.
sudo iptables -A OUTPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
Altre porte che potresti voler usare.
FTP
: tcp alla porta 21
HTTPS
: TCP alla porta 443
DHCP
: udp alla porta 67
NTP
: udp alla porta 123
Nota: se si desidera consentire apt-get
, potrebbe essere necessario consentire FTP
eHTTPS
.
Consentire il traffico restituito solo per RELATED
e già ESTABLISHED
connessioni ( consigliato perché a volte è richiesta la comunicazione bidirezionale).
sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Altre regole utili
Consenti richieste ping dall'esterno.
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
sudo iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
Inoltra il traffico sulla eth0
porta 2200
a 10.0.3.21:22
(utile se si desidera esporre un server SSH in esecuzione all'interno di un contenitore).
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 2200 -j DNAT --to-destination 10.0.3.21:22
Se accedi correttamente al tuo server usando SSH, verrà creata una connessione permanente (cioè nessuna nuova connessione anche se sei connesso per più di 1 ora). Se non si riesce e si tenta di accedere nuovamente, verrà creata una nuova connessione. Ciò bloccherà i tentativi di accesso SSH continui limitando le nuove connessioni all'ora.
sudo iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
sudo iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 3600 --hitcount 4 -j DROP
Reindirizzare tutte le richieste da porta 443
a porta 4430
(utile se si desidera associare alla porta 443
senza root
).
sudo iptables -t nat -A PREROUTING -i ens3 -p tcp --dport 443 -j REDIRECT --to-port 4430
sudo iptables -A INPUT -p tcp -m tcp --dport 4430 -m geoip --src-cc PE -j ACCEPT
ens3
l'interfaccia di rete.
-m geoip
modulo blocco paese (vedi passaggio 5).
Avvertenza: non utilizzare lo
, il sistema operativo eliminerà tutti i pacchetti reindirizzati all'interfaccia di loopback .
5. Consentire o bloccare interi paesi
5.1 Installa xtables-addons
Puoi installare il xtables-addons
modulo usando vari metodi, sentiti libero di usare il metodo di installazione che funziona meglio per te.
-
Installa usando apt-get
.
sudo apt-get install xtables-addons-common
-
Installa usando module-assistant
.
sudo apt-get install module-assistant xtables-addons-source
sudo module-assistant --verbose --text-mode auto-install xtables-addons
-
Installa dalla fonte.
sudo apt-get install git bc libncurses5-dev libtext-csv-xs-perl autoconf automake libtool xutils-dev iptables-dev
git clone git://git.code.sf.net/p/xtables-addons/xtables-addons
cd xtables-addons
./autogen.sh
./configure
make
sudo make install
Costruire un database "paesi".
sudo apt-get install libtext-csv-xs-perl unzip
sudo mkdir /usr/share/xt_geoip
sudo /usr/lib/xtables-addons/xt_geoip_dl
sudo /usr/lib/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip *.csv
sudo rm GeoIPCountryCSV.zip GeoIPCountryWhois.csv GeoIPv6.csv
Riavvia il tuo sistema.
sudo reboot
Dopo che xtables-addons
è stato installato con successo, dopo il primo riavvio, eseguire depmod
altrimenti il blocco paese non funzionerà correttamente (questo è necessario solo per la prima volta).
sudo depmod
Creare uno script su /etc/cron.monthly/geoip-updater
per aggiornare il geoip
database mensilmente.
#!/usr/bin/env bash
# this script is intended to run with sudo privileges
echo 'Removing old database---------------------------------------------------'
rm -rf /usr/share/xt_geoip/*
mkdir -p /usr/share/xt_geoip
echo 'Downloading country databases-------------------------------------------'
mkdir /tmp/geoip-updater
cd /tmp/geoip-updater
/usr/lib/xtables-addons/xt_geoip_dl
echo 'Building geoip database-------------------------------------------------'
/usr/lib/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip *.csv
echo 'Removing temporary files------------------------------------------------'
cd /tmp
rm -rf /tmp/geoip-updater
Rendi /etc/cron.monthly/geoip-updater
eseguibile.
sudo chmod +x /etc/cron.monthly/geoip-updater
5.2 Regole di esempio
_Nota: se si riceve un iptables: No chain/target/match by that name
errore durante il tentativo di applicare una geoip
regola, è possibile che xtables-addons
non sia stato installato correttamente. Prova un altro metodo di installazione.
Blocca tutti i pacchetti in arrivo da Cina, Hong Kong, Russia e Corea.
sudo iptables -A INPUT -m geoip --src-cc CN,HK,RU,KR -j DROP
Consentire i pacchetti in entrata sul porto 80
da qualsiasi luogo tranne i paesi sopra.
sudo iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
Consenti pacchetti in entrata ens3
sull'interfaccia sulla porta 22
solo dal Perù (sentiti libero di scegliere il prefisso da cui vuoi accettare i pacchetti, ad esempio, US
per gli Stati Uniti).
sudo iptables -A INPUT -i ens3 -p tcp -m tcp --dport 22 -m geoip --src-cc PE -j ACCEPT
Consentire i pacchetti in entrata sul porto 443
solo dal Perù.
sudo iptables -A INPUT -p tcp -m tcp --dport 443 -m geoip --src-cc PE -j ACCEPT