Privacy Policy

Stella inattivaStella inattivaStella inattivaStella inattivaStella inattiva
 

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:

 

  1. 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.
  2. 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:

 

  1. 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.
  2. 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
  3. 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:

 

  1. ldap funziona correttamente ottenendo il nome account postmaster dalla base di ricerca esatta e da un interrogazione non diretta ma traminte dbmail.
  2. 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.itpostmaster@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.

 

http://www.dbmail.org

 

Luca

C e r t i f i c a z i o n i