Howto Postfix+DbMail+OpenLdap
Quanti di voi gestiscono un server di posta con postfix? Spero tanti... E quanti utilizzano come demone per il pop3 e imap dovecot?
Di tutti questi bravi quanti usano un server ldap per l'autenticazione?
Adesso che sappiamo che utilizzate Postfix+ldap+dovecot, non avete mai pensato che la posta su file è complicata da gestire? E se si potesse utilizzare un database per archiviare le mail.... e se poi avessimo più di un dominio da gestire non sarebbe comodo avere un database per la posta dedicato solo a quel dominio (virtuale ovviamente) e che si potesse tutto gestire da un unico server, potrebbe essere interessante?
Mai sentito DbMail?
Vediamo come di può cambiare con Postfix+OpenLdap+DbMail....
Quali vantaggi può portarmi questo? Sicuramente va valutato bene la vostra situazione attuale, ma teniamo per buoni questi punti:
- Possiamo avere un server separato che fa da solo database per lo storage delle mail, il database può essere sia postgreSQL che MySql. In più sappiamo che possiamo mettere quante macchine db vogliamo se la “potenza” non basta. Potremmo fare un cluster per esempio, o creare una situazione di replica per varie ed eventuali.
- Con un unico repository ldap possiamo gestire tutti i domini che vogliamo in modo semplice, centralizzato e separato. Potremmo usare “Fedora Directory Server” che supporta le repliche master multi master o OpenLdap che sono completamente liberi e abbastanza semplici da configurare.
Qui si farà un esempio di configurazione di un Server di posta composto da una macchina sola (potremmo comunque dividere in più macchine, cosa che consiglio) dove sarà installato un database postrgreSQL, il software DbMail, il Server OpenLdap e l'MTA postfix
Cominciamo con il preparare il Server, io ho usato una CentosOS 5.2 i386.
Per l'installazione del Server basta una configurazione standard, quello che deve esserci di sicuro sono:
gruppo librerie di sviluppo
gruppo software di sviluppo
quind:
gcc
gcc-c++
make
gmime >= 2.1.19
gmime-dvel
libsieve >= 2.1
glib2 >= 2.10.
postgres-server
postgresql-contrib
postgresql-devel
mysql
openldap
openldap-clients
openldap-devel
nss_ldap
openldap-servers
postfix con il supporto a mysql e pgsql. per la Centos “postfix-2.3.3-2.el5.centos.mysql_pgsql” reperibile su “http://rpm.pbone.com”
xinetd (non obbligatorio ma useremo questo demone invece che gli script di start e stop)
mailserver># yum remove sendmail
mailserver># yum install gmime gmime-devel libsieve glib2 glib2-devel xinetd openldap-servers openldap-clients postgresql-server postgresql-contrib postgresql-devel mysql
Prepariamoci ad installare i server:
postfix, dbmail, postgresql e OpenLdap.
Il Server l'ho chiamato mailserver.master.org e gestirà la posta per i domini (virtuali) “serenity.it” e “apollo.com”.
Indirizzi usati:
mailserver.master.org 172.16.0.101 # eth0
Ognuno dei due domini avrà un suo database dedicato.
Scarichiamo il pacchetto dbmail da http://www.dbmail.org
mailserver#> mkdir /home/DbMail
mailserver#> cd /home/DbMail
mailserver># wget http://www.dbmail.org/download/2.2/dbmail-2.2.10.tar.gz
mailserver># tar xvfz dbmail-2.2.10.tar.gz
mailserver#> chown -R postgres dbmail-2.2.10
mailserver># cd dbmail-2.2.10
mailserver># ./configure --with-pgsql --with-ldap
mailserver># make
mailserver># make install
Aggiungiamo il percorso delle librerie “/usr/local/lib/dbmail” al file “/etc/ld_so.conf
mailserver>♯ echo “/usr/local/lib/dbmail” >> /etc/ld.so.conf
e fate un refresh con
mailserver># ldconfig -v
Facciamo dei link a /usr/sbin dei binari creati
mailserver># ln -s /usr/local/sbin/dbmail-* /usr/sbin/
e copiamo lo schema dbmai.schema in /etc/openldap/schema
mailserver># cp dbmail.schema /etc/openldap/schema/
Continuiamo con OpenLdap.
Configuriamolo per contenere le informazioni per i domini “serenity.it” e “apollo.com”.
Per fare questo dobbiamo creare le entry sul server ldap dovendo dichiarare due basi distinte e precisamente .it per serenity e .com per apollo, possiamo creare quante basi vogliamo a seconda di quanti suffissi di dominio e domini vogliamo gestire.
Potremmo anche usare questo server ldap per altri scopi ma al momento lo dedicheremo solo agli utenti di posta (chi utilizza già ldap come sistema di autenticazione non avrà problemi ad adattare questo alla sua struttura).
Editiamo il file slapd.conf
mailserver># vim /etc/openldap/slapd.conf
Aggiungiamo un “include” e settiamolo il resto cosi:
...
include /etc/openldap/schema/dbmail.schema
….
database bdb
suffix ""
rootdn "cn=Manager"
rootpw password
Copiamo il file DB_CONFIG.example in /var/lib/ldap/DB_CONFIG
mailserver># cp /etc/openldap/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
set dei permessi:
mailserver># chown ldap /var/lib/ldap/DB_CONFIG
Start del server ldap
mailserver#> cd /home/DbMail
mailserver#> /etc/init.d/ldap start
Creiamo le entry che ci servono creando due file che chiameremo “serenity.ldif” e “apollo.ldif”.
File ldif per il dominio serenity.it (serenity.ldif) |
File ldif per il dominio apollo.com (apollo.ldif) |
# Base dn: dc=it objectClass: top objectClass: domain dc: it # Dominio serenity dn: dc=serenity,dc=it objectClass: top objectClass: domain dc: serenity # People, serenity.it dn: ou=People,dc=serenity,dc=it objectClass: top objectClass: organizationalunit ou: People # Groups, serenity.it dn: ou=Groups,dc=serenity,dc=it objectClass: top objectClass: organizationalunit ou: Groups # User Postmaster dn: uid=postmaster,ou=People,dc=serenity,dc=it uid: postmaster objectClass: account objectClass: shadowAccount objectClass: dbmailUser objectClass: top dbmailUID: 10000 dbmailGID: 10000 accountStatus: active mail: postmaster@serenity.it mailQuota: 512000000 userPassword: {MD5}X03MO1qnZdYdgyfeuILPmQ== # Pass “password” in MD5
|
# Base dn: dc=com objectClass: top objectClass: domain dc: com # Dominio apollo dn: dc=apollo,dc=com objectClass: top objectClass: domain dc: apollo # People, apollo.com dn: ou=People,dc=apollo,dc=com objectClass: top objectClass: organizationalunit ou: People # Groups, apollo.com dn: ou=Groups,dc=apollo,dc=com objectClass: top objectClass: organizationalunit ou: Groups # User Poatmaster dn: uid=postmaster,ou=People,dc=apollo,dc=com uid: postmaster objectClass: account objectClass: shadowAccount objectClass: dbmailUser objectClass: top dbmailUID: 10000 dbmailGID: 10000 accountStatus: active mail: postmaster@apollo.com mailQuota: 512000000 userPassword: {MD5}X03MO1qnZdYdgyfeuILPmQ== # Pass “password” in MD5
|
Per cambiare/creare la password dell'utente postmaster usate
mailserver#> /usr/sbin/slappasswd -h {MD5} -s PASS_DA_GENERARE
Potremmo anche cambiarla dopo con i comandi di DbMail (meglio)
Una volta creati i files come sopra date i comandi per aggiungere le informazioni che saranno la base per il dominio serenity.it e apollo.com.
mailserver># ldapadd -x -D "cn=Manager" -w password -f serenity.ldif
mailserver># ldapadd -x -D "cn=Manager" -w password -f apollo.ldif
Bene se tutto è andato come si deve dovremmo avere la lista globale delle nuove entry interrrogando il server con:
mailserver># ldapsearch -x -h localhost -b ""
Una lista solo per il dominio serenity.it con:
mailserver># ldapsearch -x -h localhost -b "dc=serenity,dc=it”
Una lista solo per il dominio apollo.com con:
mailserver># ldapsearch -x -h localhost -b "dc=apollo,dc=com”
Ora dobbiamo preparare un piccolo script che mi permetta di inserire gli utenti dei vari domini in modo abbastanza semplice. Ricordiamoci che ci sono strumenti come “phpldapadmin” che facilitano la gestione del server ldap.
Script per aggiungere utenti nei domini “serenity.it” e “apollo.com”. copiarlo in due file, con nomi diversi e modificare le “variabili” che riguardano “DOMINIO, SUFFIX”.
Renderli eseguibile e lanciarli da shell.
-------------------------------------------
#!/bin/bash
DOMINIO="serenity.it"
SUFFIX="dc=serenity,dc=it"
ROOTDN="cn=Manager"
PASSDN="password"
echo " Nome? "; read nome
until [ "`ldapsearch -x -b "$SUFFIX" |grep "uid=$nome,ou=People"`" != "dn: uid=$nome,ou=People,$SUFFIX" ]; do echo "Esiste gia un utente con questo nome..!" ; read nome; done
echo
echo " OK !"
id="`ldapsearch -x -b "$SUFFIX" |grep "dbmailUID: 10" |awk '{ print $2 }' |sort -n |tail -n1`"
uid="`( echo $id+1 ) | bc`"
gd="`ldapsearch -x -b "$SUFFIX" |grep "dbmailGID: 10" |awk '{ print $2 }' |sort -n |tail -n1`"
gid="`( echo $gd+1 ) | bc`"
echo " Passsword? "; read password
echo " Quota mail? "; read mquota
echo "dn: uid=$nome,ou=People,$SUFFIX" >> /tmp/$nome.ldif
echo "uid: $nome" >> /tmp/$nome.ldif
echo "objectClass: account" >> /tmp/$nome.ldif
echo "objectClass: shadowAccount" >> /tmp/$nome.ldif
echo "objectClass: dbmailUser" >> /tmp/$nome.ldif
echo "objectClass: top" >> /tmp/$nome.ldif
echo "dbmailGID: $gid" >> /tmp/$nome.ldif
echo "dbmailUID: $uid" >> /tmp/$nome.ldif
echo "accountStatus: active" >> /tmp/$nome.ldif
echo "mail: $nome@$DOMINIO" >> /tmp/$nome.ldif
echo "mailQuota: $mquota" >> /tmp/$nome.ldif
echo "userPassword: `/usr/sbin/slappasswd -h {MD5} -s $password`" >> /tmp/$nome.ldif
echo "OK?"
echo
echo "$(cat /tmp/$nome.ldif)"
echo "OK? (s/n)"; read i
if [ "$i" != "s" ]; then
echo "Esco"; exit
else
echo "inserisco l'utente in ldap"; ldapadd -x -D "$ROOTDN" -w $PASSDN -f /tmp/$nome.ldif
fi
echo
echo "Risultato in LDAP"
echo
ldapsearch -x "uid=$nome"
rm -f /tmp/$nome.ldif
-------------------------------------------
Questo è un esempio per creare utenti con delle impostazioni base.
Procediamo con Postgresql e creiamo i database che ospiteranno le caselle di posta.
Per la configurazione del database ricordiamoci solo di controllare che nel file pg_hba.conf sia concessa la connessione e nel file postgresql.conf sia non commentata la linea che consente le connessioni via rete.
mailserver#> /etc/init.d/postgres start
mailserver#> cd /var/lib/pgsql/data
Editare controllare l'impostazione nel file “postgresql.conf”
------------------------------------------------
…..
listen_addresses = '*'
…...
------------------------------------------------
Editare e settare l'impostazione nel file “pg_hba.conf"
------------------------------------------------
# IPv4 local connections:
host all all 127.0.0.1/32 password
host all all xxx.xxx.xxx/24 password # inserite la vostra rete per dare l'accesso al db.
host all all 0.0.0.0/8 reject
------------------------------------------------
mailserver#> /etc/init.d/postgres restart
mailserver#> su – postgres
bash-3.2#> createuser -U postgres dbmail
(n/y/n)
bash-3.2#> psql
postgres=# ALTER USER dbmail WITH PASSWORD 'password';
postgres=# ALTER USER dbmail CREATEDB ;
postgres=# \q
bash-3.2#> createdb -U dbmail dbmail_serenityIT
bash-3.2#> createdb -U dbmail dbmail_apolloCOM
bash-3.2#>psql -U dbmail dbmail_serenityIT < /home/DbMail/dbmail-2.2.10/sql/postgresql/create_tables.pgsql
bash-3.2#>psql -U dbmail dbmail_apolloCOM < /home/DbMail/dbmail-2.2.10/sql/postgresql/create_tables.pgsql
Continuiamo e creiamo i due file di configurazione per DbMail.
Li chiameremo rispettivamente:
/etc/dbmail_serenityIT.conf
/etc/dbmail_apolloCOM.conf
Dovremmo solo cambiare due voci nei file per far puntare al database giusto ogni rispettiva configurazione.
Quindi la voce “db” e “BASE_DN” che sarà diversa a per ogni file.
Io ho marcato in rosso anche le voci riguardanti le porte in ascolto per i servizi, non sarebbe stato necessario dato che gestiremo le porte con xinetd. Comunque è bene per un eventuale controllo che dia subito tutte le informazioni che servono per le configurazioni del dominio in questione.
------------------------------------------------
[DBMAIL]
driver = pgsql
authdriver = ldap
host = localhost
sqlport = 5432
sqlsocket =
user = dbmail
pass = password
db = INSERIRE “dbmail_serenityIT” o “dbmail_apolloCOM”
table_prefix = dbmail_
encoding = utf8
default_msg_encoding = utf8
postmaster = DBMAIL-MAILER
sendmail = /usr/sbin/sendmail
TRACE_SYSLOG = 3
TRACE_STDERR = 1
EFFECTIVE_USER = nobody
EFFECTIVE_GROUP = nobody
BINDIP = *
NCHILDREN = 10
MAXCHILDREN = 30
MINSPARECHILDREN = 4
MAXSPARECHILDREN = 8
MAXCONNECTS = 10000
MAX_ERRORS = 500
TIMEOUT = 300
login_timeout = 60
RESOLVE_IP = no
logfile = /var/log/dbmail.log
errorlog = /var/log/dbmail.err
pid_directory = /var/run
state_directory = /var/run
[SMTP]
[LMTP]
PORT = 24 per il primo dominio, 26 per il secondo
[POP]
PORT = 110 per il primo dominio 109 per il secondo
POP_BEFORE_SMTP = no
[IMAP]
PORT = 143 per il primo dominio 144 per il secondo
TIMEOUT = 4000
IMAP_BEFORE_SMTP = no
[SIEVE]
PORT = 2000
[LDAP]
PORT = 389
VERSION = 3
HOSTNAME = localhost
BASE_DN = INSERIRE “dc=serenity,dc=it” o “dc=apollo,dc=com”
# URI = ldap://127.0.0.1:389
BIND_DN = "cn=Manager"
BIND_PW = password
SCOPE = SubTree
USER_OBJECTCLASS = account, dbmailUser
FORW_OBJECTCLASS = account,dbmailForwardingAddress
CN_STRING = uid
FIELD_PASSWD = userPassword
FIELD_UID = uid
FIELD_NID = dbmailUID
MIN_NID = 1000
MAX_NID = 1000
FIELD_CID = dbmailGID
MIN_CID = 1000
MAX_CID = 1000
FIELD_MAIL = mail
FIELD_QUOTA = mailQuota
#FIELD_FWDTARGET = mailForwardingAddress
[DELIVERY]
------------------------------------------------
Descriviamo come lavorerà il servizio IMAP/POP3 per i domini che ci servono.
Dobbiamo tener presente che i servizi IMAP e POP3 girano normalmente sulle porte 143 e 110. Noi dobbiamo però configurare due servizi in ascolto per il server IMAP e due per il POP3, rispettivamente “serenity.it” e “apollo.com”.
Abbiamo queste alternative:
- Ogni dominio ha un suo ip pubblico e quindi posso utilizzare il firewall per redirigere il traffico che arriva su quell'indirizzo alla porta 143 e mandarlo sull' ip privato del server alla porta che ho scelto.
- Ho solo un ip per tutti i domini, e non uso un redirect con il firewall, quindi devo per forza configurare i client sulla porta scelta es 143 per il primo dominio, 144 per il secondo ecc.. SITUAZIONE ATTUALE
- Ho la possibilità di avere degli IP pubblici e di poter creare tanti server (virtuali) quanti domini voglio gestire. Es. Ho un server XEN/ESX3i con tante piccole macchine virtuali che eseguono solo il servizio POP3 e IMAP ed ognuna è indipendente. Nessuna modifica “standard” sui client
Comunque sia la configurazione non cambierà, basterà copiarla sulla macchina che intendiamo usare.
Ci servirà solo un server SMTP per tutti i domini, dato che con postfix potrò decidere a livello di trasporto della posta su che porta/server/dominio deliverare le mail.
Il bello si questa configurazione è proprio nella possibilità poter “giocare” con i server/servizi come si vuole.
Il database si può trovare su una macchina singola. Si potrà decidere di avere, a seconda del carico una macchina che gestisce solo il server imap/pop3 per un dominio o per tutti.
Procediamo con la configurazione dei servizi IMAP e POP3.
Portiamoci sulla directory del servizio xientd e creiamo i file che metteranno in ascolto le porte scelte.
mailserver#> cd /etc/xinetd.d/
Per il servizio IMAP, creiamo due file rispettivamente “imapd_serenity” e “imapd_apollo” come questi qui sotto.
/etc/xinet.d/imapd_serenity |
/etc/xinet.d/imapd_apollo |
# service imapd_serenity { log_on_failure += USERID disable = no port = 143 socket_type = stream protocol = tcp user = root server = /usr/local/sbin/dbmail-imapd server_args = -n -f /etc/dbmail_serenityIT.conf type = UNLISTED wait = no } |
# service imapd_apollo { log_on_failure += USERID disable = no port = 144 socket_type = stream protocol = tcp user = root server = /usr/local/sbin/dbmail-imapd server_args = -n -f /etc/dbmail_apolloCOM.conf type = UNLISTED wait = no } |
Per il servizio POP3, creiamo altri due file rispettivamente “pop3d_serenity” e “pop3d_apollo” come questi qui sotto.
/etc/xinet.d/pop3d_serenity |
/etc/xinet.d/pop3d_apollo |
|
# service pop3d_serenity { log_on_failure += USERID disable = no port = 110 socket_type = stream protocol = tcp user = root server = /usr/local/sbin/dbmail-pop3d server_args = -n -f /etc/dbmail_serenityIT.conf type = UNLISTED wait = no } |
# service pop3d_apollo { log_on_failure += USERID disable = no port = 109 socket_type = stream protocol = tcp user = root server = /usr/local/sbin/dbmail-pop3d server_args = -n -f /etc/dbmail_apolloCOM.conf type = UNLISTED wait = no } |
|
Per il servizio lmtp creiamo altri due file ripettivamente “lmtp_serenity” e “lmtp_apollo” che si occuperanno dell'invio e inoltro della posta.
/etc/xinet.d/lmtp_serenity |
/etc/xinet.d/lmtp_apollo |
service lmtp_serenity { disable = no port = 24 socket_type = stream protocol = tcp user = mail server = /usr/sbin/dbmail-lmtpd server_args = -n -f /etc/dbmail_serenityIT.conf type = UNLISTED wait = no } |
service lmtp_apollo { disable = no port = 26 socket_type = stream protocol = tcp user = mail server = /usr/sbin/dbmail-lmtpd server_args = -n -f /etc/dbmail_apolloCOM.conf type = UNLISTED wait = no } |
mailserver#> /etc/xinetd.d/xinetd start
Sono abbastanza chiari non si fa altro che puntare il binario al file di configurazione che ha le impostazioni corrette per ogni database e metterle in ascolto sulle porte scelte.
Se controlliamo le porte in ascolto con un netstat -natup dovremmo vedere dei processi di xinetd sulle porte 109, 110, 143, 144.
Se proviamo a fare un telnet su localhost su queste porte vedremo che ci risponde il demone imap e pop3 di DbMail. La configurabilità che ha Linux in queste occasioni per me non ha pari, ed è bellissimo vedere che tutto funziona perfettamente ed esattamente come lo abbiamo pensato.
Per fare fare un'ulteriore prova possiamo dare i seguenti comandi così da verificare che i file di configurazione puntino esattamente al database che vogliamo.
mailserver#> dbmail-users -l -f /etc/dbmail_serenityIT.conf
-- users --
row number 0 is out of range 0..-1
postmaster:x:10000:10000:488.28:0.00:postmaster@serenity.it
-- forwards --
mailserver#> dbmail-users -l -f /etc/dbmail_apolloCOM.conf
-- users --
row number 0 is out of range 0..-1
postmaster:x:10000:10000:488.28:0.00:postmaster@apollo.com
-- forwards –
Se questi sono i risultati, sono la prova che:
- ldap funziona correttamente ottenendo il nome account postmaster dalla base di ricerca esatta e da un interrogazione non diretta ma traminte dbmail.
- Ogni file contatta il database corretto @serenity.it e @apollo.com
Ci sono due binari che saranno usati spesso per amministrare la posta, e questi sono:
dbamil-users e dbmail-utils. Con questi possiamo fare praticamente tutto. Il primo mi permetterà di amministrare listare modificare gli utenti, il secondo di controllare ottimizzare aggiustare il database.
Andiamo avanti e configuriamo postfix.
Dovremmo creare dei file che contengano gli accessi al repositotry ldap per il controllo degli utenti e l'accesso al database. Prima di tutto assicuriamoci che ci sia il supporto per PostrgreSQL.
mailserver#> cd /etc/postfix
mailserver#> postconf -m
btree
cidr
environ
hash
ldap
nis
pcre
pgsql
proxy
regexp
static
unix
Ci servono di sicuro questi moduli caricati, quello che generalmente non è standard è quello relativo a pgsql. In caso controlliamo di aver scaricato il pacchetto di postfix con il supporto a mysql e pgaql.
Creiamo i quattro file per il controllo degli utenti
/etc/postfix/sql-recipients_serenity.cf |
/etc/sql-recipients_apollo.cf |
# user = dbmail password = password hosts = localhost dbname = dbmail_serenityIT table = dbmail_aliases select_field = alias where_field = alias |
# user = dbmail password = password hosts = localhost dbname = dbmail_apolloCOM table = dbmail_aliases select_field = alias where_field = alias |
/etc/postfix/dbmail_alias_serenity.cf |
/etc/postfix/dbmail_alias_apollo.cf |
# user = dbmail password = password dbname = dbmail_serenityIT hosts = localhost query = SELECT alias FROM dbmail_aliases WHERE alias='%s' |
# user = dbmail password = password dbname = dbmail_apolloCOM hosts = localhost query = SELECT alias FROM dbmail_aliases WHERE alias='%s' |
Attenzione alla “query” che è tutta su una linea.
Configuriamo il file main.cf con le opzioni che ci servono, ecco un esempio:
/etc/postfix/main.cf
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
unknown_local_recipient_reject_code = 550
debug_peer_level = 5
debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
xxgdb $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/sbin/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/share/man
sample_directory = /usr/share/doc/postfix-2.3.3/samples
readme_directory = /usr/share/doc/postfix-2.3.3/README_FILES
disable_vrfy_command = yes
mynetworks = xxx.xxx.xxx/16, 127.0.0.0/8
# Vostra rete
relay_domains = serenity.it, apollo.com
smtpd_banner = DbMail Server Ready
best_mx_transport = local
transport_maps = hash:/etc/postfix/transport
alias_maps = pgsql:/etc/postfix/sql-recipients_serenity.cf, pgsql:/etc/postfix/sql-recipients_apollo.cf, pgsql:/etc/postfix/dbmail_alias_serenity.cf, pgsql:/etc/postfix/dbmail_alias_apollo.cf
# Tutto su una riga da “alias_map”
virtual_alias_maps = pcre:/etc/postfix/valias_serenity.pcre, pcre:/etc/postfix/valias_apollo.pcre
# Eventuali alias
local_recipient_maps = $alias_maps
default_process_limit = 10
smtpd_error_sleep_time = 0
message_size_limit = 20480000
mailbox_size_limit = 2000000000
maximal_queue_lifetime = 2d
bounce_queue_lifetime = 2d
Configuriamo Il file transport
/etc/postfix/transport
# TRANSPORT(5)
serenity.it dbmail-lmtp:localhost:24
apollo.com dbmail-lmtp:localhost:26
Configuriamo il file master.cf
/etc/postfix/master.cf
Aggiungiamo in fondo
dbmail-lmtp unix - - n - - lmtp
-o disable_dns_lookups=yes
Creiamo il file per gli alias dei domini ( potremmo usare anche ldap comunque) e inseriamo gli alias a postmaster per esempio info@serenity.it → postmaster@serenity.it:
mailserver#> vim /etc/postfix/valias_serenity.pcre
“info@serenity.it” “postmaster@serenity.it”
mailserver#> vim /etc/postfix/valias_apollo.pcre
“info@apollo.com” “postmaster@apollo.com”
Importanti le virgolette....
Possiamo inserire qi tutti gli alias che vogliamo.
Creiamo i db dei file di configurazione (che dovranno essere rifatti ogni volta che si cambia qualcosa nei file .cf).
mailserver#> postmap /etc/postfix/sql-recipients* /etc/postfix/dbmail_alias* /etc/postfix/valias_* /etc/postfix/transport
Facciamo partire postfix.
mailserver#> /etc/postfix start
Ora non ci resta che configurare il record MX dei domini serenity.it e apollo.com e farli puntare a questo server quindi aggiungiamo o modifichiamo i DNS che risolvono i rispettivi domini in modo che contengano i record MX cosi impostati:
Per il dominio serenity.it:
serenity.it IN MX 10 mailserver.master.org
Per il dominio apollo.com:
apollo.com IN MX 10 mailserver.master.org
Logicamente ci sarà in un record “IN A” che risolverà correttamente “mailserver.master.org” in tutti i due i domini.
In questo modo le mail dirette ai domini che ci interessano saranno inviate al server corretto con le nostre configurazioni.
Configuriamo i demoni ldap postfix postgresql e xinetd per essere eseguiti all'avvio del sistema.
mailserver#> chkconfig --level 235 postgresql on
mailserver#> chkconfig --level 235 postfix on
mailserver#> chkconfig --level 235 ldap on
mailserver#> chkconfig --level 235 xinetd on
Facciamo dei test:
apriamo una shell e digitiamo:
maiserver#> tail -f /var/log/maillog
apriamo un'altra shell e mettiamola in modo da vedere quella sopra che ci servirà per vedere che succede.
mailserver#> /etc/init.d/postfix start
Se tutto è a posto nella shell sopra compariranno i seguenti log.
Feb 17 14:17:52 mailserver postfix/postfix-script: starting the Postfix mail system
Feb 17 14:17:52 mailserver postfix/master[10927]: daemon started -- version 2.3.3, configuration /etc/postfix
Proviamo a mandare una mail a postmaster@serenity.it da postmaster@apollo.com per verificare che il delivery sia corretto. Guardiamo i log e verifichiamo che la mail sia inviata.
mailserver#> telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 DbMail Server Ready
helo serenity.it
250 mailserver.master.org
mail from: postmaster@apollo.com
250 2.1.0 Ok
rcpt to: postmaster@serenity.it
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
Test mail
.
250 2.0.0 Ok: queued as 2C27A104AA3
quit
221 2.0.0 Bye
Connection closed by foreign host.
Ecco il risultato corretto sui log, vediamo chiaramente che lo stato è “sent” e che il Recipient è stato verificato cono risultato OK.
Feb 17 14:38:48 mailserver postfix/lmtp[11056]: 2C27A104AA3: to=<postmaster@serenity.it>, relay=localhost[127.0.0.1]:24, delay=61, delays=61/0.02/0.03/0.33, dsn=2.0.0, status=sent (215 Recipient <postmaster@serenity.it> OK)
Feb 17 14:38:48 mailserver postfix/qmgr[11049]: 2C27A104AA3: removed
Facciamo anche il contrario e cioè:
“mail form: postmaster@serenity.it”
“rcpt to: postmaster@apollo.com
Ricontrolliamo i log e dovremmo avere lo stesso risultato solo con i domini inversi.
Ora controlliamo le mail inviate sia con il POP3 che con IMAP:
mailserver#> telnet localhost 110
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
+OK DBMAIL pop3 server ready to rock <555d150f569662b4069bab302372d496@mailserver.master.org>
USER postmaster
+OK Password required for postmaster
PASS password
+OK postmaster has 1 messages (421 octets)
stat
+OK 1 421
retr 1
+OK 421 octets
Received: from serenity.it (localhost.localdomain [127.0.0.1])
by mailserver.master.org (Postfix) with SMTP id 2C27A104AA3
for <postmaster@serenity.it>; Tue, 17 Feb 2009 14:37:47 +0100 (CET)
Message-Id: <20090217133815.2C27A104AA3@mailserver.master.org>
Date: Tue, 17 Feb 2009 14:37:47 +0100 (CET)
From: postmaster@apollo.com
To: undisclosed-recipients:;
Return-Path: postmaster@apollo.com
MIME-Version: 1.0
Test mail
.
quit
+OK see ya later
Rifacciamo anche utilizzando la porta 109 (altro dominio)
Poi proviamo con IMAP
mailserver#> telnet localhost 143
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
* OK dbmail imap (protocol version 4r1) server 2.2.10 ready to run
a login postmaster password
a OK LOGIN completed
a select inbox
* 1 EXISTS
* 0 RECENT
* FLAGS (\Seen \Answered \Deleted \Flagged \Draft)
* OK [PERMANENTFLAGS (\Seen \Answered \Deleted \Flagged \Draft)]
* OK [UIDNEXT 9] Predicted next UID
* OK [UIDVALIDITY 4] UID value
a OK [READ-WRITE] SELECT completed
a fetch 1 rfc822
* 1 FETCH (RFC822 {432}
Received: from serenity.it (localhost.localdomain [127.0.0.1])
by mailserver.master.org (Postfix) with SMTP id 2C27A104AA3
for <postmaster@serenity.it>; Tue, 17 Feb 2009 14:37:47 +0100 (CET)
Message-Id: <20090217133815.2C27A104AA3@mailserver.master.org>
Date: Tue, 17 Feb 2009 14:37:47 +0100 (CET)
From: postmaster@apollo.com
To: undisclosed-recipients:;
Return-Path: postmaster@apollo.com
MIME-Version: 1.0
Test mail
)
a OK FETCH completed
a logout
* BYE dbmail imap server kisses you goodbye
a OK completed
Connection closed by foreign host.
Vediamo come usare anche i comandi di DbMail, quelli che ci servono sono due,
dbmail-util e dbmail-users. Digitandoli cosi da soli daranno le opzioni disponibili.
Il primo ci serve per pulire il database ma siccome abbiamo un db per ogni dominio dovremmo specificare sempre il file di configurazione che andiamo a controllare, quindi per controllare il db di serenity.it:
mailserver#> dbmail-util -ay -f /etc/dbmail_serenityIT.conf
Per quello di apollo.com:
mailserver#> dbmail-util -ay -f /etc/dbmail_apolloCOM.conf
Stessa cosa per listare gli utenti:
mailserver#> dbmail-users -l -f /etc/dbmail_serenityIT.conf
o
mailserver#> dbmail-users -l -f /etc/dbmail_apolloCOM.conf
Se volessimo cancellare un utente del dominio serenity.it
mailserver#> dbmail-users -d nomeutente -f /etc/dbmail_serenityIT.conf
per modificare la password di un utente
mailserver#> dbmail-users -c nomeutente -w “password” -f /etc/dbmail_serenityIT.conf
E via via cosi.
Mi sembra a posto. Adesso non ci resta che configurare i nostri client di posta con le informazioni corrette e avremo un bel server di posta che lavorerà per sempre.
Potremmo anche creare un server solo per ldap e postrgresql, uno per postfix e dbmail, basterà utilizzare il nome macchina nelle configurazioni anziché localhost.
Bisognerà comunque compilare il software dbmail su tutte le macchine che daranno il servizio di posta smtp/pop3/imap (non serve per le macchine db e ldap).
Per ulteriori approfondimenti su dbmail si può andare sul sito dove troveremmo molta documentazione utile per configurare al meglio il server.
Luca