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 netcatcomando (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_IPcon il tuo indirizzo del server.
- Sostituire
PORTcon la porta che si desidera verificare se è aperta (ad es 22.).
Sul tuo server puoi usare il netstatcomando per vedere quali porte sono attualmente in attesa di connessioni.
sudo netstat -tulpn
Nota: sebbene netstatsia 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 netstatnell'output .
Sintassi
sudo iptables -A INPUT -p tcp -m tcp --dport 22 --m geoip --src-cc PE -j ACCEPT
-A INPUTaggiungere una regola alla INPUTcatena, una catena è un insieme di regole, quelle che usiamo più su questa guida sarà INPUT, OUTPUTe PREROUTING.
-p tcpimpostato tcpcome protocollo a cui verrà applicata questa regola, è inoltre possibile utilizzare altri protocolli come udp, icmpo all.
-m tcpusa il tcpmodulo. iptablessupporta funzionalità aggiuntive tramite moduli, alcuni dei quali sono già preinstallati iptablese altri, come il geoipmodulo.
--dport 22i comandi che iniziano con --indicano opzioni aggiuntive per il modulo precedentemente utilizzato, in questo caso diremo al tcpmodulo di applicare solo alla porta 22.
-m geoipusa il geoipmodulo. Limiterà i pacchetti su base nazionale (ulteriori informazioni al passaggio 5).
--src-cc PEdi 'al geoipmodulo di limitare i pacchetti in arrivo a quelli che provengono dal Perù. Per più codici paese cercare ISO 3166 country codessu Internet.
-j ACCEPTl' -jargomento dice iptablescosa fare se un pacchetto corrisponde ai vincoli specificati negli argomenti precedenti. In questo caso sarà ACCEPTquesti pacchetti, altre opzioni sono REJECT, DROPe altro ancora. Puoi trovare più opzioni cercando iptables jump targetssu 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 -Se sostituirla -Acon -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 INPUTcatena.
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 OUTPUTcatena.
sudo iptables -F OUTPUT
2. Creare regole iniziali
Consenti SSHsu eth0un'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 ACCEPTconsente tutti i pacchetti in uscita (ovvero quando si esegue una HTTPrichiesta).
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 iptablesregole correnti .
sudo netfilter-persistent save
sudo netfilter-persistent reload
Se stai eseguendo un contenitore, il netfilter-persistentcomando molto probabilmente non funzionerà, quindi devi riconfigurare il iptables-persistentpacchetto.
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 statemodulo per consentire RELATEDe i ESTABLISHEDpacchetti in uscita.
sudo iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Consentire le porte desiderate; in questo caso, HTTPporte.
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 FTPeHTTPS .
Consentire il traffico restituito solo per RELATEDe già ESTABLISHEDconnessioni ( 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 eth0porta 2200a 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 443a porta 4430(utile se si desidera associare alla porta 443senza 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-addonsmodulo 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 depmodaltrimenti il blocco paese non funzionerà correttamente (questo è necessario solo per la prima volta).
sudo depmod
Creare uno script su /etc/cron.monthly/geoip-updaterper aggiornare il geoipdatabase 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-updatereseguibile.
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 nameerrore durante il tentativo di applicare una geoipregola, è possibile che xtables-addonsnon 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 80da qualsiasi luogo tranne i paesi sopra.
sudo iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
Consenti pacchetti in entrata ens3sull'interfaccia sulla porta 22solo dal Perù (sentiti libero di scegliere il prefisso da cui vuoi accettare i pacchetti, ad esempio, USper 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 443solo dal Perù.
sudo iptables -A INPUT -p tcp -m tcp --dport 443 -m geoip --src-cc PE -j ACCEPT