5 votes

postfix Dovecot disable lmtp

J'ai 3 serveurs. 1 serveur MX avec postfix et 2 serveurs Dovecot. Le serveur MX reçoit les emails et les sert ensuite par LMTP à un serveur Dovecot spécifique. Toutes les boîtes aux lettres d'un même domaine sont sur le même serveur.

Existe-t-il un moyen de désactiver temporairement LMTP et deffer les messages pour un domaine spécifique ? Par exemple en cas de migration de domaines entre des serveurs Dovecot.

Sur postfix j'utilise transport_maps

transport_maps = mysql:/etc/postfix/sql/transport.cf

Avec cette requête

 query = SELECT concat('lmtp:',servers.address, ':24') FROM servers
         JOIN domains ON (domains.server_id=servers.ID)
         WHERE domains.name LIKE SUBSTRING_INDEX("%s", "@", -1)
         LIMIT 1;

Dovecot écoute lmtp sur le port 24, user_query dans Dovecot est

user_query = SELECT 1
        FROM domains
        JOIN mailboxes ON (domains.ID=mailboxes.domain_id)
        WHERE
            domains.name LIKE '%d'
            AND mailboxes.name LIKE '%n'
            AND domains.server_id='X'
        LIMIT 1;

J'ai vérifié la page de manuel Dovecot user_query, mais il n'y a rien qui puisse m'aider ( http://wiki2.Dovecot.org/UserDatabase y http://wiki2.Dovecot.org/UserDatabase/ExtraFields )

J'ai essayé d'ajouter une condition à user_query. "AND domains.enable_lmtp = 1" mais ensuite le serveur postfix a transmis avec succès l'email au serveur Dovecot et le serveur Dovecot a renvoyé à l'expéditeur l'erreur "User doesn't exists".

Ensuite, j'ai essayé d'ajouter la même condition à la requête du serveur sur le serveur postfix. La requête n'a rien retourné (pas de transport), l'email a été supprimé et dans le journal, il était écrit

postfix/virtual[724]: fatal: bad string length 0 < 1: virtual_mailbox_base =
postfix/master[32263]: warning: process /usr/libexec/postfix/virtual pid 724 exit status 1
postfix postfix/master[32263]: warning: /usr/libexec/postfix/virtual: bad command startup -- throttling

J'espérais que postfix mettrait les messages en file d'attente différée, mais il ne l'a pas fait. Les messages ont été supprimés. La même chose s'est produite lorsque j'ai changé le serveur de transport pour une adresse inexistante.

Alors, est-ce que je fais quelque chose de mal ? Y a-t-il un moyen de résoudre mon problème ?

Mon postconf -n

alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
config_directory = /etc/postfix
content_filter = smtp-amavis:[127.0.0.1]:10024
mydestination = $myhostname, localhost.$mydomain, localhost
smtpd_client_restrictions = permit_mynetworks, reject_unknown_client_hostname, reject_unknown_reverse_client_hostname
smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname, reject_non_fqdn_hostname,
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination, reject_unknown_recipient_domain, reject_non_fqdn_recipient, check_policy_service unix:/var/spool/postfix/postgrey/socket, check_policy_service unix:private/recipient_restrictions
smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination
smtpd_sender_restrictions = permit_mynetworks, reject_non_fqdn_sender, reject_unknown_sender_domain
smtpd_tls_cert_file = /etc/postfix/smtpd.cert
smtpd_tls_key_file = /etc/postfix/smtpd.key
smtpd_tls_loglevel = 0
smtpd_tls_received_header = yes
smtpd_use_tls = yes
transport_maps = mysql:/etc/postfix/sql/transport.cf
unknown_local_recipient_reject_code = 550
virtual_mailbox_domains = mysql:/etc/postfix/sql/mailbox_domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/sql/mailbox_maps.cf

5voto

masegaloeh Points 17760

Ce problème peut être résolu soit par postfix, soit par Dovecot.

  1. Dans Dovecot, vous devez configurer le service LMTP pour qu'il réponde avec un rejet temporaire 4XX (pour votre domaine "spécial") lorsque postfix envoie un email.
  2. Dans postfix, vous devez configurer postfix pour qu'il diffère le courriel si le domaine du destinataire correspond à votre domaine "spécial".

Option 1 n'est pas possible parce que - contrairement à postfix - Dovecot ne peut pas être configuré pour émettre l'erreur tempfail à un domaine particulier. Voir la discussion sur [Dovecot] Configuration du code de rejet LMTP .

Para option 2 vous devez transporter le domaine "spécial" vers une adresse qui ne fonctionne pas, par exemple vous pouvez l'envoyer sur un port fermé dans votre serveur LMTP. . Pour cela, vous avez besoin d'un deuxième transport_maps avec une requête comme celle-ci

#/etc/postfix/sql/transport-defer.cf

query = SELECT concat('lmtp:',servers.address, ':2424') FROM servers
        JOIN domains ON (domains.server_id=servers.ID)
        WHERE domains.name LIKE SUBSTRING_INDEX("%s", "@", -1)
        AND domains.enable_lmtp != 1
        LIMIT 1;

Dans la requête ci-dessus, j'utilise le port 2424 comme port fermé pour que postfix puisse différer le message.

Ensuite, mettez-le à côté de mysql:/etc/postfix/sql/transport.cf

#main.cf
transport_maps = mysql:/etc/postfix/sql/transport.cf mysql:/etc/postfix/sql/transport-defer.cf

PS : Parce que vous n'avez pas de boîte aux lettres dans le serveur postfix, il serait préférable d'utiliser relay_domains y relay_recipient_maps pour remplacer virtual_mailbox_domains y virtual_mailbox_maps . Voir documentation sur les classes de domaine relais .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X