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 ;Pour que Postfix puisse causer à MySQL et réciproquement, il y a plusieurs choses à faire :
proxy
de Postfix, qui est justement là pour permettre de passer des informations entre la cage de Postfix et le reste du système.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.
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'
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'
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 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
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
Le transport virtual
fonctionne, mais avec, nous perdons quelques fonctionnalités propres à Dovecot :
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.