News Ticker

Postfix in alta affidabilità e massima performance con heartbeat, LVS ed ldirectord (4 di 4)

postfix    linux-ha    lvs L’ultima fase del progetto prevede l’installazione di Postfix su tutti i real server ed il loro bilanciamento attraverso ldirectord. Postfix verrà configurato in modo che le caselle risiedano in un’area condivisa ed i profili dei domini e delle caselle vengano registrati in maniera centralizzata all’interno di un database MySQL. Il tutto verrà gestito dall’interfaccia web offerta dal programma postfixadmin.

Requisito essenziale per la riuscita di questa fase del progetto è la disponibilità di un server per lo storage e di un database che siano condivisi ed accessibili da tutti i real server, così come illustrato nello schema riassuntivo presentato nel primo articolo di questa serie.

Configurazione dello storage condiviso via NFS

Ai fini della buona riuscita del progetto è essenziale che le caselle di posta che verranno servite dalla batteria di server risiedano fisicamente nella stessa posizione. Questo significa che la directory nella quale il servizio postfix di ciascun real server scriverà i messaggi monterà uno storage comune. Questo potrà essere uno share NFS (Network File System), un NAS (Network Attached Storage) o un qualsiasi altro supporto di memorizzazione che sia condivisibile.

Nel caso in oggetto, lo storage comune è di tipo NFS e condivide una cartella nominata “mail” erogata dal server 192.168.0.150. La directory locale nella quale sarà montato tale share è /usr/local/virtual e quindi la riga da aggiungere in ciascun real server nel file /etc/fstab è:

192.168.0.150:/mail     /usr/local/virtual    nfs    rw,bg,vers=3    0 0

I questo modo ad ogni riavvio il filesystem NFS verrà automaticamente montato. Per effettuare il primo mount è sufficiente lanciare il comando come segue:

mount /usr/local/virtual

Configurazione del database condiviso con postfixadmin

Per fare in modo che tutti i real server possano leggere i profili in maniera centralizzata sarà necessario predisporre un database MySQL con una struttura adeguata a supportare la registrazione di tutti i dati relativi al server di posta. Tale server non potrà essere uno dei real server (così come per lo storage condiviso), in quanto una situazione simile annullerebbe la ridondanza implicita nella soluzione sviluppata sinora.

Esiste un progetto Open Source denominato postfixadmin che consente di creare e gestire il database relativo ad un server di posta Postfix attraverso un’intuitiva interfaccia web. Tale software è disponibile presso l’indirizzo http://postfixadmin.sourceforge.net/ e può essere installato su una qualsiasi macchina che possieda un webserver apache installato (ad esempio uno dei real server configurati nello scorso articolo). Una volta reperito il pacchetto sarà sufficiente decomprimerlo nella cartella relativa alla document root del sito erogato da apache:

cd /var/www
wget http://kent.dl.sourceforge.net/sourceforge/postfixadmin/postfixadmin-2.2.1.1.tar.gz
tar -xzvf postfixadmin_2.2.1.1.tar.gz
ln -s postfixadmin-2.2.1.1 postfixadmin

Sul server MySQL andrà creato il database relativo a postfix, attivando la console mysql:

mysql -u root -p

e lanciando i comandi SQL di creazione ed accesso relativi al database:

mysql> CREATE DATABASE postfix;
mysql> CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'password_scelta';
mysql> GRANT ALL PRIVILEGES ON `postfix` . * TO 'postfix'@'192.168.0.50';
mysql> GRANT ALL PRIVILEGES ON `postfix` . * TO 'postfix'@'192.168.0.51';
mysql> GRANT ALL PRIVILEGES ON `postfix` . * TO 'postfix'@'192.168.0.52';
mysql> FLUSH PRIVILEGES;

Da notare come per l’accesso vengono configurati TUTTI i real server, in quanto ciascuno di questi dovrà poter accedere al database per la gestione delle informazioni dei profili. Nel file config.inc.php andranno quindi configurate le informazioni d’accesso al database modificando le seguenti righe:

$CONF['configured'] = true;
$CONF['database_type'] = 'mysql';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'chosen_password';
$CONF['database_name'] = 'postfix';

Collegandosi alla pagina di setup http://192.168.0.50/postfixadmin/setup.php verranno effettuati tutti i controlli sul sistema. Se questi avranno esito positivo, lo script creerà tutte le tabelle necessarie nel database postfix e consentirà di creare l’utente amministratore direttamente dall’interfaccia web. L’ultimo accorgimento necessario, prima di procedere con l’utilizzo dell’interfaccia, sarà quello di cancellare il file setup.php dalla directory di postfixadmin:

cd /var/www/postfixadmin
rm setup.php

La configurazione lato MySQL è così completa ed è accessibile attraverso l’interfaccia web. Da questa si potranno creare i domini, le caselle e gli alias che il server di posta dovrà gestire.

Installazione e configurazione di Postfix

L’installazione e la configurazione di Postfix deve essere effettuata su ciascuno dei server reali in maniera identica. Essa comprende il pacchetto base ed il modulo per l’integrazione con mysql:

apt-get install postfix postfix-mysql

La directory in cui i file di configurazione vengono registrati è /etc/postfix ed il file essenziale per il funzionamento di postfix è mail.cf. All’interno di questo file andrà definito il metodo di accesso ai profili ed alle risorse. Nel dettaglio i parametri essenziali da configurare riguardano quali reti fanno parte del sistema e quindi potranno sfruttare il mailserver per l’invio dei messaggi:

mynetworks = 127.0.0.0/8 192.168.0.0/24

Dove verranno archiviati i messaggini di posta ricevuti (mount NFS condiviso):

use_mbox = no
home_mailbox = /usr/local/virtual

E dove potranno essere reperite le informazioni relative ai profili:

virtual_alias_maps = mysql:/etc/postfix/mysql/virtual_alias_maps.cf
virtual_gid_maps = static:106
virtual_mailbox_base = /usr/local/virtual
virtual_mailbox_domains = mysql:/etc/postfix/mysql/virtual_domains_maps.cf
virtual_mailbox_limit = 1151200000
virtual_mailbox_maps = mysql:/etc/postfix/mysql/virtual_mailbox_maps.cf
virtual_minimum_uid = 105
virtual_transport = virtual
virtual_uid_maps = static:105

La dicitura mysql: indica che le informazioni relative al parametro sono contenute nel file con estensione cf indicato. Nel dettaglio i file indicati andranno creati nel path /etc/postfix/mysql come segue:

/etc/postfix/mysql/virtual_alias_maps.cf :

user = postfix
password = password_scelta
hosts = 192.168.0.200
dbname = postfix
table = alias
select_field = goto
where_field = address

/etc/postfix/mysql/virtual_domains_maps.cf :

user = postfix
password = password_scelta
hosts = 192.168.0.200
dbname = postfix
table = domain
select_field = description
where_field = domain
additional_conditions = and backupmx = '0' and active = '1'

/etc/postfix/mysql/virtual_mailbox_maps.cf :

user = postfix
password = password_scelta
hosts = 192.168.0.200
dbname = postfix
table = mailbox
select_field = maildir
where_field = username
additional_conditions = and active = '1'

Come è facilmente intuibile quanto indicato nei vari file sono i dati di accesso al database con i relativi nomi di tabella, di campo e le condizioni per estrapolare le informazioni relative ad alias, domini e mailbox servite da Postfix. Prima di avviare il servizio è necessaria un’ultima precisazione in merito ai permessi. Infatti Postfix scriverà nella cartella indicata nel parametro home_mailbox attraverso il suo utente, “postfix” appunto, che è stato creato durante l’installazione del pacchetto :

id postfix
uid=105(postfix) gid=106(postfix) gruppi=106(postfix),1(daemon)

Questo comporta che l’utente postfix ed il gruppo postfix devono avere lo stesso uid di sistema su tutti i real server, poiché ciascuno di questi si troverà nella condizione di scrivere nell’area condivisa. Essenziale sarà quindi assegnare la cartella /usr/local/virtual all’utente postfix:

chown postfix:postfix /usr/local/virtual

e che l’id dell’utente e del gruppo sia allineato su tutti i real server. Se le utenze hanno id disallineati è possibile correggere la situazione con i seguenti comandi:

groupmod -g 106 postfix
usermod -u 105 -g 106 postfix

Terminati questi ultimi controlli sarà possibile avviare il servizio postfix su ciascun real server:

/etc/init.d/postfix start

Aggiunta del servizio postfix ad ldirectord

A completamento del progetto l’attenzione viene spostata sui server nei quali è configurato il servizio di bilanciamento in alta affidabilità. All’interno del file /etc/ha.d/ldirectord.cf andranno così aggiunte le righe relative al servizio smtp:

virtual=192.168.0.100:25
real=192.168.0.50:25 gate
real=192.168.0.51:25 gate
real=192.168.0.52:25 gate
service=smtp
scheduler=wlc
persistent=600
protocol=tcp

Rimandando all’articolo precedente per i dettagli relativi a ciascun parametro dichiarato va solamente precisato che il tipo di scheduler selezionato è quello di default, “wlc”, ossia Weighted Least-Connection, che assegna più lavori ai server con minor numero di lavori attivi ed in base al peso che è stato loro assegnato. La configurazione verrà automaticamente attivata al salvataggio del file per via delle impostazioni illustrate nello scorso articolo e dopo alcuni secondi sarà possibile verificare come le nuove regole siano attive:

/sbin/ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.0.100:80 rr
-> 192.168.0.50:80              Route   1      0          0
-> 192.168.0.51:80              Route   1      0          0
-> 192.168.0.52:80              Route   1      0          0
TCP  192.168.0.100:25 wlc persistent 600
-> 192.168.0.50:25              Route   1      0          0
-> 192.168.0.51:25              Route   1      0          0
-> 192.168.0.52:25              Route   1      0          0

Quanto visualizzato conferma che il bilanciamento sta avvenendo per la porta 25 su tutti e tre i server reali configurati.

Test di funzionamento

Così come per il servizio apache, la prima verifica effettuabile sui server reali è quella di mettersi in ascolto sui log di postfix e controllare che le richieste pervenute all’indirizzo bilanciato siano correttamente distribuite:

tail -f /var/log/mail.info

Nei log scritti e visualizzati si dovranno distinguere due diverse tipologie di richieste pervenute, la prima rappresenta connessioni volte all’utilizzo del mail server per il ricevimento o la spedizione di un messaggio:

...
...
Oct  9 12:32:33 real-server-1 postfix/smtpd[30095]: 9325D106103: client=mail.xxxxxxxx.xxx[XX.XXX.XX.XXX]
Oct  9 12:32:33 real-server-1 postfix/cleanup[29792]: 9325D106103: message-id=<449745e7dc352554f0cc511e7cece2ce@localhost.localdomain>
Oct  9 12:32:33 real-server-1 postfix/qmgr[23253]: 9325D106103: from=<sender@xxxxxxxx.xxx>, size=1820, nrcpt=1 (queue active)
Oct  9 12:32:33 real-server-1 postfix/smtpd[30095]: disconnect from mail.xxxxxxxx.xxx[XX.XXX.XX.XXX]
...
...

La seconda tipologia rappresenta le connessioni effettuate dal bilanciatore volte a capire se il real server è responsivo e può ricevere lavori:

...
...
Oct  9 12:32:34 real-server-1 postfix/smtpd[30099]: connect from ha-balancer-1[192.168.0.1]
Oct  9 12:32:34 real-server-1  postfix/smtpd[30099]: disconnect from ha-balancer-1[192.168.0.1]
...
...

Chiaramente un ulteriore test consiste nello spedire dei messaggi attraverso il server e verificarne il corretto recapito.

Conclusioni

Il progetto presentato può chiaramente essere migliorato ed esteso attraverso l’introduzione di nuove funzionalità per Postfix come antispam e antivirus o con l’aggiunta di nuovi servizi bilanciati come pop3 e imap. Tali soluzioni non sono state descritte in questa serie in quanto oltre ad essere documentate in maniera esaustiva altrove non rappresentano l’obiettivo primario del progetto. La finalità primaria dei quattro articoli presentati è stata quella di dare una traccia piuttosto dettagliata di quelle che sono le potenzialità dei prodotti opensource nell’ambito di soluzioni in alta affidabilità.

La serie comprende questi articoli :

Postfix in alta affidabilità e massima performance con heartbeat, LVS ed ldirectord (1 di 4)
Postfix in alta affidabilità e massima performance con heartbeat, LVS ed ldirectord (2 di 4)
Postfix in alta affidabilità e massima performance con heartbeat, LVS ed ldirectord (3 di 4)
Postfix in alta affidabilità e massima performance con heartbeat, LVS ed ldirectord (4 di 4)

Nota :

Questo articolo è originariamente apparso su Tux Journal nell'Ottobre 2008.