technique:adminsys:mail:archi:communication-conteneurs-mta-mda

Communication entre MTA et MDA

Dovecot et postfix sont dans deux conteneurs séparés, ce qui permet de faire ce qu’on veut de ces conteneurs: les déplacer d’un serveur à l’autre, par exemple. Cependant, il doivent communiquer entre eux, via le protocole LMTP, pour la local delivery. Comme ils sont sur des conteneurs différents, donc sur des machines différentes, ils communiquent nécessairement à l’aide d’un socket TCP/IP (sinon, il aurait été possible d’utiliser un socket UNIX, plus rapide mais local à une machine).

Il y a donc deux enjeux: relier deux conteneurs potentiellement pas sur le même réseau local; et protéger cette communication, car LMTP se fait en clair. Un man-in-the-middle peut donc écouter la communication voire la modifier.

Docker network est donc indiqué car il permet d’automatiser la liaison entre conteneurs, et il ajoute une couche de sécurité (il découpe les paquets TCP/IP en paquets UDP, et il les fait transiter par un tunnel SSL). Cette encapsulation a un coût, mais il est quasi nul lorsque les deux conteneurs sont sur la même machine car il est possible pour docker de refuser l’écoute et donc de ne pas chiffrer la communication. L’architecture est modulaire.

Il s’agit de placer plusieurs conteneurs sur le même réseau, et de leur faire connaître leurs adresses IP respectives. On a une relation client/serveur classique: Dovecot se contente d’exposer ses services et n’a pas besoin de connaître à l’avance l’adresse du conteneur Postfix; mais Postfix doit connaître l’adresse du conteneur Dovecot.

Nous avons choisi d’utiliser bridge1) pour:

  • isoler la communication entre les deux conteneurs, du reste du réseau : cela ne perturbe pas les communications sur l’hôte, et cela évite qu’une machine sur le réseau puisse écouter la conversation entre le MDA et le MTA.
  • évider de gaspiller des adresses IP et de créer des cartes réseau virtuelles.
  • faciliter la résolution DNS, ce que nous utiliserons pour permettre au client (postfix) de trouver l’adresse de son serveur (dovecot).

Nous utilisons le bridge local-mail-delivery dans lequel sont les deux conteneurs pica-mail-mda et pica-mail-mta, ce qui donne:

docker run --name pica-mail-mta \
  --network local-mail-delivery \
  --publish 25:25 \
  pica-mail-mta:latest

et

docker run --name pica-mail-mda \
  --network local-mail-delivery \
  --publish 143:143 \
  --hostname pica-mail-mda \
  pica-mail-mda:latest

Attention, ces commandes sont simplifiées et sont destinées à illustrer la mise en réseau des conteneurs. Dans l’installation de production, il faut fournir d’autres paramètres. Voir la page Déploiement du serveur de mail pour des commandes de déploiement.

Les ports publics 143 et 25 sont donnés à titre d’exemple. A terme, nous utiliserons pas 143 car il correspond à du IMAP sans SSL/TLS, et nous ouvrirons un autre port que le 25 sur le MTA pour permettre du SMTPS.

Il est important de constater qu’on donne un nom d’hôte au conteneur mda: c’est ce qui permettra au MTA (qui en est le client) de le trouver par résolution DNS.


1)
Voir cette page pour plus d’explications.
  • technique/adminsys/mail/archi/communication-conteneurs-mta-mda.txt
  • de qduchemi