Configurer Postfix

Pour Postfix, ça va être un peu plus compliqué. Nous avons vu jusqu'ici des configurations assez simples de Postfix, principalement grâce à ses paramètres par défaut. La liste des paramètres de Postfix est assez impressionnante. Pour s'en convaincre, un postconf montrera tous ces paramètres, avec leurs valeurs par défaut si elles n'ont pas été surchargées dans main.cf. Il y a actuellement pas moins de 525 paramètres…

Nous allons surtout nous intéresser aux paramètres spécifiques à la configuration « virtuelle ». En effet Postfix est conçu pour gérer les domaines virtuels. Il n'y a que 15 paramètres spécifiques, qui commencent tous par le mot virtual :

virtual_alias_domains = $virtual_alias_maps
virtual_alias_expansion_limit = 1000
virtual_alias_maps = $virtual_maps
virtual_alias_recursion_limit = 1000
virtual_destination_concurrency_limit = $default_destination_concurrency_limit
virtual_destination_recipient_limit = $default_destination_recipient_limit
virtual_gid_maps = 
virtual_mailbox_base = 
virtual_mailbox_domains = $virtual_mailbox_maps
virtual_mailbox_limit = 51200000
virtual_mailbox_lock = fcntl
virtual_mailbox_maps = 
virtual_minimum_uid = 100
virtual_transport = virtual
virtual_uid_maps = 

  • virtual_uid_maps et virtual_gid_maps représentent respectivement l'UID et le GID de l'utilisateur qui doit accéder à ces boîtes virtuelles, vmail (500:500) dans notre cas ;
  • virtual_minimum_uid est l'UID minimum à utiliser lorsque l'on utilise plusieurs identités pour la remise du courrier. Nous ne ferons pas aussi compliqué, tous nos comptes virtuels sont gérés par l'utilisateur vmail et la valeur 500 conviendra parfaitement ;
  • virtual_transport indique le LDA (MDA) utilisé pour la remise du courrier virtuel. Comme pour la remise locale, Postfix possède un agent de livraison, mais nous utiliserons celui de Dovecot ;
  • virtual_mailbox_base indique la base du chemin d'accès aux répertoires des comptes virtuels. Chez nous : /home/virtual/mail ;
  • virtual_mailbox_domain donnera la liste des domaines virtuels gérés, à récupérer dans MySQL ;
  • virtual_mailbox_maps fournit le chemin relatif au Maildir (à ajouter à virtual_mailbox_base) à récupérer dans MySQL ;
  • virtual_alias_maps, les alias, à récupérer dans MySQL ;

Postfix et MySQL

Pour que Postfix puisse causer à MySQL et réciproquement, il y a plusieurs choses à faire :

  • apprendre à Postfix le langage SQL ;
  • trouver un lieu où les deux interlocuteurs peuvent communiquer. Postfix est en cage et MySQL non. Il y a trois façons de contourner ce problème :
    • placer le socket Unix de MySQL dans la cage de Postfix, mais ce n'est pas une très bonne solution. MySQL ne communiquera pas qu'avec Postfix ;
    • utiliser non pas un socket Unix mais un socket réseau. Ça fonctionne, mais peut-être pas de façon aussi rapide qu'un socket Unix ;
    • utiliser le service proxy de Postfix, qui est justement là pour permettre de passer des informations entre la cage de Postfix et le reste du système.

Les requêtes SQL

Tout d'abord, il faut installer le paquet postfix-mysql

aptitude install postfix-mysql

Ensuite, il faut rédiger des fichiers qui permettront à Postfix d'interroger MySQL sur les domaines, les alias et les boites aux lettres qu'il a en charge.

Les domaines virtuels

Dans la table domains nous avons la liste des domaines virtuels à gérer. Postfixadmin prévoit divers drapeaux :

l> select * from domain;
+------------+----------------+---------+-----------+----------+-------+-----------+----------+---------------------+---------------------+--------+
| domain     | description    | aliases | mailboxes | maxquota | quota | transport | backupmx | created             | modified            | active |
+------------+----------------+---------+-----------+----------+-------+-----------+----------+---------------------+---------------------+--------+
| ALL        |                |       0 |         0 |        0 |     0 | NULL      |        0 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |      1 |
| nain-t.net | Domaine public |       0 |         0 |        0 |     0 | virtual   |        0 | 2008-07-15 16:15:31 | 2008-07-15 16:15:31 |      1 |
+------------+----------------+---------+-----------+----------+-------+-----------+----------+---------------------+---------------------+--------+
  • backupmx permet de savoir si le serveur doit agir pour ce domaine en tant que destination (valeur 0) ou en tant que relais, c'est à dire en MX de « backup » (valeur 1) ;
  • active permet de désactiver (valeur 0) un domaine sans pour autant le détruire.

Nous créons un fichier /etc/postfix/db/mysql_virtual_domains_maps.cf qui permettra à Postfix d'interroger MySQL sur ce point et qui sera de la forme :

user = vmail
password = epikoi
hosts = localhost
dbname = vmail
query = SELECT domain FROM domain WHERE domain='%s' and backupmx = '0' and active = '1'

Les alias

De la même manière, créons un fichier /etc/postfix/db/mysql_virtual_alias_maps.cf dont le contenu sera le suivant :

user = vmail
password = epikoi
hosts = localhost
dbname = vmail
query = SELECT goto FROM alias WHERE address='%s' and active = '1'

Les boites aux lettres

Enfin, les chemins d'accès aux répertoires Maildir. Un fichier /etc/postfix/db/mysql_virtual_mailbox_maps.cf :

user = vmail
password = epikoi
hosts = localhost
dbname = vmail
query = SELECT CONCAT(maildir, 'Maildir/') FROM mailbox WHERE username='%s' and active = '1'

le proxy de Postfix

Le service proxy de Postfix s'utilise assez simplement. Il faut cependant l'informer des lectures de paramètres qu'il doit prendre en charge. Commençons par voir quelle est sa configuration par défaut :

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

Nous allons donc maintenant modifier dans /etc/postfix/main.cf les trois paramètres qui nous concernent :

virtual_alias_maps = proxy:mysql:/etc/postfix/db/mysql_virtual_alias_maps.cf
virtual_mailbox_domains = proxy:mysql:/etc/postfix/db/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/db/mysql_virtual_mailbox_maps.cf

Sans oublier les UID et GID de l'utilisateur vmail :

virtual_minimum_uid = 500
virtual_uid_maps = static:500
virtual_gid_maps = static:500

Ni la partie commune du chemin d'accès aux Maildirs :

virtual_mailbox_base = /home/virtual/mail

Vérification

Nous allons utiliser l'agent de livraison virtual de Postfix pour faire un essai. C'est possible avec Dovecot. virtual est même capable de créer un Maildir qui n'existe pas encore.

Nous envoyons un message à sysop@nain-t.net :

~# mail sysop@nain-t.net
Subject: test postfix virtuel
c'est bon
.
Cc: 

Tout en observant les logs :

Jul 16 10:29:02 cyrus postfix/pickup[2953]: F186C4006BF: uid=0 from=<root>
Jul 16 10:29:02 cyrus postfix/cleanup[2982]: F186C4006BF: message-id=<20080716082901.F186C4006BF@cyrus.nain-t.net>
Jul 16 10:29:02 cyrus postfix/qmgr[2954]: F186C4006BF: from=<root@cyrus.nain-t.net>, size=320, nrcpt=1 (queue active)
Jul 16 10:29:05 cyrus postfix/smtpd[2990]: connect from localhost[127.0.0.1]
Jul 16 10:29:05 cyrus postfix/smtpd[2990]: 609494012E5: client=localhost[127.0.0.1]
Jul 16 10:29:05 cyrus postfix/cleanup[2982]: 609494012E5: message-id=<20080716082901.F186C4006BF@cyrus.nain-t.net>
Jul 16 10:29:05 cyrus postfix/smtpd[2990]: disconnect from localhost[127.0.0.1]
Jul 16 10:29:05 cyrus amavis[2137]: (02137-02) Passed CLEAN, <root@cyrus.nain-t.net> -> <sysop@nain-t.net>, Message-ID: <20080716082901.F186C4006BF@cyrus.nain-t.net>, mail_id: z4aQN+eLCjhF, Hits: 0.43, queued_as: 609494012E5, 3384 ms
Jul 16 10:29:05 cyrus postfix/smtp[2986]: F186C4006BF: to=<sysop@nain-t.net>, relay=127.0.0.1[127.0.0.1]:10024, delay=3.6, delays=0.21/0.03/0.01/3.4, dsn=2.6.0, status=sent (250 2.6.0 Ok, id=02137-02, from MTA([127.0.0.1]:10025): 250 2.0.0 Ok: queued as 609494012E5)
Jul 16 10:29:05 cyrus postfix/qmgr[2954]: F186C4006BF: removed
Jul 16 10:29:05 cyrus postfix/qmgr[2954]: 609494012E5: from=<root@cyrus.nain-t.net>, size=763, nrcpt=1 (queue active)
Jul 16 10:29:05 cyrus postfix/virtual[2992]: 609494012E5: to=<sysop@nain-t.net>, relay=virtual, delay=0.31, delays=0.15/0.07/0/0.08, dsn=2.0.0, status=sent (delivered to maildir)
Jul 16 10:29:05 cyrus postfix/qmgr[2954]: 609494012E5: removed

Et nous devons retrouver le message à sa place :

:~# cd /home/virtual/mail/nain-t.net/sysop/Maildir/new/
cyrus:/home/virtual/mail/nain-t.net/sysop/Maildir/new# ls
1216196945.V305I3400083M657329.cyrus
cyrus:/home/virtual/mail/nain-t.net/sysop/new# cat 1216196945.V305I3400083M657329.cyrus
Return-Path: <root@cyrus.nain-t.net>
X-Original-To: sysop@nain-t.net
Delivered-To: sysop@nain-t.net
Received: from localhost (localhost [127.0.0.1])
    by cyrus.nain-t.net (Postfix) with ESMTP id 609494012E5
    for <sysop@nain-t.net>; Wed, 16 Jul 2008 10:29:05 +0200 (CEST)
X-Virus-Scanned: Debian amavisd-new at cyrus.nain-t.net
Received: from cyrus.nain-t.net ([127.0.0.1])
    by localhost (cyrus.nain-t.net [127.0.0.1]) (amavisd-new, port 10024)
    with ESMTP id z4aQN+eLCjhF for <sysop@nain-t.net>;
    Wed, 16 Jul 2008 10:29:02 +0200 (CEST)
Received: by cyrus.nain-t.net (Postfix, from userid 0)
    id F186C4006BF; Wed, 16 Jul 2008 10:29:01 +0200 (CEST)
To: sysop@nain-t.net
Subject: test postfix virtuel
Message-Id: <20080716082901.F186C4006BF@cyrus.nain-t.net>
Date: Wed, 16 Jul 2008 10:29:01 +0200 (CEST)
From: root@cyrus.nain-t.net (root)

c'est bon

Transport dovecot

Le transport virtual fonctionne, mais avec, nous perdons quelques fonctionnalités propres à Dovecot :

  • l'utilisation de Sieve ;
  • la gestion des quotas, si nous désirons la mettre en œuvre. En effet, Postfix ne gère pas les quotas, son auteur estimant que ce n'est pas aux MTA de le faire.

Dovecot, nous l'avons vu dans le chapitre précédent, propose l'outil /usr/lib/dovecot/deliver. Cet outil peut être aussi bien utilisé pour le transport local que pour le transport virtuel. Il n'est d'ailleurs pas inutile et même conseillé de lire la documentation de Dovecot à ce sujet, ainsi que son intégration avec Postfix

Nous ajoutons donc dans /etc/postfix/master.cf les lignes suivantes :

#
# Dovecot deliver
#
dovecot   unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${recipient}

Et dans /etc/postfix/main.cf :

# Virtual transport Dovecot
dovecot_destination_recipient_limit = 1
virtual_transport = dovecot

Nous demandons à Postfix de recharger sa configuration avec un postfix reload des familles et nous essayons :

# mail sysop@nain-t.net
Subject: test transport virtuel dovecot
c'est encore bon
.
Cc: 

Les logs :

Jul 16 11:07:13 janus postfix/pickup[3029]: C59184006BF: uid=0 from=
Jul 16 11:07:13 janus postfix/cleanup[3076]: C59184006BF: message-id=<20080716090713.C59184006BF@janus.nain-t.net>
Jul 16 11:07:13 janus postfix/qmgr[3030]: C59184006BF: from=, size=337, nrcpt=1 (queue active)
Jul 16 11:07:15 janus postfix/smtpd[3083]: connect from localhost[127.0.0.1]
Jul 16 11:07:15 janus postfix/smtpd[3083]: 74FAA4000B3: client=localhost[127.0.0.1]
Jul 16 11:07:15 janus postfix/cleanup[3076]: 74FAA4000B3: message-id=<20080716090713.C59184006BF@janus.nain-t.net>
Jul 16 11:07:15 janus postfix/qmgr[3030]: 74FAA4000B3: from=, size=780, nrcpt=1 (queue active)
Jul 16 11:07:15 janus amavis[2137]: (02137-03) Passed CLEAN,  -> , Message-ID: <20080716090713.C59184006BF@janus.nain-t.net>, mail_id: TmCa1TrEXu4h, Hits: 0.626, queued_as: 74FAA4000B3, 1732 ms
Jul 16 11:07:15 janus postfix/smtp[3079]: C59184006BF: to=, relay=127.0.0.1[127.0.0.1]:10024, delay=2, delays=0.17/0.03/0.01/1.7, dsn=2.6.0, status=sent (250 2.6.0 Ok, id=02137-03, from MTA([127.0.0.1]:10025): 250 2.0.0 Ok: queued as 74FAA4000B3)
Jul 16 11:07:15 janus postfix/qmgr[3030]: C59184006BF: removed
Jul 16 11:07:15 janus postfix/smtpd[3083]: disconnect from localhost[127.0.0.1]
Jul 16 11:07:15 janus deliver(sysop@nain-t.net): msgid=<20080716090713.C59184006BF@janus.nain-t.net>: saved mail to INBOX
Jul 16 11:07:15 janus postfix/pipe[3084]: 74FAA4000B3: to=, relay=dovecot, delay=0.26, delays=0.09/0.02/0/0.15, dsn=2.0.0, status=sent (delivered via dovecot service)
Jul 16 11:07:15 janus postfix/qmgr[3030]: 74FAA4000B3: removed

Le message est remis, avec dovecot, cette fois-ci, pour la livraison virtuelle.

Dernière modification:: le 03/03/2009 à 19:48
   
 
Cette création est mise à disposition sous un contrat Creative Commons. Creative Commons License