BigBlueButton Greenlight v3 : problème d'envoi de mail via le smtp de infomaniak

Bonjour,

Nous (https://bbb.futuretic.fr) avons migré notre instance big blue button avec Greenlight en v3 sans trop de soucis, par contre depuis notre passage de Gandi (grrr) à Infomaniak, l’envoi de mail via SMTP ne marche plus :-/

On a tenté des remontées de ici et ici mais sans succès jusqu’à maintenant, ça marche avec un autre smtp (type g**gle) et on peut envoyer des mails depuis le serveur avec la commande openssl par exemple …

Est-ce que quelqu’un-e aurait rencontré également le problème ?

Je n’ai pas rencontré le problème mais…

### SMTP CONFIGURATION
# Emails are required for the basic features of Greenlight to function.
# Please refer to your SMTP provider to get the values for the variables below
SMTP_SENDER_EMAIL=febot@mondomain.fr
SMTP_SENDER_NAME=Monprojet
SMTP_SERVER=mail.infomaniak.com
SMTP_PORT=465
SMTP_DOMAIN=mondomain.fr
SMTP_USERNAME=febot@mondomain.fr
SMTP_PASSWORD=monpassword
SMTP_AUTH=PLAIN
SMTP_STARTTLS_AUTO=true
#SMTP_STARTTLS=true
#SMTP_TLS=true
SMTP_SSL_VERIFY=true

Cette configuration est étrange.

Quelques infos sur les conventions SMTP telles que je les comprends :

  • 25 est généralement utilisé pour le trafic inter-serveurs SMTP - aka « la fédération »
  • 465 est généralement utilisé pour les l’envoi d’email par les clients avec une encapsulation TLS traditionnelle. C’est ajd ce qui est le + recommandé.
  • 587 est généralement utilisé pour les envois d’email par les clients en clair, avec la possibilité de passer de manière opportuniste sur du TLS en cours de session (aka STARTTLS).

Ta configuration indique SMTP_PORT=465, il faut donc très probablement dé-commenter SMTP_TLS=true et les directives STARTTLS ne sont pas nécessaires.

Ensuite tu as l’erreur suivante :

Failed - Unable to connect to SMTP Server - Net::ReadTimeout

C’est possible qu’en essayant de se connecter en clair sur un port qui fait du TLS, le client SMTP attende de voir un contenu particulier qui n’arrive jamais et finisse par timeout. Mais l’erreur peut aussi venir d’ailleurs, comme par exemple un firewall qui bloque un port, etc.

Malheureusement l’erreur ne donne pas assez d’information pour conclure, il faudrait collecter d’avantage d’information.

Depuis l’hôte, tu peux utiliser tcpdump pour filtrer le trafic sur le port 465 du bridge docker utilisé par ton conteneur (docker0 souvent sauf si tu utilises docker-compose). Tu verras si une connexion TCP arrive à se faire ou non. Si elle arrive à se faire, alors ce sont tes paramètres TLS/connexion qui posent problème. Si elle ne se fait pas, c’est que c’est un problème « d’aiguillage réseau ».

Toujours depuis l’hôte, tu peux prendre le parti aussi de debugguer avec le logiciel strace qui permet d’observer les appels systèmes (syscall) qui sont fait par le processus (ton application Greenlight) - y compris les processus qui sont dans un conteneur. Il te faut récupérer son PID (quelque chose comme ps aux|grep ruby ou ps aux|grep greenlight, je ne sais pas quel est son nom). Supposons que ton pid est 4233, tu peux tracer ses appels réseaux, ainsi que ceux de ses enfants, avec strace -e trace=network -f -p 4233.

La commande strace est très polyvalente, tu pourras trouver ses différentes configurations dans son manuel ou via des tutos sur Internet.

Voilà un exemple des infos qu’elle peut te donner sur un exemple simplifié :

$ strace -e trace=network -- curl "http://monip.org"
...
connect(5, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("212.129.20.209")}, 16) = -1 EINPROGRESS (Operation now in progress)
...
sendto(5, "GET / HTTP/1.1\r\nHost: monip.org\r"..., 72, MSG_NOSIGNAL, NULL, 0) = 72
recvfrom(5, "HTTP/1.1 200 OK\r\nDate: Fri, 06 O"..., 102400, 0, NULL, NULL) = 552

Même si ça ne résout pas ton problème, ça devrait te fournir des infos pour enrichir ton ticket, et, :crossed_fingers: , attirer l’attention des maintainers sur ton problème.

1 « J'aime »

Je conseille les tutos de Julia Evans https://jvns.ca/strace-zine-v3.pdf .

hey,

En effet, la config smtp évoquée était étrange, on a testé des configs plus conventionnelles comme celles évoquées par @quentin sans plus de succès, je vais néanmoins double check …

  • Merci pour ces pistes, <3 tcpdump, je ne connaissais pas strace, je connaissais Julia Evans :slight_smile:
    J’investigue et reviendrai par ici quand questions ou réponses à partager

++

Yop,

Merci pour ces précieuses infos :slight_smile:

Avec Benjamin, je m’occupe du serveur, et je pense qu’il dort comme tout le monde à cette heure :sweat_smile:

J’ai testé avec tcpdump sur le port 465 du container et j’ai obtenu ça, ce qui reste assez cryptique pour moi :

root@bbbbox ~ # tcpdump -i br-2d4f6c07234c tcp port 465 -vv
tcpdump: listening on br-2d4f6c07234c, link-type EN10MB (Ethernet), capture size 262144 bytes
02:45:55.033301 IP (tos 0x0, ttl 64, id 53229, offset 0, flags [DF], proto TCP (6), length 60)
    172.18.0.4.57754 > mail.infomaniak.com.submissions: Flags [S], cksum 0x8f17 (incorrect -> 0x5338), seq 1833280861, win 64240, options [mss 1460,sackOK,TS val 1141911759 ecr 0,nop,wscale 7], length 0
02:45:55.067265 IP (tos 0x0, ttl 50, id 0, offset 0, flags [DF], proto TCP (6), length 60)
    mail.infomaniak.com.submissions > 172.18.0.4.57754: Flags [S.], cksum 0xa38f (correct), seq 773621594, ack 1833280862, win 65160, options [mss 1460,sackOK,TS val 772262016 ecr 1141911759,nop,wscale 8], length 0
02:45:55.067286 IP (tos 0x0, ttl 64, id 53230, offset 0, flags [DF], proto TCP (6), length 52)
    172.18.0.4.57754 > mail.infomaniak.com.submissions: Flags [.], cksum 0x8f0f (incorrect -> 0xcecd), seq 1, ack 1, win 502, options [nop,nop,TS val 1141911793 ecr 772262016], length 0
02:46:00.072597 IP (tos 0x0, ttl 64, id 53231, offset 0, flags [DF], proto TCP (6), length 52)
    172.18.0.4.57754 > mail.infomaniak.com.submissions: Flags [F.], cksum 0x8f0f (incorrect -> 0xbb3f), seq 1, ack 1, win 502, options [nop,nop,TS val 1141916798 ecr 772262016], length 0
02:46:00.106689 IP (tos 0x0, ttl 50, id 21024, offset 0, flags [DF], proto TCP (6), length 52)
    mail.infomaniak.com.submissions > 172.18.0.4.57754: Flags [F.], cksum 0xa886 (correct), seq 1, ack 2, win 255, options [nop,nop,TS val 772267055 ecr 1141916798], length 0
02:46:00.106720 IP (tos 0x0, ttl 64, id 53232, offset 0, flags [DF], proto TCP (6), length 52)
    172.18.0.4.57754 > mail.infomaniak.com.submissions: Flags [.], cksum 0x8f0f (incorrect -> 0xa76d), seq 2, ack 2, win 502, options [nop,nop,TS val 1141916832 ecr 772267055], length 0
^C
6 packets captured
6 packets received by filter
0 packets dropped by kernel

Que sont ces flags ? Je n’ai pas l’impression qu’il y ait des infos sur le TLS.

J’ai installé strace aussi, je ne connaissais pas, mais lorsqu’on lance la commande de check de Greenlight (qui nous donne donc le ReadTimeout), il créé des nouveaux processus qui ne sont pas des enfants des processus liés à Ruby au départ, du coup je ne vois pas comment lancer strace dynamiquement sur ces nouveaux PID et ne peut donc pas avoir + d’infos :frowning:

Notez que j’ai testé avec la config que vous recommendez : 465 / commenté les lignes STARTTLS / décommenté TLS.

En tous cas c’est déjà un petit pas vers + d’infos :slight_smile:

Je ne suis pas un expert de tcpdump donc corrigez-moi si je me trompe. Bon d’abord les checksums invalides, c’est parce que leur calcul est/serait offloaded à ta carte réseau (pour des raisons de perf), donc on peut ignorer.

Ensuite on voit bien que ton serveur envoie un paquet SYN de taille 0 à Infomaniak (Flags [S]) :

02:45:55.033301 IP (tos 0x0, ttl 64, id 53229, offset 0, flags [DF], proto TCP (6), length 60)
    172.18.0.4.57754 > mail.infomaniak.com.submissions: Flags [S], cksum 0x8f17 (incorrect -> 0x5338), seq 1833280861, win 64240, options [mss 1460,sackOK,TS val 1141911759 ecr 0,nop,wscale 7], length 0

Infomaniak répond avec un SYN+ACK (Flags [S.] - le point veut dire ACK) de taille 0 :

02:45:55.067265 IP (tos 0x0, ttl 50, id 0, offset 0, flags [DF], proto TCP (6), length 60)
    mail.infomaniak.com.submissions > 172.18.0.4.57754: Flags [S.], cksum 0xa38f (correct), seq 773621594, ack 1833280862, win 65160, options [mss 1460,sackOK,TS val 772262016 ecr 1141911759,nop,wscale 8], length 0

Et enfin ton serveur termine le 3-way handskake de TCP avec un ACK (Flags [.]) :

02:45:55.067286 IP (tos 0x0, ttl 64, id 53230, offset 0, flags [DF], proto TCP (6), length 52)
    172.18.0.4.57754 > mail.infomaniak.com.submissions: Flags [.], cksum 0x8f0f (incorrect -> 0xcecd), seq 1, ack 1, win 502, options [nop,nop,TS val 1141911793 ecr 772262016], length 0

Donc en quelques millisecondes tu as construit une connexion TCP fonctionnelle. Si un firewall avait du se mettre en travers de ta route, il aurait très probablement empêcher ce 3-way handshake de se faire en bloquant un des paquets (probablement le premier SYN tout simplement).

Donc tu as bien un tunnel de donné fonctionnel entre tes deux serveurs. Maintenant que se passe t’il ensuite ? Et bien… pas grand chose. Du moins pendant exactement 5 secondes - soit une éternité pour un réseau - il ne se passe rien du tout.

Et donc exactement 5 secondes plus tard, ton serveur se décide à proprement fermer la connexion TCP avec Infomaniak en envoyant un paquet FIN (Flags [F.]) - et un ACK qui traine - qui indique la fermeture de la connexion TCP :

02:46:00.072597 IP (tos 0x0, ttl 64, id 53231, offset 0, flags [DF], proto TCP (6), length 52)
    172.18.0.4.57754 > mail.infomaniak.com.submissions: Flags [F.], cksum 0x8f0f (incorrect -> 0xbb3f), seq 1, ack 1, win 502, options [nop,nop,TS val 1141916798 ecr 772262016], length 0

Et le serveur d’Infomaniak de confirmer la bonne fermeture de la connexion avec un paquet FIN + ACK (Flags [F.]). La connexion est alors officiellement fermée dans le sens ton serveur → Infomaniak :

02:46:00.106689 IP (tos 0x0, ttl 50, id 21024, offset 0, flags [DF], proto TCP (6), length 52)
    mail.infomaniak.com.submissions > 172.18.0.4.57754: Flags [F.], cksum 0xa886 (correct), seq 1, ack 2, win 255, options [nop,nop,TS val 772267055 ecr 1141916798], length 0

Et un dernier ACK pour confirmer la fermeture de la connexion dans le sens Infomaniak → ton serveur :

02:46:00.106720 IP (tos 0x0, ttl 64, id 53232, offset 0, flags [DF], proto TCP (6), length 52)
    172.18.0.4.57754 > mail.infomaniak.com.submissions: Flags [.], cksum 0x8f0f (incorrect -> 0xa76d), seq 2, ack 2, win 502, options [nop,nop,TS val 1141916832 ecr 772267055], length 0

En résumé :

  • Tu ouvres une connexion sans encombre avec Infomaniak
  • Il ne se passe rien pendant 5 secondes
  • Tu ferme la connexion avec Infomaniak sans encombre

Mon hypothèse : le client attendait que le serveur lui envoie un truc, et quant au serveur, il attendait que le client lui envoie un truc.

Typiquement, dans le cas du TLS implicite (port 465 aka submissions), on peut voir avec un openssl s_client -connect xxxx que c’est au client de commencer à envoyer de la donnée. On voit par exemple sur ce bout de capture que le client, après avoir terminé le 3-way handshake envoie un paquet de 349 octets (Flags [P.] - flag push) qui doit être l’initialisation de la connexion TLS :

17:34:49.040270 IP (tos 0x0, ttl 64, id 44496, offset 0, flags [DF], proto TCP (6), length 52)
    rincevent.lan.42908 > scorpio.site.deuxfleurs.fr.urd: Flags [.], cksum 0xc816 (correct), seq 1, ack 1, win 502, options [nop,nop,TS val 2787908762 ecr 1842650114], length 0
17:34:49.040629 IP (tos 0x0, ttl 64, id 44497, offset 0, flags [DF], proto TCP (6), length 349)
    rincevent.lan.42908 > scorpio.site.deuxfleurs.fr.urd: Flags [P.], cksum 0x1b1b (correct), seq 1:298, ack 

Par contre, si je fais du STARTTLS, je commence avec le protocole en clair SMTP, et dans ce cas c’est au serveur de commencer à envoyer de la donnée. Ici on voit mon client qui termine le 3-way handshake et le serveur d’envoyer directement l’en-tête SMTP (avec un flag push aussi Flags [P.]) :

18:45:04.073710 IP (tos 0x0, ttl 64, id 14136, offset 0, flags [DF], proto TCP (6), length 52)
    rincevent.lan.55802 > mail.infomaniak.com.submission: Flags [.], cksum 0xaf19 (correct), seq 1, ack 1, win 502, options [nop,nop,TS val 2282564785 ecr 309300980], length 0
18:45:04.115427 IP (tos 0x0, ttl 50, id 3775, offset 0, flags [DF], proto TCP (6), length 89)
    mail.infomaniak.com.submission > rincevent.lan.55802: Flags [P.], cksum 0x2a26 (correct), seq 1:38, ack 1, win 255, options [nop,nop,TS val 309301031 ecr 2282564785], length 37

En-tête qui ressemble à ça :

220 mail.infomaniak.com ESMTP ready

Donc moi votre cas me fait penser que :

  • votre client Greenlight a été configuré, d’une manière ou d’une autre, pour du STARTTLS sur le port 465 (ce qui n’est pas du tout du tout standard)
  • étant donné le protocole SMTP, votre client Greenlight attend donc que le serveur lui envoie de la donnée
  • le serveur a été configuré pour du TLS implicite sur le port 465 (comme il se doit)
  • étant donné le protocole TLS, le serveur attend donc que le client lui envoie de la donnée
  • rien ne se passe car les deux parties s’attendent mutuellement
  • si le client Greenlight ne reçoit aucune donnée pendant 5 secondes alors qu’il s’attend à en recevoir, il timeout

Mon conseil : si vous n’arrivez pas à conigurer Greenlight en 465/submissions/TLS implicite, essayez de le configurer en 587/submission/STARTTLS en mettant SMTP_PORT=587, c’est aussi supporté par Infomaniak.

2 « J'aime »

Eh bien encore merci pour ces infos précieuses et claires, j’ai appris qqch :slight_smile:

Du coup, je me suis lancé dans le test sur port 587, et en tcpdump ce port… rien.
Par contre, meme dump sur le port 465.
Mes modifs n’ont pas été prises en compte, j’ai pourtant redémarré Greenlight, et dans le doute (inutile), le serveur.
Puis j’ai changé l’url du serveur infomaniak par un truc qui n’existe pas… mais tjs un dump identique, sur le port 465 et pointant vers infomaniak.
Super.

Du coup j’ai viré le fichier .env de Greenlight qui sert de config, et même topo. Il s’en cogne.
Voilà une piste donc.
Greenlight est censé prendre en compte toute la config du .env au démarrage de son docker, mais on dirait qu’il n’est pas enclin à le faire et garde en cache qque part une config précédente qui ne fonctionne pas…

Il a bien fonctionné il y a qques semaines lorsque j’ai changé la config pour passer de Gandi à Infomaniak, mais depuis, il ignore les modifs.
Je vais tenté un ticket chez Greenlight, merci encore pour l’aide apportée, je vous tiens au courant si de nouvelles avancées.

1 « J'aime »

C’est bien ce que je pensais. Si vous publiez vos fichiers de conf/déploiement, je suis curieux de jeter un oeuil. Si vous utilisez du docker-compose, regardez les variables d’environnement que vous injectez depuis votre fichier docker-compose.yml, elles pourraient prendre la précédence. Et d’ailleurs un fichier .env est normalement +/- une façon simplifiée d’injecter des variables d’environnement depuis un fichier (dans l’esprit, je suis bien d’accord, en principe ce sont des mécanismes bien différents). Parfois les fichiers .env sont déclinés en .env.producation et .env.development. Assurez-vous de vérifier l’existence/le contenu de ces derniers, assurez-vous que votre greenlight démarre dans le bon mode (production et non development). Enfin, si vous avez bien une conf vers mail.infomaniak.com, une technique bourrin pour trouver où elle est sur votre disque est grep -rn / 'mail.infomaniak.com'. Bon vous êtes pas obligés de commencer par slash, vous pouvez commencer par les dossiers réservés à Greenlight/BBB dans un premier temps…

1 « J'aime »

Re.
C’est bon ça re-fonctionne :slight_smile:

Dans la doc de Greenlight (l’ancienne, car elle a changé il y a qques mois), la recommendation pour prendre en compte les modifs du .env étaient de simplement redémarrer le conteneur via :

docker restart greenlight-v3

Et cela fonctionnait jusqu’à il y a peu, peut-etre jusqu’à la version 3.0.4 de Greenlight.

Il y a un fichier docker-compose.yml au passage, avec l’appel env_file: .env.

Du coup, sur les conseils de la personne qui m’a répondu sur le ticket chez Greenlight, j’ai tenté aussi :

docker-compose restart

Mais tjs pas de prise en compte, donc je me dis que je vais le stopper complètement, en mode RAGE-QUIT.
Donc :

docker-compose down && docker-compose up -d

Et là, il prend bien en compte le .env puisqu’il doit faire une sorte de reset je suppose (pas un rebuild).

J’ai même pu tester les 2 configs, celle sur le port 587 et celle sur le 465, les 2 fonctionnent…

Tout ça pour ça j’ai envie de dire, mais je n’oublierai pas cette subtlité quand je verrai un .env même si la recommandation est le restart…

Encore merci pour votre aide !

2 « J'aime »

Yes, merci @quentin @stephane, super miaou !

2 « J'aime »

Pour référence :

https://docs.docker.com/engine/reference/commandline/compose_restart/

If you make changes to your compose.yml configuration, these changes are not reflected after running this command. For example, changes to environment variables (which are added after a container is built, but before the container’s command is executed) are not updated after restarting.

Merci @quentin, c’est effectivement une info que j’avais dans un coin de la tête, mais comme le restart fonctionnait jusqu’à récemment, je considérais que c’était tjs le cas…
Ca m’apprendra :slight_smile: