Home » Blog » Guide tecniche » Come creare un server mail Linux con iRedMail
Creare un server mail Linux con una comoda gestione web è sempre un’operazione rognosa e complessa. Immagina di dover installare e configurare i singoli servizi ogni volta.
Oggi il tempo è denaro più di ieri per cui per evitare situazioni come questa quasi sempre si ricorre all’utilizzo di servizi di email hosting già pronti, con il tipico pagamento per ogni casella di posta aggiuntiva.
Fortunatamente anche a questo c’è una soluzione per avere in pochi minuti un server mail personale in house. La soluzione si chiama iRedMail, un piccolo ma efficiente software che si occuperà da solo di installare e configurare su una macchina vergine tutti i servizi necessari ad un mail server che si rispetti.
In questa guida illustreremo passo passo come creare un mail server Linux con iRedMail su una macchina virtuale Ubuntu. Tutte le immagini sono tratte da mail server in produzione per cui per motivi di riservatezza abbiamo oscurato i nomi a dominio. Limitati a sostituirli con il tuo nelle varie interfacce.
Ricordiamo che la macchina virtuale (o dedicata) deve essere vergine, ovvero disporre del solo sistema operativo di base e SSH per la configurazione remota. Al resto penserà iRedMail.
Consigliamo inoltre di configurare una corretta politica di backup al termine delle operazioni. Per maggiori informazioni rimandiamo alla guida completa ai backup.
Indice dei Contenuti
Supponiamo di avere una VPS con indirizzo IP pubblico 88.88.88.88 e di voler realizzare il nostro server di posta Linux avente come dominio mailserver1.example.com.
Il primo passo è creare il sotto dominio mailserver1 sul file di zona DNS del dominio example.com. Dovrà essere un record di tipo A che punta all’indirizzo IP pubblico del server virtual:
mailserver1 10800 IN A 88.88.88.88
Fatto ciò occorre inserire un record TXT per la policy SPF anti-spam:
mailserver1 10800 IN TXT "v=spf1 ip4:88.88.88.88 ~all"
In questo modo quando sarà interpellato il mail server mailserver1.example.com per SPF, diremo che l’unico mail server autorizzato ad inviare posta per conto di questo dominio è quello con indirizzo IP 88.88.88.88.
Il reverse DNS è utilizzato dai mail server che riceveranno la posta come un ulteriore controllo anti-spam.
Si tratta di una risoluzione inversa del dominio: deve essere possibile risalire dall’indirizzo IP del server mail al suo dominio, in questo caso da 88.88.88.88
a mailserver1.example.com
.
Questa configurazione va fatta dall’ISP in quanto gestore dell’indirizzo IP. Alcuni fornitori di server, come Hetzner, permettono di configurare il reverse DNS direttamente dal pannello di gestione del server.
Dopo aver fatto accesso al server ed averlo aggiornato propriamente, modificare il file /etc/hosts
ed aggiungere mailserver1.example.com
come localhost di IPv4 e IPv6:
### Hetzner Online GmbH installimage # nameserver config # IPv4 127.0.0.1 mailserver1.example.com localhost.localdomain localhost 172.31.1.100 Ubuntu-1404-trusty-64-minimal # # IPv6 ::1 mailserver1.example.com ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters ff02::3 ip6-allhosts 2a01:4f8:c17:30c0::2 Ubuntu-1404-trusty-64-minimal
Sostituire il contenuto di /etc/hostname
con mailserver1.example.com
Riavviare il server
Dopo aver scaricato il pacchetto da iredmail.org ed averlo decompresso, avviare l’installer iRedMail.sh.
Accettare i parametri per /var/vmail
, Nginx
, MariaDB
ed inserire come dominio principale o uno fasullo che utilizzeremo solo per loggarci come admin del server, o uno che utilizzeremo davvero.
In questo caso scegliamo il secondo in quanto l’obiettivo primario è creare caselle di posta @example.com. Poi in seguito vedremo come aggiungere ulteriori domini.
Procedere con l’installazione di tutti i pacchetti tranne SOGo che non ci serve. Alla fine avremo un riepilogo come il seguente:
************************************************************************* ***************************** WARNING *********************************** ************************************************************************* * * * Below file contains sensitive infomation (username/password), please * * do remember to *MOVE* it to a safe place after installation. * * * * * /root/iRedMail-0.9.4/config * * ************************************************************************* ********************** Review your settings ***************************** ************************************************************************* * Storage base directory: /var/vmail * Mailboxes: /var/vmail/vmail1 * Daily backup of SQL/LDAP databases: /var/vmail/backup * Store mail accounts in: MariaDB * Web server: Nginx * First mail domain name: example.com * Mail domain admin: [email protected] * Additional components: iRedAdmin Roundcubemail Awstats Fail2ban
Dare il via ed attendere la fine. Ad installazione conclusa, riavviare il server.
Di default Postfix 2.x, il servizio SMTP, supporta sia IPv4 che IPv6 ma i filtri di GMAIL PTR per IPv6 creano rogne ed a volte rigettano le email o le marcano come SPAM. Per evitare questo problema, impostiamo il nostro mail server Linux per usare solo IPv4.
Per fare questo basta modificare il file /etc/postfix/main.cf
e settare inet_protocols
come segue:
inet_protocols = ipv4
Riavviare postfix:
/etc/init.d/postfix restart
Per evitare altre rogne con GMAIL visitare il sito https://postmaster.google.com e registrare il mail server seguendo il processo di convalida, ovvero l’inserimento di un record TXT per il sottodominio mailserver1.example.com
.
Se utilizzate servizi come mailgun, le email in ingresso verranno rifiutate in quanto inviate da indirizzi con lo stesso dominio ma sconosciuti. Si tratta di una protezione di Postfix.
Per risolvere il problema o si cambia approccio, ovvero le email devono essere inviate da indirizzi davvero esistenti mediante connessione SMTP con il server, oppure si disabilita la restrizione.
Per disabilitare la restrizione basta commentare tutte le corrispondenze della stringa smtpd_reject_unlisted_sender
nel file /etc/postfix/main.cf
#smtpd_reject_unlisted_sender = yes # Sender restrictions smtpd_sender_restrictions = reject_unknown_sender_domain reject_non_fqdn_sender #reject_unlisted_sender permit_mynetworks reject_sender_login_mismatch permit_sasl_authenticated check_sender_access pcre:/etc/postfix/sender_access.pcre
Per evitare reject improvvisi, disabilitare il greylisting modificando il file /opt/iredapd/settings.py
eliminando la dicitura greylisting
dal parametro plugins =
Riavviare il server
L’installazione di PHPMyAdmin su un server Ubuntu è un’operazione semplicissima:
apt-get install php-mbstring php-gettext phpmyadmin
Riavviare apache
Se si dovessero avere problemi ad accedere come root, accedere da riga di comando e creare un account alternativo dalla username admin:
CREATE USER 'admin'@'localhost' IDENTIFIED BY 'miapassword'; GRANT ALL ON *.* TO 'admin'@'localhost';
La password di root di MariaDB è possibile recuperarla all’interno del file /var/vmail/backup/backup_mysql.sh
Per accedere a PHPMyAdmin da browser occorre creare il link simbolico da /usr/share/phpmyadmin
a /var/www/phpmyadmin
per poi potervi accedere dalla URL http://mailserver1.example.com/phpmyadmin
Se si dovessero verificare problemi di compatibilità con PHP 7, occorre effettuare un upgrade manuale. A tal proposito ti invitiamo a leggere la guida su PHPMyAdmin e PHP 7.
Per configurare plugin come wp-mail per autenticarsi su porta 25 senza crittografia, modificare il file main.cf
di postfix come segue:
smtpd_sasl_auth_enable = yes smtpd_tls_auth_only = no
Riavviare Postfix
Se si ottiene da mail.log un errore di tipo Recipient address rejected: Policy rejection not logged in, modificare il file /opt/iredapd/settings.py
e rimuovere dall’array plugins
la dicitura reject_sender_login_mismatch
.
Prima:
plugins = ["reject_null_sender", "reject_sender_login_mismatch", "throttle", "amavisd_wblist", "sql_alias_access_policy"]
Dopo:
plugins = ["reject_null_sender", "throttle", "amavisd_wblist", "sql_alias_access_policy"]
Passiamo alla configurazione del primo dominio sul nuovo mail server. Iniziamo con example.com che abbiamo già aggiunto come dominio principale.
Fare accesso al pannello web di iRedMail su https://mailserver1.example.com/iredadmin/
con i dati usati in fase di installazione. Il dominio è già presente quindi basta creare un nuovo utente, ad esempio [email protected]
Fatto ciò accedere al pannello DNS del dominio example.com
ed aggiungere i seguenti record DNS:
@ 10800 IN TXT "v=spf1 include:mailserver1.example.com ~all" @ 10800 IN MX 10 mailserver1.example.com.
Il primo serve ad indicare che il server abilitato ad inviare email per conto di @example.com
è mailserver1.example.com
mentre il secondo indica che il server abilitato a ricevere email per conto di @example.com
è mailserver1.example.com
.
Fatto ciò entrare sul server mail e generare la chiave DKIM che ci permetterà di ottenere una seconda convalida anti-spam. Per farlo occorre eseguire i seguenti comandi:
cd /var/lib/dkim/ sudo amavisd-new genrsa example.com.pem chmod 0644 example.com.pem
Dopo di che modificare il file /etc/amavis/conf.d/50-user
e cambiare la dicitura @local_domains_maps
come segue:
@local_domains_maps= ( [".$mydomain", ‘example.com'] );
E infine riavviare amavis con il comando:
service amavis restart
Oppure usare il seguente script che fa tutto automaticamente:
#!/bin/bash ############################################################################ # # Author: Nil Portugués Calderó <[email protected]> # # For the full copyright and license information, please view the LICENSE # file that was distributed with this source code. # ############################################################################ if [ $(whoami) != "root" ]; then echo "" echo "You must be sudoer or root." echo "" echo "Usage: sudo bash $0 <domain_name>" echo "" exit 1 fi if [ "$#" != "1" ]; then echo "" echo "Usage: ./$0 <domain_name>" echo "" exit 1 fi PWD=`pwd` DOMAIN=$1 AMAVIS_PATH="/etc/amavis/conf.d/50-user" AMAVIS_SEPARATOR_STRING="use strict;" ################################################################################################## ## Step 1: generate keys for all required domains ################################################################################################## cd /var/lib/dkim/ if [ -f $DOMAIN.pem ]; then rm -f $DOMAIN.pem fi sudo amavisd-new genrsa $DOMAIN.pem sudo chmod 0644 *.pem ################################################################################################## ## Step 2: Add just after "use strict" all the keys generated ################################################################################################## #Add a newline to the configuration for the new domain EXISTS=`cat $AMAVIS_PATH | grep "dkim_key(\"$DOMAIN\", \"dkim\"," | wc -l` if [ "$EXISTS" = "0" ]; then NEWLINE="dkim_key(\"$DOMAIN\", \"dkim\", \"\/var\/lib\/dkim\/$DOMAIN.pem\");" sed -i "s/$AMAVIS_SEPARATOR_STRING/$AMAVIS_SEPARATOR_STRING\n$NEWLINE/g" $AMAVIS_PATH fi # Create this line containing all previous domaisn, plus the new one domains# EXISTS=`cat $AMAVIS_PATH | grep '".\$mydomain"' | wc -l` if [ "$EXISTS" = "0" ]; then ## No local_domains_map exists in the editable area REPLACE_STRING="\@local_domains_maps = ( \[\".\$mydomain\", '$DOMAIN' \] );" sed -i "s/$AMAVIS_SEPARATOR_STRING/$AMAVIS_SEPARATOR_STRING\n$REPLACE_STRING/g" $AMAVIS_PATH else ## Case local_domains_map already exists in editable area. FIND_STRING="\@local_domains_maps = ( \[\".\$mydomain\", " REPLACE_STRING="\@local_domains_maps = ( \[\".\$mydomain\", '$DOMAIN', " sed -i "s/$FIND_STRING/$REPLACE_STRING/g" $AMAVIS_PATH fi ################################################################################################## ## Step 3: Apply changes ################################################################################################## sudo service amavis restart ################################################################################################## ## Step 4: Generate DNS TXT records ################################################################################################## var=$( amavisd-new showkeys $DOMAIN | sed 's/"//g' |tail -n+2 | sed 's/ //g' | sed "s/3600TXT(//g" ); var="${var:0: -1}\"" var=`echo $var | sed 's/= /=/g' | sed 's/ //g' | sed 's/v=DKIM1/\t\t"v=DKIM1/g'` ## DNS "TXT" record for the domain cd ~ echo $var > "$PWD/dns.txt_record.$DOMAIN.txt"
Per visualizzare la chiave DKIM usare il comando:
amavisd-new showkeys example.com ; key#1, domain example.com, /var/lib/dkim/example.com.pem dkim._domainkey.example.com. 3600 TXT ( "v=DKIM1; p=" "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDCMTpLHOSIgT17G0JwgkF7s8vL" "qh/kYW25mAO68dTKVqA1RA9SNN5bE1NsTLJHzDo9KqhtC/uPYoxtghx3VCYIFZQw" "duQIQnBCz8CjQKkCtYMdwvc3Nu2Ticka2a7WaOUG7IC3TuNEOixTVORHnndW6GEJ" "2u8jryCjFZ8e+L6PlwIDAQAB")
A questo punto aggiungere il seguente record DNS al file di zona di example.com
dkim._domainkey 10800 IN TXT "v=DKIM1;p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDCMTpLHOSIgT17G0JwgkF7s8vLqh/kYW25mAO68dTKVqA1RA9SNN5bE1NsTLJHzDo9KqhtC/uPYoxtghx3VCYIFZQwduQIQnBCz8CjQKkCtYMdwvc3Nu2Ticka2a7WaOUG7IC3TuNEOixTVORHnndW6GEJ2u8jryCjFZ8e+L6PlwIDAQAB"
Attendere qualche ora per la propagazione dei DNS.
A DNS propagati, testare la configurazione di SPF e di DKIM. Per testare SPF basta utilizzare il tool online gratuito Vamsoft.com.
Inseriamo l’indirizzo IP del server mail e l’indirizzo email appena creato, ovvero [email protected]
Se tutto fila liscio, il risultato dell’operazione sarà pass.
Per testare la chiave DKIM invece basta lanciare il seguente comando dal server:
amavisd-new testkeys example.com
Anche qui la risposta deve essere pass.
Se entrambi i controlli passano, allora testare l’invio e la ricezione delle email. Proviamo ad inviare una email ad un indirizzo GMAIL:
Come possiamo vedere il messaggio viene recapitato in INBOX e non in spam. Analizziamo il messaggio originale:
Come possiamo vedere i controlli SPF e DKIM sono andati correttamente, così come il controllo di reverse DNS. Adesso testiamo la ricezione aggiungendo anche un allegato:
Il record MX funziona perfettamente così come il nostro mail server.
Ripetiamo i passi precedenti con un secondo dominio aggiuntivo, dominiosdasda.it. Come prima cosa entriamo sul server e generiamo una chiave DKIM per il dominio, facciamolo con lo script per comodità:
./aggiungi_dkim.sh dominiosdasda.it Private RSA key successfully written to file "dominiosdasda.it.pem" (1024 bits, PEM format) Stopping amavisd: amavisd-new. Starting amavisd: amavisd-new.
Ed ecco il DNS da aggiungere al pannello DNS di dominiosdasda.it:
dkim._domainkey 10800 IN TXT "v=DKIM1;p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/dgTHhVjbDLIlBehy5MJKEPwRSG+uyNB8pBuiCM6a0tao+M5+dMtGMWBaeUJQVNEoXzKhKnZ81C03kRoZQsotOP2f55AAW8HyxB3Ox/TrzzE4ES/FfmJVMfw5mb3sFTmcY2UFohxOLVEjDihgLsmJjtPEj5v+OijhGvHYVlhKcQIDAQAB"
Nel frattempo configuriamo pure SPF ed il record MX. Alla fine nel pannello DNS avremo:
Adesso accediamo da amministratori al pannello web del mail server https://mailserver1.example.com/iredadmin/
ed aggiungiamo dominio e mailbox:
Attendiamo al solito la propagazione dei DNS e facciamo il test anti spam SPF e DKIM. Se entrambi hanno come risultato pass, testiamo l’invio di una email a GMAIL:
Al solito dal messaggio originale possiamo constatare che non ci siano errori:
E adesso testiamo la ricezione delle email:
Adesso che il dominio dominiosdasda.it è funzionante, possiamo aggiungere tutte le mailbox che vogliamo.
Per usare mailgun come server SMTP, ovvero per l’invio delle email di tutti o alcuni dei domini configurati sul server di posta appena creato, basta aprire il file /etc/postfix/main.cf
e modificare o aggiungere le seguenti righe come segue:
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd smtp_sasl_auth_enable = yes sender_dependent_relayhost_maps = hash:/etc/postfix/relayhost_map smtp_sender_dependent_authentication = yes smtp_sasl_security_options = noanonymous relayhost = [smtp.mailgun.org]:587
Creare il file /etc/postfix/sasl_passwd
ed inserire le informazioni di autenticazione SMTP del dominio o dei domini dalle impostazioni di Mailgun:
@dominio1.com username_smtp_mailgun_1:password_smtp_mailgun_1 @dominio2.com username_smtp_mailgun_2:password_smtp_mailgun_2
Creare il file /etc/postfix/relayhost_map ed elencare i domini configurati:
@dominio1.com [smtp.mailgun.org]:587 @dominio2.com [smtp.mailgun.org]:587
Dare i permessi 600 ai due file appena creati, caricarli con postmap e riavviare postfix:
chmod 600 /etc/postfix/sasl_passwd chmod 600 /etc/postfix/relayhost_map postmap /etc/postfix/sasl_passwd postmap /etc/postfix/relayhost_map service postfix restart