Passa al contenuto principale

GUIDA DEFINITIVA: Configurazione del tuo server per una consegna email affidabile. PARTE I: Firewall

· 10 minuti di lettura
Customer Care Engineer

email-server-linux-firewall-configuration-smtp-imap-setup-guide

informazioni

Il firewall è un software (o un dispositivo hardware-software) che controlla quali connessioni al server sono consentite e quali vengono bloccate. Nella stragrande maggioranza delle moderne distribuzioni server Linux, una qualche forma di firewall è disponibile fin da subito.

La consegna affidabile di email al destinatario dipende non solo dal server di posta stesso, ma anche dalla corretta configurazione dei record DNS e del firewall. Se qualcosa non va con questi, è molto probabile che i tuoi messaggi finiscano nella cartella Spam o non vengano consegnati affatto.

Questo articolo delinea i passaggi chiave che ti consentiranno di ottenere una consegna quasi al 100% affidabile dei messaggi inviati dal tuo server. Nella Parte 1, analizzeremo in dettaglio i possibili problemi relativi al firewall; nella Parte 2, troverai le istruzioni per la configurazione dei record DNS.

Le informazioni contenute in questo articolo si applicano solo ai server di posta in esecuzione su distribuzioni Linux. Vengono utilizzati come esempi Debian 12 e Rocky Linux 8.10 con il pannello di controllo FASTPANEL.

Prerequisiti

Passo 1. Installare gli strumenti diagnostici

Per controllare i record e le porte, avrai bisogno di:

  • dig - per analizzare i record DNS

  • lsof - per controllare lo stato del server di posta

  • netcat - per controllare la disponibilità delle porte

  • whois - per controllare il provider DNS corrente

Installazione su Debian/Ubuntu:

sudo apt update && sudo apt install -y bind9-dnsutils netcat-openbsd lsof whois

CentOS/AlmaLinux/Rocky Linux:

sudo yum install -y bind-utils nmap-ncat lsof whois

Disponibilità delle porte di posta

informazioni

Una porta è un identificatore numerico utilizzato per indirizzare diversi servizi su un server. Ogni servizio o applicazione è in ascolto sulla propria porta per scambiare dati sulla rete (ad esempio, HTTP utilizza la porta 80, e SMTP utilizza la porta 25).

Per eseguire tutti i passaggi seguenti, connettiti al tuo server tramite SSH utilizzando le credenziali di utente root o utilizza sudo quando esegui i comandi, come mostrato negli esempi. Puoi imparare come connetterti a un server tramite SSH nel nostro articolo SSH.

Passo 2. Controllare lo stato del server di posta

Prima di verificare se le porte sono raggiungibili sulla rete, assicurati innanzitutto che i server di posta siano in esecuzione e funzionino correttamente. La posta in uscita è solitamente gestita da Exim o Postfix, e la posta in arrivo da Dovecot.

Per verificare che siano in esecuzione, utilizza i comandi:

sudo lsof -i:25
sudo lsof -i:143

Se i servizi sono in esecuzione, otterrai un output simile al seguente:

Porta 25:

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
exim    839 exim    4u  IPv6 778199358      0t0  TCP *:smtp (LISTEN)
exim    839 exim    5u  IPv4 778199359      0t0  TCP *:smtp (LISTEN)

Se il tuo server utilizza un server SMTP diverso, ad esempio Postfix, vedrai il suo nome esatto al posto di exim nella prima colonna. Se necessario, usa quel nome nei comandi successivi.

Porta 143:

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
dovecot 859 root   39u  IPv4 778204692      0t0  TCP *:imap (LISTEN)
dovecot 859 root   40u  IPv6 778204693      0t0  TCP *:imap (LISTEN)

Ciò significa che tutto è a posto e puoi procedere al passaggio successivo.

Se i servizi di posta non sono in esecuzione, otterrai un output vuoto:

~ sudo lsof -i:25
~
~ sudo lsof -i:143
~

In questo caso, c'è qualcosa che non va e i servizi di posta non sono disponibili. Puoi provare ad avviarle manualmente e poi controllare il loro stato:

Debian/Ubuntu:

systemctl restart exim4 dovecot
systemctl status exim4
systemctl status dovecot

CentOS/AlmaLinux/Rocky Linux:

systemctl restart exim dovecot
systemctl status exim
systemctl status dovecot

Nello stato di esecuzione, lo stato del servizio sarà simile a:

Exim:

● exim.service - Exim Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/exim.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2025-11-02 16:38:57 UTC; 57min ago
 Main PID: 839 (exim)
    Tasks: 1
   Memory: 11.0M
   CGroup: /system.slice/exim.service
           └─839 /usr/sbin/exim -bd -q1h

Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.

Dovecot:

● dovecot.service - Dovecot IMAP/POP3 email server
   Loaded: loaded (/usr/lib/systemd/system/dovecot.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2025-11-02 16:38:58 UTC; 58min ago
     Docs: man:dovecot(1)
           https://doc.dovecot.org/
 Main PID: 859 (dovecot)
    Tasks: 5
   Memory: 9.5M
   CGroup: /system.slice/dovecot.service
           ├─ 859 /usr/sbin/dovecot -F
           ├─ 880 dovecot/anvil
           ├─ 881 dovecot/log
           ├─ 882 dovecot/config
           └─1729 dovecot/stats

In questo caso, tutto è a posto e puoi passare al passaggio successivo.

Se qualcosa non va con i servizi, vedrai un output simile a questo:

Exim:

● exim.service - Exim Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/exim.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since Sun 2025-11-02 17:38:44 UTC; 3s ago
  Process: 839 ExecStart=/usr/sbin/exim -bd -q${QUEUE} (code=exited, status=0/SUCCESS)
 Main PID: 839 (code=exited, status=0/SUCCESS)

Dovecot:

● dovecot.service - Dovecot IMAP/POP3 email server
   Loaded: loaded (/usr/lib/systemd/system/dovecot.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since Sun 2025-11-02 17:39:32 UTC; 3s ago
     Docs: man:dovecot(1)
           https://doc.dovecot.org/
  Process: 2278 ExecStop=/usr/bin/doveadm stop (code=exited, status=0/SUCCESS)
  Process: 859 ExecStart=/usr/sbin/dovecot -F (code=exited, status=0/SUCCESS)
 Main PID: 859 (code=exited, status=0/SUCCESS)

Ci sono molte possibili ragioni per cui i servizi potrebbero non essere disponibili (errori nei file di configurazione, file di log cancellati accidentalmente, mancanza di spazio libero sul disco del server e molto altro). Questi aspetti sono al di fuori dello scopo di questo articolo.

Se incontri questo problema e desideri investigarlo da solo, ti consigliamo il nostro articolo su come lavorare con il journal di sistema. Oppure contatta il team di supporto del tuo provider di hosting per assistenza. Su kodu.cloud lavoriamo 24 ore su 24, 7 giorni su 7 e rispondiamo alle richieste entro pochi minuti.

Passo 3. Verifica della disponibilità delle porte di posta dalla rete globale

Affinché la posta funzioni correttamente, le seguenti porte TCP devono essere accessibili sulla rete:

  • 25, 465, 587 - per l'invio di posta (SMTP)

  • 143, 993 - per la ricezione di posta (IMAP)

Puoi verificarne la disponibilità utilizzando netcat:

nc -vz 1.2.3.4 25

Sostituisci 1.2.3.4 con l'indirizzo IP effettivo del tuo server.

Se la porta è aperta, otterrai la seguente risposta:

Debian/Ubuntu:

Connection to 1.2.3.4 25 port [tcp/smtp] succeeded!

CentOS/AlmaLinux/Rocky Linux:

Ncat: Version 7.92 ( https://nmap.org/ncat )
Ncat: Connected to 1.2.3.4:25.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.

Se la porta è chiusa, la risposta sarà la seguente:

Debian/Ubuntu:

nc: connect to 1.2.3.4 port 25 (tcp) failed: Connection refused

CentOS/AlmaLinux/Rocky Linux:

Ncat: Version 7.92 ( https://nmap.org/ncat )
Ncat: Connection refused.

Esegui questo comando per tutte le porte elencate all'inizio di questa sezione. Se sono tutte disponibili, procedi alla seconda parte di questo articolo. In caso contrario, vai al Passo 4 per risolvere il problema.

Passo 4. Apertura dell'accesso (opzionale)

Molto spesso, i server utilizzano iptables o UFW come firewall per proteggersi da connessioni indesiderate. Esegui il comando:

sudo ufw status

Se ricevi la seguente risposta:

-bash: ufw: command not found

significa che viene utilizzato iptables. Se, invece, l'output inizia con:

Status: active

Significa che viene utilizzato UFW.

Vai alla sottosezione pertinente di questo passaggio in base al firewall in uso.

warning

Esistono altri software per la gestione del firewall di sistema in Linux (nftables, firewalld e altri). Questi non saranno trattati in questo articolo per non aumentarne la dimensione.

Iptables

warning

In questa sezione, tutti gli esempi si applicano solo a IPv4. Se il tuo server dispone di un indirizzo IPv6 e hai bisogno che anche le porte di posta siano disponibili tramite IPv6, ripeti ulteriormente tutti i comandi utilizzando ip6tables invece di iptables.

Per visualizzare tutte le regole correnti, esegui:

sudo iptables -L -v -n --line-numbers

L'output potrebbe differire a seconda dell'insieme di regole aggiunte sul server. Per impostazione predefinita, non ci sono regole, ma a seconda della configurazione dell'hosting o del sistema operativo, alcune configurazioni potrebbero essere già state effettuate. Consideriamo due casi principali che si incontrano spesso quando si configura un server di posta.

  1. Politica "Tutto ciò che non è vietato è consentito" (policy ACCEPT)

In questo caso, il firewall, per impostazione predefinita, consente tutto il traffico finché non viene creata una regola che lo blocca esplicitamente. Questa policy è solitamente utilizzata per impostazione predefinita.

Di seguito è riportato un esempio di un insieme di regole in cui SSH e le porte di posta sono bloccate:

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 51 5637 DROP 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp multiport dports 22
2 0 0 DROP 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp multiport dports 25,143,993,587,465

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 DROP 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp multiport dports 25,143,993,587,465

In questo esempio:

  • Policy ACCEPT definisce il comportamento predefinito: tutte le connessioni sono consentite a meno che non sia specificato diversamente.

  • Chain INPUT (connessioni in entrata): le nuove connessioni alla porta 22 (SSH) e a tutte le porte di posta standard (SMTP: 25, 465, 587; IMAP: 143; IMAPS: 993) sono bloccate.

  • Chain OUTPUT (connessioni in uscita): i pacchetti in uscita verso le stesse porte sono bloccati.

Il numero della regola è mostrato all'inizio della riga (num). Se è necessario eliminare, ad esempio, la regola che blocca le porte di posta nella catena INPUT (numero di regola 2), il comando sarà:

sudo iptables -D INPUT 2

Qui:

  • -D - è il comando per eliminare una regola.

  • INPUT è la catena da cui viene eliminata la regola (in questo caso, traffico in entrata).

  • 2 è il numero di riga in cui si trova la regola che si desidera eliminare.

Analogamente, per rimuovere il blocco delle porte in uscita da questo esempio, è necessario eseguire:

sudo iptables -D OUTPUT 1
warning

I numeri di riga nell'output di iptables -L -v -n --line-numbers possono cambiare se si aggiungono o eliminano altre regole. Pertanto, se si aggiungono nuove regole, i numeri di riga potrebbero spostarsi. Per evitare errori, controllare sempre i numeri di riga correnti prima di eliminare una regola.

Dopodiché, per assicurarsi che tutto sia corretto, riesegui il comando:

iptables -L -v -n --line-numbers

L'output non dovrebbe contenere regole che bloccano il funzionamento delle porte di posta:

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 51 5637 DROP 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp multiport dports 22

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination

Se le regole sono ancora presenti, controllare la correttezza dei comandi inseriti e dei numeri di riga.

Dopo aver modificato le regole del firewall, assicurati di salvare le modifiche; altrimenti verranno perse dopo un riavvio. Per salvare le regole iptables correnti, esegui:

Debian/Ubuntu:

iptables-save > /etc/iptables/rules.v4

CentOS/AlmaLinux/Rocky Linux:

iptables-save > /etc/sysconfig/iptables

Successivamente, testa nuovamente la disponibilità delle porte di posta, come descritto nel Passo 3. Se sono ancora non disponibili, procedi al Passo 5. Se tutto è in ordine, procedi alla seconda parte di questo articolo.

2. Politica "Blocca tutto ciò che non è esplicitamente consentito" (policy DROP)

Questo tipo di configurazione è molto più restrittivo. Tutte le porte e i protocolli sono bloccati per impostazione predefinita, e solo regole esplicite di autorizzazione per porte specifiche lasciano passare il traffico. Questo è un approccio più sicuro e raccomandato per i server, specialmente se si desidera ridurre al minimo i rischi.

Un esempio di regole per una tale configurazione:

Chain INPUT (policy DROP 306 packets, 17962 bytes)
num pkts bytes target prot opt in out source destination
1 92 12474 ACCEPT 0 -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 466 32947 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination

Chain OUTPUT (policy DROP 197 packets, 29192 bytes)
num pkts bytes target prot opt in out source destination
1 44 10332 ACCEPT 0 -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED

In questo esempio:

  • Chain INPUT (connessioni in entrata): la policy è DROP, ovvero tutti i pacchetti sono bloccati per impostazione predefinita, ad eccezione di quelli per cui esistono regole di autorizzazione.

Regola 1: ACCEPT state RELATED,ESTABLISHED - consente pacchetti in entrata correlati a connessioni esistenti o associati ad esse. Questo è importante per consentire al server di ricevere correttamente risposte a connessioni in uscita (ad esempio, SSH, posta, query DNS). Regola 2: ACCEPT tcp dpt:22 - consente nuove connessioni in entrata sulla porta 22 (SSH).

  • Chain OUTPUT (connessioni in uscita): la policy è DROP, ovvero tutti i pacchetti in uscita sono bloccati per impostazione predefinita.

Regola 1: ACCEPT state RELATED,ESTABLISHED - consente pacchetti in uscita correlati a connessioni esistenti. Ciò consente al server di rispondere alle richieste dei client (ad esempio, connessioni SSH, di posta) e di mantenere una connessione stabile.

Quindi vediamo che non ci sono regole di autorizzazione per le porte di posta. Per aggiungerle, esegui i seguenti comandi:

sudo iptables -A INPUT -p tcp -m multiport --dports 25,465,587,143,993 -m state --state NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp -m multiport --dports 25,465,587,143,993 -m state --state NEW,ESTABLISHED -j ACCEPT

Successivamente, salva le regole:

Debian/Ubuntu:

iptables-save > /etc/iptables/rules.v4

CentOS/AlmaLinux/Rocky Linux:

iptables-save > /etc/sysconfig/iptables

Quindi testa nuovamente la disponibilità delle porte di posta, come descritto nel Passo 3. Se sono ancora non disponibili, procedi al Passo 5. Se tutto è in ordine, procedi alla seconda parte di questo articolo.

UFW (Uncomplicated Firewall)

Su alcuni server, viene utilizzato UFW al posto di iptables: un'interfaccia semplificata per la configurazione del firewall. È adatto per la configurazione di base di un server di posta ed è spesso presente su Ubuntu e Debian.

Per vedere se UFW è abilitato e quali regole sono attive, esegui:

sudo ufw status verbose

Esempio di output:

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing)
New profiles: skip

Qui:

  • Default: deny (incoming) - per impostazione predefinita, tutte le connessioni in entrata sono bloccate.

  • Default: allow (outgoing) - per impostazione predefinita, tutte le connessioni in uscita sono consentite.

Affinché il server di posta funzioni correttamente, è necessario aprire le porte standard. Esegui i seguenti comandi in sequenza:

sudo ufw allow 25/tcp
sudo ufw allow 465/tcp
sudo ufw allow 587/tcp
sudo ufw allow 143/tcp
sudo ufw allow 993/tcp

Se hai anche restrizioni in uscita, devi consentire le porte SMTP per la posta in uscita:

sudo ufw allow out 25/tcp
sudo ufw allow out 465/tcp
sudo ufw allow out 587/tcp

Dopo aver aggiunto le regole, puoi controllarle nuovamente:

sudo ufw status numbered

Vedrai un elenco di regole con numeri. Se è necessario eliminare una regola, utilizzare il numero dall'output:

sudo ufw delete 3

In UFW, le regole vengono salvate automaticamente e rimarranno in vigore dopo un riavvio.

Quindi testa nuovamente la disponibilità delle porte di posta, come descritto nel Passo 3. Se sono ancora non disponibili, procedi al Passo 5. Se tutto è in ordine, procedi alla seconda parte di questo articolo.

Passo 5. Il firewall è configurato correttamente, ma le porte di posta sono ancora non disponibili (opzionale)

Tale comportamento indica che le porte di posta sono bloccate non a livello del tuo server, ma sull'apparecchiatura del tuo provider di hosting. In questo caso, crea un ticket di supporto e chiedi loro di sbloccare queste porte per il tuo server. Se ciò non è possibile, l'unica soluzione sarà cambiare provider di hosting.

Su kodu.cloud non limitiamo in alcun modo il funzionamento delle porte di posta. Le nostre regole vietano gli invii di massa, ma per i clienti in buona fede l'email è disponibile per intero. Non è nemmeno necessario configurare un server di posta, poiché a tutti i nostri clienti viene fornito accesso gratuito al pannello di controllo FASTPANEL con licenza estesa. Ordina un server con il pannello di controllo e inizia a utilizzare la posta sul tuo dominio in pochi minuti.

I passaggi successivi per una corretta configurazione dei record DNS saranno trattati nella seconda parte di questo articolo.