Connexion à un serveur SMTP sur localhost:25 sans authentification ?

En 2019, c’est la configuration par défaut de Postfix sur RHEL/CentOS. Postfix se lie uniquement à l’interface de bouclage et rejette toutes les requêtes SMTP qui ne proviennent pas de 127.0.0.0/8. Aucune authentification n’est requise. Je ne suis pas sûr pour Debian, mais j’imagine qu’exim a une configuration par défaut similaire.

Quelques sujets pertinents sur ces forums, provenant d’autres utilisateurs ayant rencontré ce problème :

Il ne semble pas y avoir de sujet expliquant comment configurer cela sur RHEL/CentOS avec les modifications nécessaires à la fois pour Discourse et Postfix, alors je documente cela ici.

Cela ne semble pas être possible avec le script discourse-setup, mais j’ai réussi à faire fonctionner cela.

Tout d’abord, j’ai dû déterminer l’adresse IP de l’hôte Docker telle que la voit le conteneur Docker. Utiliser 127.0.0.1 ne fonctionnera pas car le conteneur Docker verra 127.0.0.1 comme lui-même. Au contraire, nous devons spécifier l’adresse IP ou le nom d’hôte de l’hôte Docker qui exécute le serveur SMTP Postfix, et qui est accessible depuis le conteneur Docker (donc pas l’adresse IP publique de votre hôte Docker si vous ne voulez pas que votre serveur SMTP soit accessible depuis Internet, par exemple).

J’ai extrait l’adresse IP pertinente de l’hôte Docker (172.17.0.1) depuis l’interface docker0 en exécutant la commande suivante sur l’hôte Docker :

[maltfield@osestaging1 ~]$ ip address show docker0
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:80:35:65:a1 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:80ff:fe35:65a1/64 scope link 
       valid_lft forever preferred_lft forever
[maltfield@osestaging1 ~]$

Ensuite, j’ai édité le fichier YAML de mon application Discourse, en définissant “DISCOURSE_SMTP_ADDRESS” sur 172.17.0.1 comme indiqué ci-dessus.

[maltfield@osestaging1 ~]$ cd /var/discourse/
[maltfield@osestaging1 discourse]$ grep SMTP containers/app.yml
  DISCOURSE_SMTP_ADDRESS: 172.17.0.1
  DISCOURSE_SMTP_PORT: 25
  DISCOURSE_SMTP_AUTHENTICATION: none
  DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none
  DISCOURSE_SMTP_ENABLE_START_TLS: false
[maltfield@osestaging1 discourse]$ 

Notez que j’ai d’abord essayé d’utiliser le nom d’hôte interne de Docker host.docker.internal pour cela, mais apparemment, ce nom d’hôte n’est pas disponible pour les utilisateurs de Docker sur Linux :

Comme la configuration par défaut de Postfix sur RHEL/CentOS se lie uniquement à 127.0.0.1 (ce qui est bien), vous devrez modifier /etc/postfix/main.cf pour qu’il se lie également à l’interface docker0 et ajouter ce sous-réseau au groupe mynetworks afin que le trafic SMTP provenant des conteneurs Docker soit accepté par Postfix.

[maltfield@osestaging1 postfix]$ grep -ir '172.17' /etc/postfix/*
/etc/postfix/main.cf:inet_interfaces = 127.0.0.1, 172.17.0.1
/etc/postfix/main.cf:mynetworks = 127.0.0.0/8, 172.17.0.0/16
[maltfield@osestaging1 postfix]$ 

Après ces modifications, reconstruisez Discourse et il devrait maintenant pouvoir envoyer des e-mails via le Postfix de votre hôte Docker.

/var/discourse/launcher rebuild app

Bien que cela fonctionne, j’ai quelques questions :

  1. Existe-t-il une autre variable d’environnement ou un autre nom d’hôte qui pointe déjà vers l’hôte Docker (172.17.0.1 dans ce cas) ?

J’ai remarqué qu’il existe une variable d’environnement DISCOURSE_HOST_IP « injectée » par launcher. Est-il possible de définir cette clé YAML DISCOURSE_SMTP_ADDRESS sur la même valeur que l’autre clé YAML avec quelque chose comme ceci ?

DISCOURSE_SMTP_ADDRESS: $DISCOURSE_HOST_IP
  1. En général, combien est durable l’adresse IP 172.17.0.1 de l’hôte Docker ? Est-elle toujours cette adresse IP sur les systèmes RHEL/CentOS ? Va-t-elle un jour changer pour moi ?