GNU/Linux >> Linux Esercitazione >  >> Linux

Come proteggere un firewall Linux con le regole IPtables

L'hacking del server e l'accesso non autorizzato sono minacce reali. Questi motivi sono i motivi per cui dovresti implementare un firewall come parte della tua strategia generale di sicurezza della rete. La configurazione di un firewall con regole iptables è un modo per mitigare tali rischi sui sistemi Linux.

Fortunatamente per te, questo tutorial ti insegnerà come implementare un firewall con la configurazione delle regole di base di iptables che puoi quindi personalizzare in base alle tue esigenze. Pronto a sporcarti le mani? È ora di tuffarsi!

Prerequisiti

Questo tutorial ospita dimostrazioni pratiche. Se desideri seguire, assicurati di avere un server Linux o un computer desktop. Questo tutorial utilizza Ubuntu 14.04 per gli esempi, ma dovrebbe funzionare con altre distribuzioni Linux e versioni più recenti di Ubuntu.

Installazione del servizio firewall persistente Iptables

Come suggerisce il nome, IPTables Persistent Firewall è un servizio che salva i set di regole e applica automaticamente le regole IPTables al riavvio del server. Ma prima dovrai installare il pacchetto del firewall persistente.

Per installare IPTables Persistent Firewall, procedi con i seguenti passaggi.

1. Aprire una sessione terminale sul server in locale o tramite SSH.

2. Quindi, esegui il comando seguente per aggiornare la cache di origine del pacchetto del tuo server.

# Updating the package source cache
sudo apt update -y

3. Ora, esegui il comando seguente per installare IPTables Persistent Firewall.

# Installing the Persistent Firewall Package
sudo apt install iptables-persistent -y

4. Per salvareavere le attuali regole IPv4 , seleziona e premere Invio sulla richiesta. Il programma di installazione salva le regole IPv4 nel file /etc/iptables/rules.v4.

5. La richiesta successiva ti chiede di Salvare le regole IPv6 correnti , seleziona e premere Invio. Il programma di installazione salva le regole IPv6 nel file /etc/iptables/rules.v6.

Infine, conferma che il netfilter-persistent.service è attivo e abilitato.

sudo systemctl status netfilter-persistent

Impostazione delle regole di base di Iptables

Nella configurazione di base del firewall, costruirai un framework estensibile su cui puoi costruire per configurare il tuo firewall. In genere, imposterai un "nega tutto-accetta tutto ", il che significa che qualsiasi richiesta in arrivo da qualsiasi IP verrà rifiutata, ad eccezione dell'IP e della porta SSH 22 (per l'accesso come amministratore).

Saranno consentite tutte le connessioni in corso dall'IP del tuo server a Internet più ampio; tutte le connessioni in entrata verranno eliminate (ad eccezione di SSH). Successivamente, creerai eccezioni per i servizi specifici e i tipi di traffico di cui hai bisogno, imparando gradualmente più avanti in questo tutorial.

1. Apri /etc/iptables/rules.v4 file in un editor di testo. Questo esempio usa nano come editore.

sudo nano /etc/iptables/rules.v4

Quindi, elimina tutto il contenuto in /etc/iptables/rules.v4 file e sostituirlo con le seguenti righe. Fare riferimento ai commenti in linea per capire cosa fa ogni riga/sezione.

Nota:la configurazione del firewall di seguito è quella che potresti descrivere come rigorosa e serve solo a creare una regola firewall di base, che puoi personalizzare in seguito.

*filter
# Setting up a "deny all-accept all" policy
# Allow all outgoing, but deny/drop all incoming and forwarding traffic
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

# Custom per-protocol chains
# Defining custom rules for UDP protocol.
:UDP - [0:0]
# Defining custom rules for TCP protocol.
:TCP - [0:0]
# Defining custom rules for ICMP protocol.
:ICMP - [0:0]

# Accept SSH UDP traffic
-A TCP -p udp --dport 22 -j ACCEPT
# Accept SSH TCP traffic
-A TCP -p tcp --dport 22 -j ACCEPT

# Acceptable ICMP traffic

# Boilerplate acceptance policy
# Allowing packets based on the CONNTRACK connection states of ESTABLISHED and RELATED
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Allowing packets through the loopback interface, which is used for local connections
-A INPUT -i lo -j ACCEPT

# Packets that do not match any rules in the protocol-specific should be dropped.
-A INPUT -m conntrack --ctstate INVALID -j DROP
# Allowing new protocol-specific chains to process packets for UDP that have a NEW conntrack state.
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
# Allowing new protocol-specific chains to process packets for TCP that have a NEW conntrack state.
-A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP
# Allowing new protocol-specific chains to process packets for ICMP that have a NEW conntrack state.
-A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP

# Reject anything at this point. And print out rejection message with its specific protocol.
# Issuing an ICMP "port unreachable" message to any new incoming UDP packets, rejecting them.
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
# Issuing a "tcp-reset" message to any new incoming TCP packets, rejecting them.
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
# Issuing an "icmp-proto-unreachable" message to any new incoming TCP packets, dropping all other incoming packets.
-A INPUT -j REJECT --reject-with icmp-proto-unreachable

# Commit the changes
COMMIT

*raw
# Allowing packets in the PREROUTING chain
:PREROUTING ACCEPT [0:0]
# Allows packets in the OUTPUT chain, which is used for locally generated packets
:OUTPUT ACCEPT [0:0]
# Commits the changes to the kernel
COMMIT
# NAT table is used to alter packets as they are routed through the system
*nat
:PREROUTING ACCEPT [0:0]
# Allowing packets in the INPUT chains for NAT
:INPUT ACCEPT [0:0]
# Allowing packets in the OUTPUT chains for NAT
:OUTPUT ACCEPT [0:0]
# Allowing packets in the POSTROUTING chains for NAT
:POSTROUTING ACCEPT [0:0]
# Commits the changes to the kernel
COMMIT

*security
# Allowing packets in the INPUT chains for security
:INPUT ACCEPT [0:0]
# Allowing packets in the FORWARD chains for security
:FORWARD ACCEPT [0:0]
# Allowing packets in the OUTPUT chains for security
:OUTPUT ACCEPT [0:0]
# Commits the changes to the kernel
COMMIT

*mangle
# Allowing packets in the PREROUTING chains for mangle
:PREROUTING ACCEPT [0:0]
# Allowing packets in the INPUT chains for mangle
:INPUT ACCEPT [0:0]
# Allowing packets in the FORWARD chains for mangle
:FORWARD ACCEPT [0:0]
# Allowing packets in the OUTPUT chains for mangle
:OUTPUT ACCEPT [0:0]
# Allowing packets in the POSTROUTING chains for mangle
:POSTROUTING ACCEPT [0:0]
# Commits the changes to the kernel
COMMIT

3. Salvare il file. In nano , premi CTRL+X, Y, Invio.

4. Esegui iptables-restore comando seguente per convalidare o trovare eventuali errori di sintassi. Se non ci sono errori, il firewall si riavvierà con le regole definite nel file. Se sono presenti errori, il comando restituirà un elenco degli errori e come risolverli.

sudo iptables-restore -t /etc/iptables/rules.v4

5. Quindi, modifica /etc/iptables/rules.v6 per implementare la policy e il framework del firewall per IPv6.

sudo nano /etc/iptables/rules.v6

6. Sostituisci il file /etc/iptables/rules.v6 con le seguenti righe. Salva ed esci da /etc/iptables/rules.v6 premendo CTRL+X, Y, Invio.

Le regole di iptables riportate di seguito elimineranno tutto il traffico IPv6 e presuppongono che non vi siano applicazioni o servizi sul server che si basano o utilizzano IPv6.

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
COMMIT

7. Eseguire il comando seguente per trovare e correggere eventuali errori di sintassi.

sudo ip6tables-restore -t /etc/iptables/rules.v6

8. Ora ricarica il netfilter-persistent servizio per rendere effettive le regole di iptables.

sudo service netfilter-persistent reload

9. Esegui il comando seguente per salvare le nuove regole di iptables.

sudo service netfilter-persistent save

10. Eseguire il comando seguente per elencare tutte le regole per IPv4 attualmente in uso.

sudo iptables -S

10. Infine, elenca le regole di iptables per IPv6.

sudo ip6tables -S

Modifica dell'indirizzo IP del server DNS del server (condizionale)

Il blocco di tutto il traffico IPv6 può causare effetti collaterali sfavorevoli, in particolare se il tuo server si basa su IPv6 per la risoluzione dei nomi.

In questo esempio, la configurazione di rete si basa su server dei nomi IPv6 (come 2001:4860:4860::8888 e 2001:4860:4860::8844). Poiché il firewall applica solo il traffico IPv4, il sistema non può cercare i server dei nomi per IPv6.

Ad esempio, alcuni dei tuoi repository APT potrebbero non funzionare se il firewall blocca tutto il traffico IPv6. Se provi a eseguire nuovamente il sudo apt update comando, potresti ricevere il seguente errore.

La soluzione è aggiornare il file di configurazione della rete, preferendo utilizzare i server dei nomi IPv4 (come 8.8.8.8 e 8.8.4.4).

1. Apri /etc/network/interfaces file in un editor di testo.

I file di configurazione dell'interfaccia di rete n possono differire a seconda della distribuzione o versione Linux. L'esempio seguente è specifico per Ubuntu 14.04 LTS.

sudo nano /etc/network/interfaces

2. Cerca il dns-nameservers direttiva. Cambia questa direttiva in dns-nameservers 8.8.8.8 8.8.4.4 .

8.8.8.8 e 8.8.4.4 sono server DNS pubblici gestiti da Google. Questi server DNS pubblici sono affidabili e veloci. Sentiti libero di utilizzare altri server DNS, come OpenDNS o un DNS IPv4 interno nella tua organizzazione.

3. Eseguire il comando seguente per scorrere l'interfaccia di rete del server e utilizzare i nuovi server dei nomi.

sudo ifdown eth0 && sudo ifup eth0

4. Quindi, apri /etc/apt/apt.conf.d/99force-ipv4 in un editor di testo. Questa configurazione predefinita archivia cosa APT utilizza per le impostazioni persistenti.

sudo nano /etc/apt/apt.conf.d/99force-ipv4

5. Compila il 99force-ipv4 file con la riga seguente. Questo valore forzerà APT a utilizzare IPv4 per la risoluzione dei nomi. Salva ed esci da 99force-ipv4 .

Acquire::ForceIPv4 "true";

6. Disconnettersi e riconnettersi alla sessione SSH ed eseguire nuovamente il sudo apt update comando. Non dovresti più vedere gli errori di risoluzione dei nomi.

Aggiunta di esenzioni per servizi specifici

Ora che hai le regole iptables "consenti tutto-nega tutto", ora puoi aprire porte specifiche per determinati servizi secondo necessità. Ad esempio, se il tuo server ospita o ospiterà un sito Web, dovrai consentire il traffico della porta HTTP 80 o della porta HTTPS 443. Per farlo, procedi come segue.

1. Sul terminale, eseguire il comando seguente per aprire la porta TCP 80 per il traffico HTTP e la porta 443 per il traffico HTTPS.

  • Il -A accetta quale catena aggiungere la regola.
  • Il -p il parametro specifica il tipo di protocollo applicato dalla regola.
  • Il --dport il valore del parametro è il numero della porta di destinazione.
  • Il -j parametro indica quale azione intraprendere quando la regola corrisponde.
sudo iptables -A TCP -p tcp --dport 80 -j ACCEPT
sudo iptables -A TCP -p tcp --dport 443 -j ACCEPT

2. Eseguire il comando seguente per verificare che le nuove regole siano ora efficaci.

sudo iptables -L -v

Vedrai le tue due voci rispettivamente per HTTP e HTTPS.

3. Infine, esegui il comando seguente per salvare le modifiche alle regole di iptables.

sudo service netfilter-persistent save

Consenti connessioni in base all'origine

Iptables consente inoltre di creare regole per consentire il traffico da origini specifiche, ad esempio da uno o più indirizzi IP. Ad esempio, la tua azienda potrebbe avere tre siti, ciascuno con il proprio indirizzo IP (ad esempio, 192.168.1.20, 192.168.1.30 e 192.168.1.40).

Probabilmente vuoi consentire le connessioni al tuo server da ciascun sito. Per farlo, creerai tre regole separate con il -s per specificare la fonte specifica.

1. Eseguire i seguenti comandi per consentire le connessioni da tre indirizzi IP specifici.

Gli indirizzi IP riportati di seguito sono solo a scopo esemplificativo e potrebbero non riflettere uno scenario reale. Gli indirizzi IP dei tuoi siti saranno diversi.

# Allowing connection from 192.168.1.20
sudo iptables -A TCP -s 192.168.1.20 -j ACCEPT
# Allowing connection from 192.168.1.30
sudo iptables -A TCP -s 192.168.1.30 -j ACCEPT
# Allowing connection from 192.168.1.40
sudo iptables -A TCP -s 192.168.1.40 -j ACCEPT

2. Esegui nuovamente il comando seguente per verificare che le nuove regole siano state aggiunte.

sudo iptables -L -v

Vedrai tre voci per le tue tre fonti specifiche, consentendo loro di connettersi al tuo server.

3. Infine, non dimenticare di salvare le regole di iptables eseguendo il comando seguente.

sudo service netfilter-persistent save

Ripristino delle regole di Iptables

Ora hai configurato correttamente un firewall con le regole di iptables. Ma non tutto va sempre secondo i piani. Ma cosa succede se hai sbagliato e vuoi ricominciare da capo?

Un'opzione è ripristinare tutte le regole di iptables. Per farlo, segui i passaggi seguenti.

1. Innanzitutto, crea una copia di backup delle regole di iptables esistenti. Il comando seguente copia rules.v4 e rules.v6 file nella tua home directory.

sudo cp /etc/iptables/* ~/

2. Quindi, elimina tutte le regole di iptables esistenti eseguendo il comando seguente.

sudo service netfilter-persistent flush

3. Conferma che le regole non esistono più.

sudo iptables -S

Come puoi vedere di seguito, rimangono solo le regole di iptables predefinite, consentendo tutto. Questo comportamento garantisce che la reimpostazione delle regole non provochi uno scenario di blocco dell'accesso dell'amministratore.

Conclusione

Durante questo tutorial, hai imparato come proteggere il tuo firewall Linux con le regole di iptables e come configurare le esenzioni.

Alcuni amministratori Linux potrebbero obiettare che iptables non è aggiornato per configurare il firewall Linux. Ma molte applicazioni si basano ancora su iptables, il che potrebbe significare che rimarrà un pilastro per molti altri anni.

Cosa ne pensi dell'utilizzo di regole iptables persistenti? Prenderai in considerazione l'implementazione o passerai a opzioni più recenti come il firewall semplice (UFW)?


Linux
  1. Come svuotare le regole di iptables

  2. Come svuotare le regole di iptables

  3. Come proteggere il tuo server Ubuntu con CSF Firewall

  4. Come verificare se iptables è in esecuzione o il firewall è attivato

  5. Come controllare la password con Linux?

Proteggi la tua rete Linux con firewall-cmd

Come proteggere i server Linux con SE Linux

Come configurare un firewall con GUFW su Linux

Come configurare il firewall con UFW su Ubuntu Linux

Esercitazione sul firewall di Linux:tabelle IPTables, catene, nozioni di base sulle regole

Come configurare un firewall sul tuo server Linux