====== Cadeau bonus ====== Pour ceux qui ne seraient pas satisfaits de la façon dont nous avons interfacé Sympa avec Postfix, voici une autre piste qui préserve d'avantage les ressources système en cas de « spam storm ». ===== Les transports ===== Nous le savons, il est possible de définir des transports particuliers dans le fichier ''master.cf'' de postfix. Nous pouvons en définir un certain nombre qui font référence à ''/usr/lib/sympa/bin/queue''. Voici ce que nous pouvons ajouter dans notre ''master.cf'' : # # Les « pipes » sympa # ou # Les transports du gestionnaire de listes sympa # sympalist unix - n n - - pipe flags=RF user=sympa argv=/usr/lib/sympa/bin/queue ${user}@${extension} symparequest unix - n n - - pipe flags=RF user=sympa argv=/usr/lib/sympa/bin/queue ${user}-request@${extension} sympaeditor unix - n n - - pipe flags=RF user=sympa argv=/usr/lib/sympa/bin/queue ${user}-editor@${extension} sympasubscribe unix - n n - - pipe flags=RF user=sympa argv=/usr/lib/sympa/bin/queue ${user}-subscribe@${extension} sympaunsubscribe unix - n n - - pipe flags=RF user=sympa argv=/usr/lib/sympa/bin/queue ${user}-unsubscribe@${extension} sympabounce unix - n n - - pipe flags=RF user=sympa argv=/usr/lib/sympa/bin/bouncequeue ${user}@${extension} Nous reconnaissons des syntaxes assez proches de celles que nous avons vues dans ''/etc/mail/sympa.aliases''. Il nous faudra réaliser une « map » des transports à emprunter suivant l'adresse du message à envoyer à Sympa. ===== Alias virtuels ===== Nous allons exploiter les propriétés des extensions d'adresses, avec le ''recipient_delimiter'' : recipient_delimiter = + Ainsi que les possibilités de réécriture d'adresses avec les alias virtuels de Postfix. La compréhension de ce mécanisme n'est pas d'une grande simplicité, il faut bien le dire. ==== Extension d'adresse ==== Si nous écrivons quelque chose comme ''%%truc+bidule@undomaine.quelconque%%'', la partie à gauche du ''@'' va être séparée en deux : * la partie à gauche du ''+'' (truc) sera récupérée dans la variable ''${user}'' ; * la partie à droite du ''+'' (bidule) sera récupérée dans la variable ''${extension}''. Compte tenu des transports que nous avons créés dans ''master.cf'', nous voyons bien que cette possibilité va nous servir. ==== Alias virtuels ==== Une table d'alias, nous l'avons compris à force, permet de remplacer une adresse par une autre. Nous pouvons exploiter les expressions régulières dans ces tables, et n'allons pas nous en priver. Créons par exemple un fichier ''/etc/postfix/sympa_virtual_aliases'' qui contiendrait, compte tenu de nos essais précédents, ceci : /^(sympa|listmaster)\@lists\.nain-t\.net$/ $1+lists.nain-t.net@sympalist. /^(liste1)-(request|editor|owner|subscribe|unsubscribe)\@lists\.nain-t\.net$/ $1+lists.nain-t.net@sympa$2. /^(liste1)\@lists\.nain-t\.net$/ $1+lists.nain-t.net@sympalist. /^(sympa|listmaster)\@lists\.machin\.net$/ $1+lists.machin.net@sympalist. /^(liste1)-(request|editor|owner|subscribe|unsubscribe)\@lists\.machin\.net$/ $1+lists.machin.net@sympa$2. /^(liste1)\@lists\.machin\.net$/ $1+lists.machin.net@sympalist. Vous ne lisez toujours pas les expressions régulières dans le texte ? Tant pis pour vous. Soit une adresse qui serait par exemple ''%%liste1-unsubscribe@lists.machin.net%%''. Elle sera remplacée par ''%%liste1+lists.machin.net@sympaunsubscribe%%''. Curieux comme adresse non ? Mais attendons la suite, nous comprendrons mieux plus tard. ===== Transport à la carte ===== Créons un fichier nommé par exemple ''/etc/postfix/sympa_transport_maps'' qui contiendrait ceci : /^.*\@sympalist$/ sympalist: /^.*\@symparequest$/ symparequest: /^.*\@sympaeditor$/ sympaeditor: /^.*\@sympasubscribe$/ sympasubscribe: /^.*\@sympaunsubscribe$/ sympaunsubscribe: /^.*\@sympaowner$/ sympabounce: (Oui ! Encore des expressions régulières). Par exemple, un message desitiné à une adresse qui aurait dans sa partie « domaine » (à droite du ''@'' la valeur ''sympaunsubscribe'' et seulement cette valeur, sera transmise au transport ''sympaunsubscribe''. Reprenons notre exemple précédent. - Postfix a reçu un message pour ''%%liste1-unsubscribe@lists.machin.net%%'' ; - cette adresse a donc été transformée en ''%%liste1+lists.machin.net@sympaunsubscribe%%'' à cause de la table d'alias virtuels ; - la table des transports dit qu'un message dont l'adresse du destinataire se termine par ''sympaunsubscribe'' doit être transmise au transport du même nom ; - le transport en question (''/usr/lib/sympa/bin/queue'' que nous connaissons déjà) va donc recevoir un message avec une adresse de destination de la forme ''%%${user}-unsubscribe@${extension}%%''. * Notre ''${user}'', c'est ''liste1'' ; * notre ''${extension}'', c'est ''lists.machin.net''. L'adresse communiquée au transport est donc finalement ''%%liste1-unsubscribe@lists.machin.net%%''. Astucieux non ? Je vous rassure, votre serviteur n'a pas inventé un truc aussi compliqué (et aussi efficace). Il s'est contenté de le trouver [[http://www.folly.org.uk/sympa/sympa_config_03.html|ici]]. ===== Et finalement... ===== Dans postfix, à part ajouter les transports dans ''master.cf'', il faut invoquer le ''récipient-delimiter'' : recipient_delimiter = + Invoquer la carte des transports : transport_maps=regexp:/etc/postfix/sympa_transport_maps Invoquer la table des alias virtuels : virtual_alias_maps = mysql:/etc/postfix/db/virtual-alias.cf, regexp:/etc/postfix/sympa_virtual_aliases ==== Avantage ==== Cette méthode élimine les expressions plus génériques que nous avions employées dans la première solution, évitant ainsi d'envoyer du spam à sympa (ce qui ne l'est pas), Postfix refusant directement ces messages qui ne sont plus pour lui dans ses destinataires connus. Autrement dit, contrairement à la solution d'origine où un message à ''%%albert@lists.machin.net%%'' aurait été transmis à Sympa et c'est sympa qui l'aurait rejeté, ici, c'est Postfix qui va le rejeter directement. ==== Inconvénient ==== A chaque création d'une nouvelle liste, il faudra intervenir manuellement sur le fichier ''/etc/postfix/sympa_virtual_aliases'' car les alias construits par ''alias_manager.pl'' ne sont ici d'aucune utilité. Comme ce script utilise des « templates tt2 » il reste peut-être un espoir pour qu'un expert trouve un modèle qui apporte une réponse à la question. Faute de quoi, il faut écrire un autre script pour automatiser cette tâche.