Hébergement de sites virtuels avec Postfix


Objectifs de ce document

Ce document ne concerne que les versions 2.0 ou supérieures de Postfix.

Ce document donne une vue d'ensemble de la façon dont Postfix peut être employé pour accueillir des domaines Internet multiples, dont la livraison finale se fait sur la machine elle-même et/ou pour transférer le courrier vers d'autres destinations.

Il ne décrit pas seulement les mécanismes de livraison de Postfix mais donne des liens pour utiliser des logiciels de livraison étrangers à Postfix.

Les sujets suivants sont abordés :

Hébergement canonique et hébergement d'autres domaines

La plupart des systèmes Postfix sont la destination finale de seulement quelques noms de domaine. Ceci inclut le nom de machine, [l'adresse IP] de la machine et parfois le nom du domaine parent. Le reste de ce document se réferera à ces domaines comme domaines canoniques. Ils correspondent généralement à la classe d'adresses "domaine local" de Postfix tel que décrit à la page ADDRESS_CLASS_README.

En plus des domaines canoniques, Postfix peut être configuré pour être la destination finale de plusieurs autres domaines. Ces domaines sont appelés "hébergés", car ils ne sont pas directement associés au nom de la machine. Ces domaines hébergés correspondent généralement à la classe d'adresses "domaine virtuel d'alias de postfix et/ou à la classe d'adresses domaine virtuel de boîtes-aux-lettres comme défini à la page ADDRESS_CLASS_README.

Mais attendez, il y a mieux!. Postfix peut être configuré pour être le serveur MX de secours d'autres domaines. Dans ce cas, Postfix n'est pas la destination finale de ces domaines. Il conserve le courrier lorsque le serveur MX principal ne fonctionne pas, et transfère le courrier dès qu'il fonctionne de nouveau. Cette fonctionnalité est utilisée avec la classe d'adresses domaine relayé comme définie à la page ADDRESS_CLASS_README.

Finalement, Postfix peut être configuré comme machine de retransmission du courrier à travers Internet. Evidemment, Postfix n'est pas la destination finale de ces messages. Cette fonction est disponible pour les clients et/ou utilisateurs autorisés et est implémentée par la classe d'adresses domaine par défaut définie à la page ADDRESS_CLASS_README.

Fichiers locaux et bases de données en réseau

L'exemple ci-dessous utilise des tables de correspondances issues de fichiers locaux tels des bases DBM ou Berkeley. Elles sont faciles à déboguer avec la commande postmap :

Exemple: postmap -q info@exemple.com hash:/etc/postfix/virtual

Reportez-vous à la page LDAP_README, MYSQL_README et PGSQL_README pour étudier le remplacement des fichiers locaux par ces bases. Le lecteur est fortement incité à faire fonctionner son système avec des fichiers locaux avant de migrer vers des bases de données réseau et à utiliser la commande postmap pour vérifier que ces bases de données produisent exactement le même résultat que les fichiers locaux.

Exemple: postmap -q info@exemple.com ldap:/etc/postfix/virtual.cf

Aussi simple que possible : domaines partagés, comptes UNIX

La plus simple méthode pour ajouter un domaine supplémentaire est de l'ajouter aux domaines listés dans le paramètre de configuration mydestination et d'ajouter les noms d'utilisateur dans le fichier des mots de passe UNIX.

Cette approche ne fait aucune distinction entre les domaines canoniques et hébergés. Chaque utilisateur reçoit le courrier de tous les domaines.

Dans les exemples suivants, nous utiliserons "exemple.com" comme domaine hébergé par la machine locale.

/etc/postfix/main.cf:
    mydestination = $myhostname localhost.$mydomain ... exemple.com

Les limites de cette approche sont :

L'exemple qui suit fournit une solution pour ces deux limites.

Exemple d'ALIAS virtuel Postfix : domaines séparés, comptes du système UNIX

Avec l'approche décrite dans ce paragraphe, chaque domaine hébergé peut avoir ses propres informations, adresses électroniques, etc. Toutefois, il utilise toujours les comptes du système UNIX pour ses livraisons locales.

Avec les domaines d'alias virtuels, chaque adresse hébergée est un alias d'un compte du système UNIX ou d'une adresse extérieure. L'exemple suivant montre comment utiliser ce mécanisme pour le domaine exemple.com.

 1 /etc/postfix/main.cf:
 2     virtual_alias_domains = exemple.com ...autres domaines hébergés...
 3     virtual_alias_maps = hash:/etc/postfix/virtual
 4 
 5 /etc/postfix/virtual:
 6     postmaster@exemple.com postmaster
 7     info@exemple.com       joe
 8     sales@exemple.com      jane
 9     # Décommentez l'entrée suivante pour implémenter une adresse de collecte
10     # @exemple.com         jim
11     ...alias virtuel pour d'autres domaines...

Notes :

Lancez la commande "postmap /etc/postfix/virtual" après modification du fichier virtual, puis lancez la commande "postfix reload" après avoir modifié le fichier main.cf.

Note : les alias virtuels peuvent correspondre à une adresse locale, à une adresse extérieure ou au deux. Ils ne doivent pas nécessairement correspondre à des comptes du système UNIX de votre machine.

Pour plus de détails sur les fichiers d'alias et en paticulier pour les destinataires multiples, reportez-vous à la page de manuel virtual(5).

Les alias virtuels résolvent un problème : ils permettent à chaque domaine d'avoir ses propres adresses de courrier. Mais il en reste un : chaque adresse virtuelle correspond à un compte UNIX. A chaque nouvelle adresse, vous augmentez les comptes du système UNIX.

Exemple de BOITES-AUX-LETTRES virtuelle : domaines separés, comptes non-UNIX

Lorsqu'un système accumule les domaines et les utilisateurs, il devient moins souhaitable de créer pour chaque utilisateur un compte sur le système UNIX.

Avec l'agent de livraison de courrier virtual(8) de Postfix, chaque adresse de destination peut avoir sa propre boîte-aux-lettres virtuelle. Contrairement aux domaines d'alias virtuels, les domaines de boites-aux-lettres virtuelles ne nécessitent pas d'avoir une correspondance pour chaque adresse de destination, et les propriétaires d'une boîte aux lettres n'ont pas besoin de disposer d'un compte du système UNIX.

L'agent de livraison de courrier virtual(8) de Postfix examine le chemin de la boîte-aux-lettre de l'utilisateur, l'uid et le gid via des tables séparées suivant l'adresse de destination. Le répertoire de livraison est déterminé en terminant le chemin de la boîte-aux-lettres par "/".

Si vous trouvez saugrenue l'idée d'utiliser plusieurs tables, souvenez-vous que vous pouvez stocker les informations dans une base SQL. Si vous prenez ce chemin, lisez le paragraphe "fichiers locaux et bases de données" de cette page.

Ci-dessous un exemple d'un domaine virtuel de boîtes-aux-lettres "exemple.com" :

 1 /etc/postfix/main.cf:
 2     virtual_mailbox_domains = exemple.com ...autres domaines...
 3     virtual_mailbox_base = /var/mail/vhosts
 4     virtual_mailbox_maps = hash:/etc/postfix/vmailbox
 5     virtual_minimum_uid = 100
 6     virtual_uid_maps = static:5000
 7     virtual_gid_maps = static:5000
 8     virtual_alias_maps = hash:/etc/postfix/virtual
 9 
10 /etc/postfix/vmailbox:
11     info@exemple.com    exemple.com/info
12     sales@exemple.com   exemple.com/sales/
13     # Décommentez la ligne ci-dessous pour implémenter une adresse de collecte.
14     # @exemple.com      exemple.com/catchall
15     ...virtual mailboxes for more domains...
16 
17 /etc/postfix/virtual:
18     postmaster@exemple.com postmaster

Notes:

Lancez la commande "postmap /etc/postfix/virtual" après avoir modifié le fichier virtual, lancez la commande "postmap /etc/postfix/vmailbox" après modification du fichier vmailbox puis lancez "postfix reload" après avoir modifié le fichier main.cf.

Note : le courrier livré est ajouté avec les privilèges des UID/GID indiqués par les paramètres virtual_uid_maps et virtual_gid_maps. Les versions 2.0 et supérieures de Postfix ne créent pas les répertoires de boîtes-aux-lettres dans des répertoires positionnés en écriture pour tout le monde  vous devez les créer par avance. Postfix peut être en mesure de créer les boîtes-aux-lettres lui-même suvant les permissions d'écriture sur le répertoire parent, mais il est préférable de les créer avant.

Pour plus de détail à propos de l'agent de livraison virtuel, reportez-vous à la page de manuel virtual(8).

Stockage en boîte-aux-lettres non-Postfix : domaines separés, comptes non-UNIX

il s'agit d'une variante de l'exemple de boîtes-aux-lettres virtuelles. Comme précédemment, chaque domaine hébergé peut avoir ses propres boîtes-aux-lettres.

Comme un logiciel extérieur à Postfix sera utilisé pour la livraison finale, certains concepts de Postfix sont nécessaire pour la bonne cohésion de l'ensemble. Pour plus de détails, reportez-vous au paragraphe sur la classe "domaine de boîtes-aux-lettres virtuelles de la page ADDRESS_CLASS_README.

Ce paragraphe décrit le point-de-vue de Postfix. Consultez les pages LMTP_README et MAILDROP_README pour plus d'information sur Cyrus le rejet du courrier.

Dans l'exemple ci-dessous, le courrier du domaine hébergé exemple.com est envoyé à un agent extérieur à Postfix :

 1 /etc/postfix/main.cf:
 2     virtual_transport = ...voir ci-dessous...
 3     virtual_mailbox_domains = exemple.com ...autres domaines...
 4     virtual_mailbox_maps = hash:/etc/postfix/vmailbox
 5     virtual_alias_maps = hash:/etc/postfix/virtual
 6 
 7 /etc/postfix/vmailbox:
 8     info@exemple.com    whatever
 9     sales@exemple.com   whatever
10     # Décommentez la ligne ci-dessous pour implémenter une adresse de collecte.
11     # Configurez le stockage de la boîte-aux-lettres pour accepter toutes les adresses.
12     # @exemple.com      whatever
13     ...boîtes-aux-lettres virtuelles pour d'autres domaines...
14 
15 /etc/postfix/virtual:
16     postmaster@exemple.com postmaster

Notes :

Lancez la commande "postmap /etc/postfix/virtual" après avoir modifié le fichier virtual, lancez "postmap /etc/postfix/vmailbox" après avoir modifié le fichier vmailbox et lancez la commande "postfix reload" après avoir modifié le fichier main.cf.

Domaines de transfert de courrier

Certains fournisseurs hébergent des domaines qui n'ont pas (ou peu) de boîtes-aux-lettres locales. Le but principal est de transférer le courrier de ces domaines ailleurs. L'exemple ci-dessous montre comment paramètrer le domaine comme un domaine de transfert :

 1 /etc/postfix/main.cf:
 2     virtual_alias_domains = exemple.com ...autre domaines hébergés...
 3     virtual_alias_maps = hash:/etc/postfix/virtual
 4 
 5 /etc/postfix/virtual:
 6     postmaster@exemple.com postmaster
 7     joe@exemple.com        joe@quelque-part
 8     jane@exemple.com       jane@quelque-part-ailleurs
 9     # Décommentez la ligne ci-dessous pour implémenter une adresse de collecte
10     # @exemple.com         jim@encore-un-autre-site
11     ...alias virtuels pour d'autres domaines...

Notes :

Lancez la commande "postmap /etc/postfix/virtual" après avoir modifié le fichier virtual et lancez la commande "postfix reload" après avoir modifié le fichier main.cf.

Pour plus de détails sur les fichiers d'alias virtuels et en particulier pour les adressages multiples, reportez-vous à la page de manuel virtual(5).

Listes de diffusion

Les exemples proposés ci-avant ont montré comment redirigé le courrier du postmaster du domaine virtuel vers le postmaster local. Vous pouvez utiliser la même méthode pour toutes les adresses vers une adresse locale ou extérieure.

Il y a une limitation majeure : les alias et boîtes-aux-lettres virtuelles ne peuvent livrer directement une liste de diffusion comme majordomo. La solution est d'utiliser de créer des alias virtuels redirigeant vers l'agent de livraison local :

/etc/postfix/main.cf:
    virtual_alias_maps = hash:/etc/postfix/virtual

/etc/postfix/virtual:
    listname-request@exemple.com listname-request
    listname@exemple.com         listname
    owner-listname@exemple.com   owner-listname

/etc/aliases:
    listname: "|/chemin/vers/majordomo ..."
    owner-listname: ...
    listname-request: ...

Cet exemple suppose que $myorigin est mentionné dans le paramètre mydestination du fichier main.cf. Si ce n'est pas le cas, renseignez explicitement le nom de domaine dans la partie droite de la table, sinon le courrier n'ira pas au bon domaine.

Pour plus d'information sur l'agent de livraison local, reportez-vous à la page de manuel local(8).

Pourquoi cet exemple emploie-t-il un alias virtuel maladroit au lieu d'utiliser un transport plus élégant ? La principale raison est que le courrier de la liste de diffusion serait rejeté avec la mention "User unknown". Faire fonctionner le transport nécessiterait des entrées statiques dans les tables.

Répondeur automatique

Pour mettre en œuvre un répondeur automatique pour des destinataires virtuels en continuant de livrer le courrier normalement, utilisez une table d'alias virtuels :

/etc/postfix/main.cf:
    virtual_alias_maps = hash:/etc/postfix/virtual

/etc/postfix/virtual:
    user@domain.tld user@domain.tld, user@domain.tld@autoreply.mydomain.tld

Ceci livre le courrier au destinataire et envoie une copie du message à l'adresse qui génère des réponses automatiques. Cette adresse peut correspondre à une autre machine ou être traité localement en mettant en œuvre une entrée dans la table de transport qui livre via un pipe le courrier à destination de autoreply.mydomain.tld à un script qui répond à l'expéditeur.

Ne listez PAS autoreply.mydomain.tld dans mydestination!

/etc/postfix/main.cf:
    transport_maps = hash:/etc/postfix/transport

/etc/postfix/transport:
    autoreply.mydomain.tld  autoreply:

/etc/postfix/master.cf:
    # =============================================================
    # service type  private unpriv  chroot  wakeup  maxproc command
    #               (yes)   (yes)   (yes)   (never) (100)
    # =============================================================
    autoreply unix  -       n       n       -       -       pipe
        flags= user=nobody argv=/path/to/autoreply $sender $mailbox

Ceci appelle /path/to/autoreply avec sur la ligne de commande l'adresse du destinataire et l'adresse du destinataire sous la forme utilisateur@domaine.

Pour plus d'information, reportez-vous à la page de manuel pipe(8) et aux commentaires du fichier master.cf.

Valid HTML 4.01! traduction par Xavier Guimard - Retour au menu