Tipologie di domini mail

Questa parte del tutorial è abbastanza noiosa ma al contempo molto importante. Non saltatela. La maggior parte dei problemi che i lettori hanno con i loro server di posta provengono dal fraintendere come si differenziano i vari tipi di domini mail. In questa parte non c’è niente da fare sul vostro server. Quindi reclinate lo schienale della sedia, rilassatevi ed assicuratevi di leggere e capire in toto questa pagina. Vi farà risparmiare delle frustrazioni.

Postfix è un componente software che parla SMTP e manda e riceve mail da e verso internet. Distingue tre tipi di domini:

  1. Domini locali
  2. Domini di posta virtuali
  3. Domini alias virtuali

Vediamoli nel dettaglio.

Domini locali

Nei casi più semplici Postfix usa un dominio locale ed utenti locali. “Locale” qui è riferito al server. Un utente locale è un normale utente di sistema – quelli elencati nel file /etc/passwd. Ogni utente di sistema potrà ricevere mail da qualsiasi dominio locale. Poniamo che abbiate detto a Postifix che il suo dominio locale è “example.org” ed avete un utente di sistema chiamato “john”. Postifx accetterà mail per john@exmple.org e le salverà in /var/mail/john. Questa può sembrare una soluzione accettabile ma ha degli svantaggi:

  1. Dovete creare un utente di sistema per ogni utente che deve ricevere mail. Ogni utente di sistema è un rischio per la sicurezza perché può permettere login shell. Se un utente sceglie una password debole essenzialmente state invitando degli aggressori a danneggiare il vostro server.
  2. Diventa inattuabile se volete ospitare dieci mila account mail.
  3. Postfix non riesce a distinguere i domini locali. Se avete tre domini locali “example.org”, “example.com” e “example.net”, tutti questi indirizzi mail portano alla stessa mailbox: john@example.org, john@example.com and john@example.net. Quindi non potete usare domini differenti per scopi differenti.

Per dire a Postfix quali domini considerare locali bisogna elencarli nel parametro “mydestination” nel file di configurazione main.cf. Per esempio:

mydestination = example.org, example.com, example.net

La cosa più importante da tenere a mente è che non bisogna mai inserire un dominio virtuale in mydestination. Otterrete un warning nel vostro file di log e Postfix si comporterà in modo strano. Un dominio può avere solo uno scopo.

Tuttavia è abbastanza comune usare l’hostname del server come dominio locale. Se il vostro server si chiama “scully.example.com” potreste impostare “mydestination = scully.example.com”. Oppure semplicemente “mydestination = localhost” se volete usare “scully.example.com” come dominio virtuale.

Domini di posta virtuali

Questo è il tipo di domini che useremo di più. Un dominio di posta virtuale è usato per ricevere mail. Ma non dovete usare utenti di sistema (/etc/passwd) per specificare indirizzi mail validi come con i domini locali. Invece potete dire direttamente a Postfix quali indirizzi considerare validi. Postsfix fornisce vari modi per ottenere questa informazione. Potete usare file di testo o dirgli di prendere questa informazione da un database. Il principio è sempre quello.

Consideriamo la seguente tabella che mostra quali indirizzi abbiamo e la loro posizione sul disco:

Utente VirtualePercorso della mailbox virtuale su disco
john@example.org/var/vmail/example.org/john/Maildir
jack@example.org/var/vmail/example.org/jack/Maildir
jack@example.com/var/vmail/example.com/jack/Maildir

Abbiamo due domini: example.org e example.com. Per prima cosa dobbiamo dire a Postfix che siamo pronti a ricevere mail per questi domini. Questo si ottiene impostando

virtual_mailbox_domains = example.org, example.com

nella configurazione di Postfix. Poi dobbiamo dire a Postfix per quali indirizzi mail vogliamo ricevere la posta e dove salvare le mail ricevute su disco. Il corrispondente file di testo è del tipo:

john@example.org /var/vmail/example.org/john/Maildir
jack@example.org /var/vmail/example.org/jack/Maildir
jack@example.com /var/vmail/example.com/jack/Maildir

Come potete vedere il file ha 2 voci per linea. L’indirizzo mail è specificato nella colonna di sinistra. Il percorso della mailbox su disco nella colonna di destra. Nella documentazione di Postfix potete anche trovare l’acronimo LHS che sta per “left hand side” – significa la colonna di sinistra. Ugualmente RHS è “right hand side” – la colonna di destra. Questo tipo di tabella a due colonne è moto comune quando si lavora con Postfix. E’ chiamato mapping.

Nell’esempio sopra ho fissato i domini virtuali nella configurazione di Postfix (“virtual_mailbox_domains = example.org, example.com”). Ovviamente con molti domini non è facile da gestire. Questo è il motivo per cui possiamo salvare questa informazione in altri posti come un database o un file di testo. Ma se Postfix si aspetta una mappatura con due colonne, come specifichiamo una lista di domini? Postfix si aspetta sempre due colonne – ma non gli interessa cosa mettiamo nella seconda colonna. Un file di testo contenente domini potrebbe essere questo:

example.org OK
example.com OK

“OK” non significa niente. Possiamo scrivere quello che vogliamo a patto che ci sia una seconda colonna.

In realtà non useremo file di testo – ma un database MySQL. Ma se decidete di usare un file di testo fate attenzione perché Postfix non può accedervi direttamente. Dovete compilare questi file usando il comando “postmap” su di essi. Esempio:

postmap /etc/postfix/virtual_mailbox_domains
postmap /etc/postfix/virtual_mailbox_users

Questo creerà altri file basati sui nomi sopra ma con il suffisso “.db”. Postfix non farà questa conversione automaticamente – questo va precisato, ma leggerà solo i file *.db. Quindi non dimenticatevi di lanciare postmap dopo aver modificato il file di mapping.

Per rendere note queste mappature a Postfix dovremmo aggiungere queste linee nel file di configurazione main.cf:

virtual_mailbox_domains = hash:/etc/postfix/virtual_mailbox_domains
virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox_users

(No, non usate il nome “.db” qui. Postfix aggiungerà il suffisso “.db” automaticamente.)

Siete ancora con me? Bene. Adesso dimentichiamoci dei file di testo. Vi ho promesso che avremmo salvato i nostri dati di controllo in un database MySQL. Cerchiamo di capire come funziona. Postifix si aspetta sempre una mappatura a due colonne come abbiamo visto sopra. Ma invece di mettere queste informazioni in file di testo, dobbiamo dire a Postfix dove trovare queste due colonne nel database. Questo si ottiene usando dei file di configurazione.

Esempio di file virtual_mailbox_maps.cf:

# Information on how to connect to your MySQL server
user = someone
password = some_password
hosts = 127.0.0.1
# The database name on the MySQL server
dbname = mailserver
# The SQL query string
query = SELECT mailbox_path FROM virtual_users WHERE email_address='%s'

Immaginate di avere una tabella di database per gli utenti virtuali con due colonne. La parte sinistra è la colonna “email_address” della tabella. La parte destra è la colonna “mailbox_path” della tabella. Come abbiamo fatto con i file di testo. Questa query SQL ottiene la parte destra (mailbox path) per un dato indirizzo mail (email_address). “%s” è una variabile per la parte sinistra ed è sostituita da Postfix ad ogni ricerca.

Notate che una ricerca deve tornare solo una riga dal database. Postfix deve conoscere in modo univoco qual è il percorso della mailbox di un dato utente. (In realtà ci sono altre mappature dove è consentito avere voci multiple della parte destra per ogni voce della parte sinistra – per esempio negli alias virtuali della prossima sezione.)

Per usare la configurazione sopra dobbiamo impostarla nel file main.cf di Postfix:

virtual_mailbox_maps = mysql:virtual_mailbox_maps.cf

Se trovate che questa mappatura non funziona come ci si aspetta, il comando “postmap -q” è vostro amico. Potete chiedere a Postfix qual è il valore della parte destra per un dato valore della parte sinistra. Diciamo che siamo interessati al mailbox_path per il valore “john@example.org” di email_address:

postmap -q john@example.org mysql:virtual_mailbox_maps.cf

Postfix lancerà la seguente query SQL con “john@example.org” come argomento:

SELECT mailbox_path FROM virtual_users WHERE email_address='john@example.org'

Il risultato sarà:

/var/vmail/example.org/john/Maildir

In questa guida ISPmail useremo una leggera variazione della query SQL:

query = SELECT 1 FROM virtual_users WHERE email='%s'

Postfix può salvare la posta in arrivo direttamente sul disco. Ma lasciamo che Postfix inoltri le mail a Dovecot che ha funzionalità aggiuntive. In realtà quindi non siamo interessati al percorso della mailbox. E’ sufficiente sapere se un indirizzo mail è valido. Otteniamo “1” come risultato, il che è abbastanza perché Postfix consideri valido l’indirizzo mail ed accetti la mail in arrivo per il destinatario.

Domini alias virtuali

In una grande organizzazione vi verrà chiesto di creare indirizzi mail che inoltrano la posta in arrivo ad altri indirizzi mail. Questi indirizzi di inoltro sono chiamati alias. Se diciamo a Postfix che un certo dominio è un dominio alias virtuale significa che tutti gli indirizzi mail di questo dominio sono alias che inoltrano la posta in arrivo ad altri indirizzi. La posta per questo dominio non è salvato su disco. Questo rende i domini alias virtuali decisamente poco flessibili. Sono sicuro che avrete bisogno di alias ma non vorrete sprecare un intero dominio per questo scopo. Per questo motivo non useremo questo tipo di domini nel nostro server di posta.

Fortunatamente indirizzi mailbox e indirizzi alias possono essere mescolati nello stesso dominio. Per esempio potete ricevere una mail per john@example.org nel vostro disco e creare un alias webmaster@example.org che inoltri tutta la posta a John. In questo caso indicheremo “example.org” come dominio mailbox virtuale e non un dominio alias virtuale. Gli alias funzionano con domini mailbox.

Come al solito abbiamo bisogno di una mappatura (a due colonne) per questi indirizzi di inoltro. E la sintassi è molto semplice:

alias-address1 recipient-address1
alias-address2 recipient-address2
alias-address3 recipient-address3

Semplice, no? Questa è una tipica mappatura che definiamo come “virtual_alias_maps”” in Postfix. Questa mappatura è più flessibile. Supponiamo di voler inoltrare un indirizzo alias a destinatari multipli. Postfix supporta mappature che ritornano destinazioni multiple della parte destra (a chi inoltrare) per un sorgente della parte sinistra (il destinatario originale). Qualche esempio:

Esempio 1: reindirizza tutta la posta per john@example.org a jeff@example.com

john@example.org   jeff@example.com

Questo esempio è semplice. Abbiamo la sorgente (john@example.org) e la destinazione (jeff@example.com) dell’inoltro. John non riceverà mail la mail.

Esempio 2 : reindirizza tutta la posta per john@example.org a jeff@example.com ma riceve anche una copia

john@example.org   john@example.org
john@example.org   jeff@example.com

Questo è un po’ complesso. Se Postfix interroga questa mappatura per john@example.org otterrà due risultati. (Postfix è abbastanza intelligente da non creare un loop ma di capire che vogliamo una copia della mail.) Questo è lo stesso di una riga con destinatari separati da virgole:

john@example.org   john@example.org,jeff@example.com

Esempio 3: reindirizza tutta la posta di ogni utente del dominio example.org a joe@example.com (“catch-all”)

@example.org   joe@example.com

Questo è chiamato alias catch-all. Accetta la posta di ogni utente del dominio example.org e la inoltra a joe@example.com. Se jill@example.org non è un utente virtuale espicitamente definito allora la sua posta sarà catturata dall’alias catch-all e inoltrata a joe@example.com.

Attenzione
Gli alias catch-all catturano spam. Molto spam. Possono sembrare comodi perché inoltrano tutta la posta ad una persona senza dover creare alias. Ma gli spammer spesso tirano ad indovinare gli indirizzi mail di un dominio noto. E con una alias catch-all riceverete spam per tutti questi indirizzi mail indovinati. Evitateli e piuttosto definite gli indirizzi mail esistenti. Anche se significa maggior lavoro.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *