Nel seguente articolo ti mostreremo come puoi proteggere e proteggere il tuo server virtuale basato su Ubuntu o Debian usando un firewall applicazione, chiamata iptables.
Cos'è iptables?
È un programma applicativo per lo spazio utente che consente a un amministratore di sistema di configurare le tabelle fornite dal firewall del kernel Linux (implementato come moduli Netfilter diversi ) e le catene e le regole che memorizza.
Per contenere il numero di tentativi di effrazione e per filtrare le porte aperte sul tuo server virtuale, è necessario configurare correttamente il tuo firewall .
Per semplificare la gestione delle regole del firewall del tuo server, forniremo un semplice script di shell che ti aiuterà con la gestione delle regole del firewall. Fondamentalmente, ogni volta che è necessario modificare le regole del firewall, utilizzare questo script per aggiungere/rimuovere le regole desiderate.
REGOLAZIONE DEL FIREWALL
Prima di racchiudere le regole in uno script, dividiamolo in sezioni in modo da poter conoscere il design del firewall e quali regole saranno in atto.
VECCHIE REGOLE DI LAVAGGIO
Le regole del firewall possono essere cancellate usando i seguenti comandi:
## iptables --flush ## iptables --delete-chain ## iptables --table nat --flush ## iptables --table nat --delete-chain
DETERMINARE I PORTI DI SERVIZIO
Devi sapere quali servizi hai esposto al pubblico in modo da poter stabilire regole appropriate per loro. Un modo per scoprire quali servizi sono in ascolto su quali porte è utilizzare netstat
o ss
comandi come in:
## netstat -tunlp or ## ss -tunlp
ad esempio, stiamo usando uno dei nostri server virtuali Ubuntu 12.04 LTS e quello che segue è l'output di netstat
comando:
## netstat -tunlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 296/mysqld tcp 0 0 0.0.0.0:587 0.0.0.0:* LISTEN 449/sendmail: MTA: tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN 261/dovecot tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN 261/dovecot tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 590/apache2 tcp 0 0 209.135.140.77:53 0.0.0.0:* LISTEN 353/named tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 353/named tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 173/vsftpd tcp 0 0 0.0.0.0:5622 0.0.0.0:* LISTEN 630/sshd tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 449/sendmail: MTA: tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 353/named tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 590/apache2 tcp 0 0 0.0.0.0:993 0.0.0.0:* LISTEN 261/dovecot tcp 0 0 0.0.0.0:995 0.0.0.0:* LISTEN 261/dovecot udp 0 0 209.135.140.77:53 0.0.0.0:* 353/named udp 0 0 127.0.0.1:53 0.0.0.0:* 353/named
quindi questo significa che abbiamo le seguenti porte aperte al pubblico:
- 25 (smtp)
- 587 (invio SMTP)
- 110 (pop3)
- 143 (imap)
- 993 (imap ssl)
- 995 (pop3 ssl)
- 80 (http)
- 443 (https)
- 53 (dns)
- 21 (ftp)
- 5622 (ssh)
IMPOSTA LE POLITICHE PREDEFINITE
ok, ora possiamo impostare i criteri del nostro firewall su DROP tutto in INPUT e AVANTI catene e consentire il traffico in OUTPUT catena.
la tabella predefinita filter
contiene tre catene integrate:
- Il traffico in entrata indirizzato alla macchina stessa colpisce la catena INPUT.
- Il traffico in uscita, generato localmente raggiunge la catena OUTPUT.
- Il traffico instradato che non dovrebbe essere consegnato localmente raggiunge la catena FORWARD.
controlla man 8 iptables
per ulteriori informazioni su questo
le politiche predefinite possono essere applicate utilizzando i seguenti comandi:
## iptables -P INPUT DROP # <- do not run this over ssh as it will lock you out ## iptables -P FORWARD DROP ## iptables -P OUTPUT ACCEPT
REGOLAZIONE DEL FIREWALL
La prossima cosa da fare è impostare effettivamente le regole del firewall per i nostri servizi. Poiché la catena INPUT è ESAURITA, dovremo inserire nella white list i servizi in ascolto su porte pubbliche, quindi:
la prima cosa è abilitare l'uso gratuito delle loopback interfaces
, per garantire che tutte le sessioni TCP inizino con SYN e per consentire pacchetti stabiliti e correlati:
## iptables -A INPUT -i lo -j ACCEPT ## iptables -A OUTPUT -o lo -j ACCEPT ## iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP ## iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
quindi, apriamo le nostre porte di servizio utilizzando regole firewall come:
### SSH ## iptables -A INPUT -p tcp --dport 5622 -m state --state NEW -j ACCEPT ### HTTP ## iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT ### SMTP ## iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT
e così via. Una volta che tutti i servizi sono stati inseriti nella white list, è una buona idea consentire i pacchetti ICMP e LOG e DROP tutto il resto nella catena INPUT.
## iptables -A INPUT -p ICMP --icmp-type 8 -j ACCEPT ## iptables -A INPUT -j LOG ## iptables -A INPUT -j DROP
SALVA/RIPRISTINA LE REGOLE DEL FIREWALL
Le regole del firewall non sono persistenti per impostazione predefinita, il che significa che andranno perse se, ad esempio, si riavvia il server virtuale. Per salvare il tuo attuale firewall in /etc/fwall.rules
useresti qualcosa come:
## iptables-save > /etc/fwall.rules
e per ripristinare le regole salvate, dovresti usare qualcosa come:
## iptables-restore -c /etc/fwall.rules
per ripristinare automaticamente le regole all'avvio del sistema, dovresti utilizzare un pacchetto chiamato iptables-persistent
oppure puoi semplicemente creare uno script in /etc/network/if-pre-up.d
che caricherà le regole salvate in /etc/fwall.rules
, ad esempio:
## vim /etc/network/if-pre-up.d/iptables #!/bin/bash test -e /etc/fwall.rules && iptables-restore -c /etc/fwall.rules ## chmod +x /etc/network/if-pre-up.d/iptables
SCRIPT FIREWALL
salva lo script in /usr/local/bin/fwall-rules
e rendilo eseguibile
#!/bin/bash IPTABLES=/sbin/iptables echo " * flushing old rules" ${IPTABLES} --flush ${IPTABLES} --delete-chain ${IPTABLES} --table nat --flush ${IPTABLES} --table nat --delete-chain echo " * setting default policies" ${IPTABLES} -P INPUT DROP ${IPTABLES} -P FORWARD DROP ${IPTABLES} -P OUTPUT ACCEPT echo " * allowing loopback devices" ${IPTABLES} -A INPUT -i lo -j ACCEPT ${IPTABLES} -A OUTPUT -o lo -j ACCEPT ${IPTABLES} -A INPUT -p tcp ! --syn -m state --state NEW -j DROP ${IPTABLES} -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT ## BLOCK ABUSING IPs HERE ## #echo " * BLACKLIST" #${IPTABLES} -A INPUT -s _ABUSIVE_IP_ -j DROP #${IPTABLES} -A INPUT -s _ABUSIVE_IP2_ -j DROP echo " * allowing ssh on port 5622" ${IPTABLES} -A INPUT -p tcp --dport 5622 -m state --state NEW -j ACCEPT echo " * allowing ftp on port 21" ${IPTABLES} -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT echo " * allowing dns on port 53 udp" ${IPTABLES} -A INPUT -p udp -m udp --dport 53 -j ACCEPT echo " * allowing dns on port 53 tcp" ${IPTABLES} -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT echo " * allowing http on port 80" ${IPTABLES} -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT echo " * allowing https on port 443" ${IPTABLES} -A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT echo " * allowing smtp on port 25" ${IPTABLES} -A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT echo " * allowing submission on port 587" ${IPTABLES} -A INPUT -p tcp -m state --state NEW -m tcp --dport 587 -j ACCEPT echo " * allowing imaps on port 993" ${IPTABLES} -A INPUT -p tcp -m state --state NEW -m tcp --dport 993 -j ACCEPT echo " * allowing pop3s on port 995" ${IPTABLES} -A INPUT -p tcp -m state --state NEW -m tcp --dport 995 -j ACCEPT echo " * allowing imap on port 143" ${IPTABLES} -A INPUT -p tcp -m state --state NEW -m tcp --dport 143 -j ACCEPT echo " * allowing pop3 on port 110" ${IPTABLES} -A INPUT -p tcp -m state --state NEW -m tcp --dport 110 -j ACCEPT echo " * allowing ping responses" ${IPTABLES} -A INPUT -p ICMP --icmp-type 8 -j ACCEPT # DROP everything else and Log it ${IPTABLES} -A INPUT -j LOG ${IPTABLES} -A INPUT -j DROP # # Save settings # echo " * SAVING RULES" if [[ -d /etc/network/if-pre-up.d ]]; then if [[ ! -f /etc/network/if-pre-up.d/iptables ]]; then echo -e "#!/bin/bash" > /etc/network/if-pre-up.d/iptables echo -e "test -e /etc/iptables.rules && iptables-restore -c /etc/iptables.rules" >> /etc/network/if-pre-up.d/iptables chmod +x /etc/network/if-pre-up.d/iptables fi fi iptables-save > /etc/fwall.rules iptables-restore -c /etc/fwall.rules
## chmod +x /usr/local/bin/fwall-rules
per attivare le regole che hai preparato nello script, basta eseguire
## fwall-rules
dalla riga di comando. Per aggiungere o rimuovere una regola, devi solo aprire lo script, aggiungere o rimuovere la regola desiderata, salvarla ed eseguirla di nuovo, ad esempio:
## fwall-rules * flushing old rules * setting default policies * allowing loopback devices * allowing ssh on port 5622 * allowing ftp on port 21 * allowing dns on port 53 udp * allowing dns on port 53 tcp * allowing http on port 80 * allowing https on port 443 * allowing smtp on port 25 * allowing submission on port 587 * allowing imaps on port 993 * allowing pop3s on port 995 * allowing imap on port 143 * allowing pop3 on port 110 * allowing ping responses * SAVING RULES
Ovviamente non devi fare nulla di tutto ciò se usi uno dei nostri servizi di hosting VPS Linux, nel qual caso puoi semplicemente chiedere ai nostri esperti amministratori Linux di farlo per te. Sono disponibili 24 ore su 24, 7 giorni su 7 e si prenderanno immediatamente cura della tua richiesta.
PS. Se questo post ti è piaciuto condividilo con i tuoi amici sui social network utilizzando i pulsanti a sinistra o semplicemente lascia una risposta qui sotto. Grazie.