Introduzione
Ultima revisione: Settembre 2010
(Ovviamente) questa guida non è farina del mio sacco ma è l’insieme di più guide.
Una guida completa è Congiuriamo un server di posta completo se Debian etch (postfix) di Il portalinux.
Poi ho consultato anche questa guida su postfix su XS4ALL
Un’altra fonte sono i readme di Postfix Admin.
Per la configurazione di Dovecot ho consulato Johnny Chadda .se, anche se in realtà è solo da decommentare.
Attenzione:Per questo tutorial si userà la shell come root.
Alcune cose le darò per scontato, per esempio la modifica di un file di testo.
Questa, con l’editor nano si fa così: nano nomefile
, per salvare un file si usa CTRL+O
mentre per uscire dall’editor si fa CTRL+X
.
Siamo sotto Debian GNU Linux (vedere le guide precedenti) ma dovrebbe funzionare anche su altre distribuzioni, al massimo adattate il gestore di pacchetti o compilate voi il software.
Per decommentare la maggior parte delle volte basta levare il # all’inizio di una riga.
Ecco la lista del software (tutto software libero):
- Debian (Lenny ma anche su Unstable dovrebbe funzionare)
- Postfix
- Dovecot
- MySQL
- Postgrey
- Spamassassin
- FQDL Check
- RDL
- Pyzor
- Razor
- ClamAV
- Apache 2
- PHP 5
- Postfix Admin
- Roundcube webmail
Per il server LAMP vi rimando alla guida precedente. Inoltre sempre da quella guida verrà usato il Virtual Host creato appositamente per gli strumenti di amministrazione.
Per il resto possiamo pure dare:
apt-get install postfix postfix-mysql libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql amavisd-new \ spamassassin clamav clamav-daemon razor pyzor postgrey dovecot-imapd dovecot-pop3d
Questa guida poi non è assolutamente seria. Va bene per un muletto, ma non per altro.
Vi avviso poi che serve un dominio a postfix… Al massimo potete operare con il file hosts ma poi non funzionerà verso l’esterno.
Io ho usato inizialmente no-ip.com perché tempo fa mi ero registrato, poi non l’avevo più usato ma poi ho usato DotTk con uno script python che aggiorna da solo l’indirizzo IP.
La configurazione di postfix-mysql
Il database usato si chiamerà postfix e così anche l’utente, tuttavia le tabelle le costruirà postfix admin.
File mysql_virtual_alias_maps.cf:
:
user = postfix password = password hosts = localhost dbname = postfix query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
File /etc/postfix/mysql_virtual_alias_domain_maps.cf
:
user = postfix password = password hosts = localhost dbname = postfix query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('%u', '@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'
File /etc/postfix/mysql_virtual_alias_domain_catchall_maps.cf
:
user = postfix password = password hosts = localhost dbname = postfix query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'
File /etc/postfix/mysql_virtual_domains_maps.cf
:
user = postfix password = password hosts = localhost dbname = postfix query = SELECT domain FROM domain WHERE domain='%s' AND active = '1'
File /etc/postfix/mysql_virtual_mailbox_maps.cf
:
user = postfix password = password hosts = localhost dbname = postfix query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'
File /etc/postfix/mysql_virtual_alias_domain_mailbox_maps.cf
:
user = postfix password = password hosts = localhost dbname = postfix query = SELECT maildir FROM mailbox,alias_domain WHERE alias_domain.alias_domain = '%d' and mailbox.username = CONCAT('%u', '@', alias_domain.target_domain) AND mailbox.active = 1 AND alias_domain.active='1'
File /etc/postfix/mysql-virtual-mailbox-limit-maps.cf
:
user = postfix password = password hosts = localhost dbname = postfix query = SELECT quota FROM mailbox WHERE username='%s' AND active = '1'
Ora cambiamo permessi ai file creati (hanno password!) e gruppo:
chmod o= /etc/postfix/mysql_virtual_*.cf chgrp postfix /etc/postfix/mysql_virtual_*.cf
Ora creiamo l’utente vmail che sarà il proprietario dei vari file delle caselle:
groupadd -g 5000 vmail useradd -g vmail -u 5000 vmail -d /home/vmail -m
Ora modifichiamo il file main.cf con dei comandi:
postconf -e 'myhostname = server.dominio.com' postconf -e 'mydestination = localhost, localhost.localdomain' postconf -e 'mynetworks = 127.0.0.0/8' postconf -e 'virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf' postconf -e 'virtual_alias_maps = proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf, proxy:mysql:/etc/postfix/mysql_virtual_alias_domain_maps.cf, proxy:mysql:/etc/postfix/mysql_virtual_alias_domain_catchall_maps.cf' postconf -e 'virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf, proxy:mysql:/etc/postfix/mysql_virtual_alias_domain_mailbox_maps.cf' postconf -e 'virtual_mailbox_base = /home/vmail' postconf -e 'virtual_uid_maps = static:5000′ postconf -e 'virtual_gid_maps = static:5000′ postconf -e 'smtpd_sasl_auth_enable = yes' postconf -e 'broken_sasl_auth_clients = yes' postconf -e 'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination' postconf -e 'smtpd_use_tls = no' postconf -e 'virtual_create_maildirsize = yes' postconf -e 'virtual_mailbox_extended = yes' postconf -e 'virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf' postconf -e 'virtual_mailbox_limit_override = yes' postconf -e 'virtual_maildir_limit_message = "The user you are trying to reach is over quota."' postconf -e 'virtual_overquota_bounce = yes' postconf -e 'proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps'
Ora riavviamo postfix:
/etc/init.d/postfix restart
Configurazione di saslauthd
Poiché Postfix è in un ambiente di chroot, dobbiamo dare a SASL una directory dentro al chroot che non esiste ancora. Diamo questo comando:
mkdir -p /var/spool/postfix/var/run/saslauthd
Poi modifichiamo il file /etc/default/saslauthd
:
# Should saslauthd run automatically on startup? (default: no) START=yes [...] # Other options (default: -c) # See the saslauthd man page for information about these options. # # Example for postfix users: “-c -m /var/spool/postfix/var/run/saslauthd” # Note: See /usr/share/doc/sasl2-bin/README.Debian OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"
Creiamo il file /etc/pam.d/smtp
:
auth required pam_mysql.so user=postfix passwd=password host=127.0.0.1 db=postfix table=mailbox usercolumn=username passwdcolumn=passsword crypt=1 account sufficient pam_mysql.so user=postfix passwd=password host=127.0.0.1 db=postfix table=mailbox usercolumn=username passwdcolumn=passsword crypt=1
Ora riavviamo i demoni interessati dai cambiamenti:
/etc/init.d/postfix restart /etc/init.d/saslauthd restart
Configuriamo Amavisd-new, ClamaV e Spamassassin
Continuiamo il tutorial configurando Amavisd-new, ClamaV e Spamassassin.
Questi strumenti servono per proteggere la posta da virus e il server da Spam.
Nel file /etc/amavis/conf.d/15-content_filter_mode
decommentiamo:
@bypass_virus_checks_maps = ( \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re); @bypass_spam_checks_maps = ( \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);
Ora, al file /etc/amavis/conf.d/50-user
aggiungiamo:
$pax='pax';
Ora digitiamo:
adduser clamav amavis
Il passo seguente è dire a postfix che deve controllare le mail con questi programmi:
postconf -e 'content_filter = amavis:[127.0.0.1]:10024' postconf -e 'receive_override_options = no_address_mappings'
E poi modificando il file /etc/postfix/master.cf
aggiungendo:
amavis unix - - - - - smtp -o smtp_data_done_timeout=1200 -o smtp_send_xforward_command=yes 127.0.0.1:10025 inet n - - - - smtpd -o content_filter= -o local_recipient_maps= -o relay_recipient_maps= -o smtpd_restriction_classes= -o smtpd_client_restrictions= -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject -o mynetworks=127.0.0.0/8 -o strict_rfc821_envelopes=yes -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks -o smtpd_bind_address=127.0.0.1
Ora riavviamo alcuni servizi:
/etc/init.d/amavis restart /etc/init.d/clamav-daemon restart /etc/init.d/clamav-freshclam restart /etc/init.d/postfix restart
Ora diamo netstat -tap
. Ad un certo punto dovremmo vedere:
tcp 0 0 localhost:10024 *:* LISTEN 1656/amavisd (maste tcp 0 0 localhost:10025 *:* LISTEN 2899/master
Configuriamo tutto in modo da combattere il phishing con pyzor e razor
Modifichiamo il file /etc/spamassassin/local.cf
:
#pyzor use_pyzor 1 pyzor_path /usr/bin/pyzor pyzor_add_header 1 #razor use_razor2 1 razor_config /etc/razor/razor-agent.conf #bayes use_bayes 1 use_bayes_rules 1 bayes_auto_learn 1
Poi riavviamo amavis:
/etc/init.d/amavis restart
Configuriamo FQDN Check e RBL
Aggiungiamo a /etc/postfix/main.cf
:
### Checks to remove badly formed email smtpd_helo_required = yes strict_rfc821_envelopes = yes disable_vrfy_command = yes unknown_address_reject_code = 554 unknown_hostname_reject_code = 554 unknown_client_reject_code = 554 smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname, regexp:/etc/postfix/helo.regexp, permit ### When changing sender_checks, this file must be regenerated using postmap , to generate a Berkeley DB smtpd_recipient_restrictions = check_client_access hash:/etc/postfix/helo_client_exceptions check_sender_access hash:/etc/postfix/sender_checks, reject_invalid_hostname, reject_non_fqdn_hostname, reject_non_fqdn_sender, reject_non_fqdn_recipient, reject_unknown_sender_domain, reject_unknown_recipient_domain, permit_mynetworks, reject_unauth_destination, # Add RBL exceptions here, when changing rbl_client_exceptions, this #file must be regenerated using postmap , to generate a #Berkeley DB check_client_access hash:/etc/postfix/rbl_client_exceptions, reject_rbl_client cbl.abuseat.org, reject_rbl_client sbl-xbl.spamhaus.org, reject_rbl_client bl.spamcop.net, reject_rhsbl_sender dsn.rfc-ignorant.org, permit
Quindi create i file:
/etc/postfix/helo.regexp
:
/^subdomain\.host\.com$/ 550 Don’t use my own hostname /^xxx\.yyy\.zzz\.xxx$/ 550 Don’t use my own IP address /^\[xxx\.yyy\.zzz\.xxx\]$/ 550 Don’t use my own IP address /^[0-9.]+$/ 550 Your software is not RFC 2821 compliant /^[0-9]+(\.[0-9]+){3}$/ 550 Your software is not RFC 2821 compliant
/etc/postfix/helo_client_exceptions
:
#These client IP addresses are allowed to bypass fqdn checks # Some Comment to identify IP address below #www.xxx.yyy.zzz OK
/etc/postfix/rbl_client_exceptions
:
## Some Random comment #www.xxx.yyy.zzz OK
Gli ultimi due file servono per le eccezioni.
Quando li si modificano, bisogna ricaricarli con postmap nomefile
:
postmap /etc/postfix/helo.regexp postmap /etc/postfix/helo_client_exceptions postmap /etc/postfix/rbl_client_exceptions
Configurazione di PostGrey
PostGrey è il demone che si occupa del greylisting per postfix.
Con il greylisting quando qualcuno cerca di inviare una mail, viene bannato per un tempo dal server e deve riprovare dopo un tot di tempo.
Solitamente gli spammer non si fermano a riprovare, perciò elimina un bel po’ di carico.
Ecco come configurarlo: modifichiamo il file /etc/default/postgrey
:
POSTGREY_OPTS="--inet=127.0.0.1:60000 --delay=60"
Delay indica il tempo in secondi che uno deve aspettare. Il massimo che è anche il valore di default è 300 (5 minuti).
Ora riavviamo postgrey:
/etc/init.d/postgrey restart
Quindi aggiungamo al file /etc/postfix/main.cf
:
### Postgrey smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination, check_policy_service inet:127.0.0.1:60000
Ora riavviamo per l’ultima volta postfix:
/etc/init.d/postfix restart
Per postfix abbiamo finito, quindi ora siamo (dovremmo, vedi dopo) essere in grado di spedire mail e accoglierle.
Configurazione di Dovecot
Tuttavia non possiamo leggere le mail ricevute, perciò ci occorre un server pop3/imap, nel nostro caso dovecot.
Dobbiamo decommentare delle linee e cambiarne alcune su /etc/dovecot/dovecot.conf
:
Riga 19: base_dir = /var/run/dovecot/ Riga 24: protocols = imap pop3 Da linea 34 a linea 42: protocol imap { listen = *:143 # ssl_listen = *:10943 # .. } protocol pop3 { listen = *:110 # .. } Riga 78: log_timestamp = "%Y-%m-%d %H:%M:%S " Riga 83: syslog_facility = mail Riga 218: mail_location = maildir:/home/vmail/%d/%n Da riga 514: protocol imap { login_executable = /usr/lib/dovecot/imap-login [...] mail_executable = /usr/lib/dovecot/imap [...] imap_max_line_length = 65536 } Da riga 579: protocol pop3 { login_executable = /usr/lib/dovecot/pop3-login [...] mail_executable = /usr/lib/dovecot/pop3 [...] pop3_uidl_format = %08Xu%08Xv } Da riga 704: protocol lda { postmaster_address = postmaster@miodominio.com sendmail_path = /usr/lib/sendmail auth_socket_path = /var/run/dovecot/auth-master } Da riga 788: auth_verbose = no [...] auth_debug = no [...] auth_debug_passwords = no Da riga 811: auth default { mechanisms = plain [...] passdb sql { args = /etc/dovecot/dovecot-sql.conf } [...] userdb sql { args = /etc/dovecot/dovecot-sql.conf } [...] user = nobody socket listen { master { path = /var/run/dovecot/auth-master mode = 0660 user = vmail group = vmail } client { path = /var/spool/postfix/private/auth mode = 0660 user = postfix group = postfix } } }
Aggiungiamo alla fine del file /etc/dovecot/dovecot-sql.conf
:
driver = mysql connect= host=localhost dbname=postfix user=postfix password=password default_pass_scheme = MD5-CRYPT user_query = SELECT maildir, 5000 AS uid, 5000 AS gid FROM mailbox WHERE username = '%u' AND active='1' password_query = SELECT username AS user,password FROM mailbox WHERE username = '%u' AND active='1'
Anche a questi file dobbiamo dare dei permessi (contentono password):
chmod 600 /etc/dovecot/*.conf chown vmail /etc/dovecot/*.conf
Installazione di postfix admin
Creeremo le tabelle e gli utenti con il tool Postfix Admin, un tool basato su PHP.
Io lo installerò nel virtualhost di cui avevo già parlato precedentemente, perciò ho aggiungo a /etc/apache2/sites-available/admin
:
<Directory /home/server/pfadmin/> Options FollowSymLinks MultiViews AllowOverride All Order deny,allow Deny from all php_flag magic_quotes_gpg off php_flag magic-quotes-runtime off </Directory>
In questo caso l’applicazione sarà salvata sotto /home/server/pfadmin
.
Procediamo con l’installazione di Postfix Admin.
Seppure distribuiscano una versione in .deb ho preferito installarlo alla vecchia maniera.
Vi ho facilitato il compito con questi comandi:
cd /home/server wget -q -O- http://sourceforge.net/projects/postfixadmin/files/postfixadmin/postfixadmin-2.3.2/postfixadmin-2.3.2.tar.gz/download | tar -xzvf - mv postfixadmin-2.3.2/ pfadmin/ chown -R root:www-data pfadmin/ cd pfadmin chmod 640 *.php sed -i 's/EHLO/HELO/' functions.inc.php sed -i 's/change-this-to-your.domain.tld/miodominio.com/' config.inc.php
Ovviamente l’ultima linea ve cambiata come va meglio per voi.
Prima di procedere con la configurazione di postfix admin, va creato l’utente e il database postfix. Io l’ho fatto con phpMyAdmin (vedi il post sulla configurazione di LAMP).
Ho creato l’user postfix creando anche un db dove ha tutti i permessi.
Mi sono fidato di darlo in pasto anche a postfix admin ma se volete potete creare l’utente postfixadmin con permessi di select, insert, update, delete, create, alter, drop e index sul db postfix.
Ora modificare il file config.inc.php mettendo le vostre configurazioni, dopodiché andate sul file setup.php col browser.
Per la configurazione potete benissimo cavarvela da soli, perché è tutto commentato e se masticate un po’ di inglese capite tutto.
Nel setup del browser vi dà anche la password per l’amministrazione di postfix admin che dovrà essere salvata nelle prime linee di config.inc.php
.
Ora potete creare gli utenti del vostro database e potete già ricevere e (forse) inviare mail.
Installazione di Round Cube
Per avere qualcosa di completo, c’è bisogno anche di una webmail. Tuttavia se non vi interessa potete passare anche alle conclusioni.
Per la webmail ho fatto ricorso a Round Cube.
Possiamo tranquillamente installarla dai repo di Debian:
apt-get install roundcube php-mdb2-driver-mysql
Il database potete configurarlo in automatico e anche apache.
Una nota sul secondo pacchetto: seppure voi configuriate in automatico il database, lui non vi informerà che serve anche una libreria in più per mdb2 e io ci sono impazzito non poco!
Ora dobbiamo configurare apache per usarlo.
Questa è una tipica applicazione che richiede una connessione cifrata ma la mia voglia di fare certificati vari è sempre bassa.
Il virtualhost della mail l’ho messo sulla porta 8080, ma chissà che magari un giorno non arrivi un sottodominio per la mail 😊
Come abbiamo già fatto modifichiamo /etc/apache2/ports.conf
e aggiungiamo:
NameVirtualHost *:8080 Listen 8080
Poi creiamo il file /etc/apache2/sites-available/mail
:
<VirtualHost *:8080> ServerAdmin webmaster@miodominio.com DocumentRoot /var/lib/roundcube Alias /program/js/tiny_mce/ /usr/share/tinymce/www/ ErrorLog /var/log/apache2/mail_error.log LogLevel warn CustomLog /var/log/apache2/mail_access.log combinated </VirtualHost>
Ora dovrebbe funzionare tutto.
Conclusioni
Per prima cosa vi consiglio di disabilitare innoDb se usate vecchio hardware.
I log sono sempre vostri amici, quindi se qualcosa va male, guardateli!
Sotto mydestination, lasciate solo localhost o non funzionerà niente o se è lo stesso nome dell’utente del sistema le mail saranno sotto /var/spool/mail/utente
.
Le maildir sono create in automatico, quindi no problem 😊
Il mio blog si diverte a cambiare caratteri, perciò attenti che se fate copia e incolla. E taglia anche alcuni spazi come i due spazi che servono nei file di configurazione di postfix se dovete mettere delle opzioni su più linee.
Ecco la nota di cui parlavo prima, mettendo il forse prima dell’inviare mail.
Ci sarebbe molto più spam se tutti gli indirizzi IP potessero inviare mail direttamente ai server, perciò è abbastanza normale che abbiate bisogno di un server che fa da “garante” chiamato relay host e va messo con la direttiva relayhost in /etc/postfix/main.cf
.
Io ho provato solo con server che non richiedono autenticazione.
Quindi normalmente quello del vostro provider dovrebbe funzionare (almeno su Alice, provato e su NGI, teorico), mentre Yahoo, Gmail etc che hanno autenticazione e permessi non vi so dire.
Una volta impostato il relay host non dovreste avere più alcun tipo di problema anche perché la guida è stata testata direttamente sul mio muletto.
Non mi resta che augurarvi buona fortuna e se avete problemi commentate pure.
4 commenti
Ciao,
quando invio una mail da command line, mail -s …, mi crea la dir /home/vmail/user@dominio. Mentre se mi collego con un client windows mi crea la dir /home/vmail/dominio/utente.
Forse c'è qualcosa che non va nella configurazione…
Come l'hai creato l'utente?
Con Postfixadmin?
Comunque a me all'inizio dava dei problemi, ma non mi ricordo come abbia fatto a risolverli, però dopo funzionava correttamente e mi pare di aver copiato solo a quel punto i file…
Salve a tutti 😊 Innanzitutto un grazie per la guida, installato tutto e funziona correttamente. Mi sono trovato al punto che le risorse che MySQL richiede sono troppe (troppe mail, troppe autenticazioni, troppa RAM :P) e vorrei mantenere la stessa configurazione di Postfix, eliminando il proxy:mysql, in pratica vorrei passare ai buoni e cari file di configurazione. Mi date qualche dritta?
Ciao, io ho provato così a configurarlo per mio piacere personale, non sono esperto di queste cose 😊
Penso che però lo potresti facilmente usare per gli utenti locali.