Verificare la configurazione del firewall e le impostazioni di rete (Linux)

In questo articolo trovi i comandi più importanti di cui hai bisogno per verificare la configurazione di rete e la configurazione del firewall.

Eseguire la scansione delle porte

Per eseguire una scansione delle porte, puoi utilizzare il programma netcat. Netcat (nc), è uno strumento a riga di comando universale. Può essere utilizzato nel terminale o in script per la comunicazione su connessioni di rete TCP e UDP (protocollo Internet versione 4 e versione 6).

Di solito, il programma netcat fa parte di ogni installazione di Ubuntu, ma, se necessario, può essere installato utilizzando il pacchetto netcat-openbsd.

Per installare netcat su un server che esegue la distribuzione CentOS, immetti il seguente comando:

CentOS 7

[root@localhost ~]# yum install nc.x86_64
CentOS 8

[root@localhost ~]# dnf install nmap

 

Per eseguire una scansione delle porte con netcat, immetti il seguente comando:

nc -v INDIRIZZO-IP-DEL-SERVER NUMERO-DELLA-PORTA
Esempio:

[root@localhost ~]# nc -v 192.168.1.1 22

Verificare i servizi di rete

Per visualizzare una lista dei servizi di rete in ascolto, dei deamon e dei programmi, immetti il seguente comando:

netstat -tulpen

Successivamente puoi verificare se i relativi servizi di rete, i deamons e i programmi sono attivi e in ascolto sulla porta corretta. Inoltre, dopo aver inserito il comando, puoi determinare se la porta necessaria deve essere abilitata.

Esempio:

[root@localhost ~]# netstat -tulpen
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode      PID/Program name
tcp        0      0 0.0.0.0:5355            0.0.0.0:*               LISTEN      193        27635      1368/systemd-resolv
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      0          29477      1582/sshd
tcp6       0      0 :::5355                 :::*                    LISTEN      193        27638      1368/systemd-resolv
tcp6       0      0 :::22                   :::*                    LISTEN      0          29479      1582/sshd
udp        0      0 0.0.0.0:5355            0.0.0.0:*                           193        27634      1368/systemd-resolv
udp        0      0 127.0.0.53:53           0.0.0.0:*                           193        27640      1368/systemd-resolv
udp        0      0 0.0.0.0:68              0.0.0.0:*                           0          27510      1314/dhclient
udp        0      0 127.0.0.1:323           0.0.0.0:*                           0          25505      1174/chronyd
udp6       0      0 :::5355                 :::*                                193        27637      1368/systemd-resolv
udp6       0      0 ::1:323                 :::*                                0          25506      1174/chronyd

Verificare la configurazione di rete

Per visualizzare le interfacce configurate, immetti il comando ip addr. Dopo l'immissione del comando, viene visualizzato lo stato di ogni interfaccia:

Esempio:

root@localhost:~# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:50:56:00:f1:5b brd ff:ff:ff:ff:ff:ff
    inet 217.160.173.123/32 brd 217.160.173.123 scope global ens192
       valid_lft forever preferred_lft forever
    inet6 fe80::250:56ff:fe00:f15b/64 scope link
       valid_lft forever preferred_lft forever

Puoi riattivare un'interfaccia disattivata immettendo il seguente comando:

sudo ifup NOME_DELLA_INTERFACCIA


Esempio:

[root@localhost ~]# sudo ifup ens192
Se questo comando fallisce, l'interfaccia può trovarsi in uno stato che è sconosciuto allo script di comando. In questo caso, immetti lo stesso comando con il parametro --force:

sudo ifup --force NOME_DELLA_INTERFACCIA
Esempio:

[root@localhost ~]# sudo ifup --force ens192

Successivamente verifica se è possibile stabilire una connessione di rete criptata al tuo server. Se questo non è possibile, verifica la configurazione di rete del server.

Per farlo, apri i file di configurazione elencati di seguito con l'editor vi. Verifica e modifica le impostazioni e successivamente riavvia la rete per applicare le modifiche alla configurazione della rete, se necessario:

Ubuntu

/etc/network/interfaces

CentOS 7 e CentOS 8

/etc/sysconfig/network-scripts/


Per riavviare la rete, immetti il seguente comando o i seguenti comandi:

Ubuntu

[root@localhost ~]# /etc/init.d/networking restart 
CentOS 7

[root@localhost ~]# /etc/init.d/network restart
CentOS 8

[root@localhost ~]# nmcli networking off
[root@localhost ~]# nmcli networking on

Visualizzare e configurare la tabella di routing IP con route

Con il programma route puoi visualizzare e configurare la tabella di routing IP. Per farlo, immetti il seguente comando:

[root@localhost ~]# route

Dopo l'immissione del comando vengono visualizzate, ad esempio, le seguenti informazioni:

[root@localhost home]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    100    0        0 ens192
gateway         0.0.0.0         255.255.255.255 UH    100    0        0 ens192
169.254.169.254 gateway         255.255.255.255 UGH   100    0        0 ens192
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
localhost       0.0.0.0         255.255.255.255 UH    100    0        0 ens192

Verificare la configurazione del firewall (CentOS 6, CentOS 7 e Ubuntu)

Il kernel Linux include di default un filtro di pacchetti fornito da moduli del pacchetto software Netfilter. Per configurare il filtro di pacchetti, è necessario un programma aggiuntivo.

Come amministratore, puoi utilizzare il programma iptables per creare, modificare o eliminare le regole. iptables è un programma per la configurazione delle tabelle (tables) fornite dal firewall nel kernel Linux.

Le impostazioni effettuate con iptables vengono perse al riavvio del server. Puoi utilizzare gli strumenti iptables-save e iptables-restore per salvare e ripristinare le regole create.

Importante:

Ogni volta che apporti modifiche a iptables, assicurati che le porte necessarie affinché il server sia raggiungibile, ad es. la porta 22, non siano bloccate.

Con uno script init questo viene eseguito automaticamente durante il processo di avvio. iptables è limitato al protocollo IPv4. Per gli altri protocolli ci sono varianti corrispondenti come ip6tables per IPv6 o ebtables per i pacchetti Ethernet, che sono anche inclusi nel modulo del kernel.

Su Linux, di solito iptables è preinstallato. iptables richiede privilegi di sistema avanzati e può essere eseguito solo come root o con diritti di amministratore.
La verifica dei pacchetti e le regole di filtro da creare con iptables hanno una struttura a tre livelli: ci sono tabelle (tables), catene (chains) e regole (rules).

Le tabelle caricate con il programma e precedentemente generate dal kernel contengono catene di regole che definiscono come devono essere gestiti i pacchetti di dati in entrata e in uscita. Questi pacchetti vengono passati da una regola all'altra all'interno di una catena. Ogni regola può attivare un'azione ( jump target ) o passare ad un'altra catena (go to chain).

Possono essere attivate le seguenti azioni:

ACCEPT: il pacchetto è accettato.

DROP: il pacchetto viene scartato.

QUEUE: sposta il pacchetto nei processi utente; richiede un intermediario (queue handler) che inoltri i pacchetti a un'applicazione.

RETURN: il pacchetto viene restituito alla catena precedente, se si tratta di una catena definita dall'utente. Nelle catene standard, viene eseguita la regola (policy) della catena. Senza configurazione, viene eseguita di default l'azione ACCEPT.

Tabelle (tables)

Nelle tabelle, le regole di filtro vengono combinate in gruppi. Questi gruppi sono divisi in base al compito di base. Ci sono quattro importanti tabelle in cui è possibile memorizzare le regole di filtro:

filter: la tabella standard.

nat: viene utilizzato per modificare i pacchetti che stabiliscono una nuova connessione e vengono utilizzati per la traduzione degli indirizzi di rete (NAT, Network Address Translation).

mangle: questa tabella è solitamente utilizzata per alcuni tipi di manipolazione dei pacchetti.

raw: questa tabella viene solitamente utilizzata per definire le eccezioni di Connection Tracking in combinazione con il target NOTRACK.

Catene (chains)

Ogni tabella contiene diverse catene. Le catene determinano quando un pacchetto deve essere verificato. Sono disponibili le seguenti catene:

Catena Tabella Descrizione
INPUT filter, mangle si applica a tutti i pacchetti diretti ad un processo locale.
OUTPUT filter, nat, mangle, raw si applica a tutti i pacchetti provenienti da un processo locale.
FORWARD filter, mangle si applica a tutti i pacchetti che vengono instradati.
PREROUTING nat, mangle, raw si applica a tutti i pacchetti prima che vengano instradati.
POSTROUTING nat, mangle si applica a tutti i pacchetti dopo che sono stati instradati.

I set di regole di filtro sono definiti nelle tabelle e nelle catene. Per farlo, è necessario accedere a iptables nel Terminal.

Sulla pagina man puoi trovare una panoramica dettagliata di come funziona il software di filtraggio dei pacchetti. Puoi aprire la pagina con il seguente comando:

[root@localhost ~]# man iptables
Inoltre, puoi trovare maggiori informazioni sulla pagina seguente: http://www.netfilter.org

Per visualizzare come si comporta iptables di default, immetti il seguente comando:

[root@localhost ~]# iptables -L

Per verificare quali regole di filtro sono già state memorizzate, immetti i seguenti comandi:

[root@localhost ~]# sudo iptables -t filter –L

[root@localhost ~]# sudo iptables -t nat –L

[root@localhost ~]# sudo iptables -t mangle -L

[root@localhost ~]# sudo iptables -t raw –L
Per eliminare tutte le regole, immetti il seguente comando:

[root@localhost ~]# iptables –F

Altri comandi importanti

Di seguito trovi elencati altri comandi importanti per iptables:

- Creare una nuova catena:

sudo iptables -N NOME_DELLA_CATENA
Esempio:

[root@localhost ~]# sudo iptables -N Test


- Eliminare una catena:

sudo iptables -X NOME_DELLA_CATENA
Esempio:

[root@localhost ~]# sudo iptables -X Test


- Elencare le regole di una catena:

sudo iptables -L NOME_DELLA_CATENA


Esempio:

[root@localhost ~]# sudo iptables -L Test


- Eliminare le regole di una catena:

sudo iptables –F NOME_DELLA_CATENA
Esempio:

[root@localhost ~]# sudo iptables -F Test


- Definire una policy per una catena:

Nell'esempio seguente, il pacchetto viene accettato automaticamente quando le regole di filtro nella catena INPUT non si applicano.

[root@localhost ~]# sudo iptables -P INPUT ACCEPT


- Attaccare una nuova regola ad una catena selezionata:

sudo iptables -A NOME_DELLA_CATENA -s INDIRIZZO_IP -j DROP
Nell'esempio seguente, la regola che definisce di scartare i pacchetti di dati dall'indirizzo IP 217.160.172.48 viene aggiunta alla catena "test":

[root@localhost ~]# sudo iptables -A Test -s 217.160.172.48 -j DROP


- Eliminare una specifica regola in una catena selezionata:

sudo iptables -D NOME_DELLA_CATENA -s INDIRIZZO_IP -j DROP
Esempio:

[root@localhost ~]# sudo iptables -D Test -s 217.160.172.48 -j DROP


- Inserire una nuova regola in una posizione specifica nella catena:

sudo iptables -I NOME_DELLA_CATENA 1 -s INDIRIZZO_IP -j DROP
Nell'esempio seguente, la catena viene inserita nella posizione 1:

[root@localhost ~]# sudo iptables -I Test 1 -s 217.160.172.48 -j DROP


- Eliminare una regola di una catena selezionata specificandone la posizione:

sudo iptables -D NOME_DELLA_CATENA 1 
Esempio:

[root@localhost ~]# sudo iptables -D Test 1

Salvare i risultati

Per salvare le impostazioni effettuate con iptables in modo permanente in un file, immetti il seguente comando:

Ubuntu:

sudo iptables-save > /etc/iptables/rules.v4
CentOS:

iptables-save > /etc/sysconfig/iptables


Per caricare di nuovo il file per IPv4, immetti il seguente comando:

Debian/Ubuntu:

iptables-restore < /etc/iptables/rules.v4
CentOS:

iptables-restore < /etc/sysconfig/iptables


Per caricare le regole automaticamente, puoi utilizzare i seguenti metodi:

Ubuntu

Con iptables-persistent le regole del firewall vengono memorizzate nei file di configurazione su /etc/iptables/. Questi vengono caricati nuovamente all'avvio del server e quindi riattivati. A tal fine, le regole devono essere memorizzate nel file /etc/iptables/rules.v4 per IPv4.

Per utilizzare iptables-persistent, è necessario installare il seguente pacchetto:

apt-get install iptables-persistent


CentOS 7

Per memorizzare in modo permanente le regole di iptables, il servizio iptables-services deve essere installato:

yum install -y iptables-services
Per continuare ad usare iptables, il servizio firewalld deve essere disattivato:

systemctl stop firewalld
systemctl mask firewalld

Successivamente, il servizio deve essere abilitato:

systemctl enable iptables.service
systemctl -t service | grep iptables

Per IPv4, le regole vengono memorizzate nel file /etc/sysconfig/iptables.

Per salvare le regole attuali, può essere utilizzato anche il seguente script:

[root@localhost ~]# /usr/libexec/iptables/iptables.init save

Nota bene:

Dopo aver configurato iptables e aver salvato le regole in modo permanente, verifica che queste vengano caricate dopo il riavvio del server.

Puoi visualizzare le regole dopo il riavvio del server immettendo il seguente comando:

iptables -L
In alternativa, puoi immettere il seguente comando per verificare lo stato di ip-tables:

stato systemctl iptables.service

Verificare la configurazione del firewall (CentOS 8)

Di default, CentOS 8 imposta i firewall utilizzando l'infrastruttura nftables e utilizza nftables come backend standard.

Per impostazione predefinita, nftables non crea tabelle e catene come il suo predecessore iptables. Come amministratore, devi creare prima le tabelle e successivamente integrarle con catene, che si agganciano al kernel Linux come netfilter hook. Successivamente crei le regole appropriate per le catene.

Altre importanti differenze tra nftables e iptables sono:

  • Le tabelle e le catene sono completamente configurabili

  • Non c'è più distinzione tra matches e targets.

  • Puoi specificare più azioni in un'unica regola.

  • Migliore supporto per gli aggiornamenti dei set di regole dinamici.


Per maggiori informazioni sulle differenze tra iptables e nftables, consulta la pagina seguente (inglese):

https://wiki.nftables.org/wiki-nftables/index.php/Main_differences_with_iptables

Sintassi dei comandi

I comandi di base per tabelle, catene e regole sono sempre strutturati come segue:

nft <add|list|flush|delete> <table|chain|rule> <ulterioriopzioni>

Creare una tabella

Per creare una tabella e un set di regole, immetti il seguente comando:

[root@localhost ~]# nft add table inet meine_tabelle
nft list ruleset
table inet mia_tabella {
}

Per creare una catena, immetti il comando seguente. Quando crei una catena, è necessario specificare a quale tabella appartiene la catena. È inoltre necessario definire il tipo, il gancio (hook) e la priorità.

nft add chain inet mia_tabella mio_filtro_catena { type filter hook input priority 0 \; }

Nota bene:

Il backslash (\) è necessario affinché la shell non interpreti il punto e virgola come fine del comando.

Le catene possono essere create anche senza specificare un gancio (hook). Le catene che si creano senza specificare un hook sono equivalenti alle catene iptables definite dall'utente (personalizzate). Le regole possono utilizzare le indicazioni jump o goto per eseguire le regole nella catena. Questo è utile per separare logicamente le regole o per condividere un sottoinsieme di regole che altrimenti esisterebbero due volte.

Un'importante innovazione di nftables è il concetto di "families": nft fornisce una serie di famiglie di indirizzi per la creazione di regole. Le famiglie di indirizzi predefinite sono arp (ARP), bridge (precedentemente fornito da Ebtables), inet (include IPv4 e IPv6), ip (per IPv4), ip6 (per IPv6) e netdev. Tutte le tabelle correlate tra loro devono trovarsi nella stessa famiglia. Questo è importante soprattutto per generare tabelle e catene.

Per creare ad es. una regola per una catena, che permetta una connessione SSH, immetti il seguente comando:

[root@localhost ~]# nft add rule inet mia_tabella mio_filtro_catena tcp dport ssh accept
Esempio:

[root@localhost ~]# nft add rule inet mia_tabella mio_filtro_catena tcp dport ssh accept
L'eliminazione delle regole viene effettuata tramite gli handels delle regole. Per eliminare una regola, è necessario trovare l'handel della regola che si desidera eliminare. Esempio:

[root@localhost ~]#  nft --handle list ruleset
table inet mia_tabella { # handle 21
    chain mio_filtro_catena { # handle 1
    type filter hook input priority 0; policy accept;
    tcp dport http accept # handle 3
    tcp dport 1234 accept # handle 8
    tcp dport nfs accept # handle 7
    tcp dport ssh accept # handle 2
    }
}


Successivamente, usa l'handle per eliminare la regola. Per farlo, immetti il seguente comando:

nft delete rule [<famiglia>] <tabella> <catena> [handle <handle>]
Esempio:

[root@localhost ~]# nft delete rule inet mia_tabella mio_filtro_catena handle 8
[root@localhost ~]# nft --handle list ruleset
table inet mia_tabella { # handle 21
    chain mio_filtro_catena { # handle 1
    type filter hook input priority 0; policy accept;
    tcp dport http accept # handle 3
    tcp dport nfs accept # handle 7
    tcp dport ssh accept # handle 2
    }
}

Elencare le regole

Per elencare il contenuto di una tabella, immetti il seguente comando:

nft list tables [<famiglia>]
nft list table [<famiglia >] <name> [-n] [-a]
nft (add | delete | flush) table [<famiglia >] <name>

Per visualizzare tutte le regole in una tabella specifica, immetti il seguente comando:

[root@localhost ~]#  nft list table inet mia_tabella
table inet mia_tabella {
    chain mio_filtro_catena {
        type filter hook input priority 0; policy accept;
        tcp dport http accept
        tcp dport nfs accept
        tcp dport ssh accept
    }
}

Per visualizzare tutte le regole in una catena, immetti il seguente comando:

[root@localhost ~]#  nft list chain inet mia_tabella mia_altra_catena
table inet mia_tabella {
    chain mio_filtro_catena {
        udp dport 12345 log prefix "UDP-12345"
    }
}


Con il seguente comando, puoi salvare un set di regole:

nft list ruleset > /root/nftables.conf


Per creare un set di regole, puoi usare il seguente comando:

nft -f /root/nftables.conf


Per attivare il servizio systemd e far ripristinare le sue regole al riavvio del sistema, immetti il seguente comando:

systemctl enable nftables
nft list ruleset > /etc/sysconfig/nftables.conf

Puoi trovare maggiori informazioni su nftables sulla pagina seguente (inglese):

https://wiki.nftables.org/wiki-nftables/index.php/Main_Page