[.NET] Envoi de mail derrière un reverse proxy ?

Envoi de mail derrière un reverse proxy ? [.NET] - C#/.NET managed - Programmation

Marsh Posté le 31-01-2021 à 11:01:21    

Bonjour HFR :)
 
Je rencontre un petit souci avec l'envoi de mail depuis mes applications web (ASP .NET MVC) depuis quelques jours.
C'est le cas du service Rehost, par exemple, ce qui est un peu gênant :o
 
Ces applications comportent des fonctionnalités qui aboutissent à envois de mail aux utilisateurs.
J'ai écrit ça au plus simple : utilisation des classes MailMessage, SmtpClient et SmtpServer avec envoi SSL vers le server SMTP (port 587) de mon fournisseur (OVH).
 
Ca fonctionnait parfaitement en mode classique : serveur web VM unique, trafic HTTP/HTTPS en direct sur le serveur, certificats SSL Let's Encrypt, redirection des ports 80/443 vers la VM serveur web.
Mais j'ai voulu aller un peu plus loin en séparant les applications sur des serveurs séparés, pour réduire les impacts sur les perfs et la sécurité...
Je suis donc passé en configuration Reverse Proxy : serveurs web VM multiples (ports internes personnalisés), trafic HTTP/HTTPS via mon Reverse Proxy, certificat SSL unique Let's Encrypt centralisé sur mon Reverse Proxy, redirection des ports 80/443 vers mon Reverse Proxy.
 
Pour le moment, je n'utilise que le pare-feu des VM (côté OS donc), pas hardware (côté Reverse Proxy ou routeur).
Le reverse proxy est installé sur mon NAS Synology (DS918+ à jour).
 
J'ai l'impression que l'envoi de mail s'est perdu dans l'opération :/
Lorsque je debug en local (SMTP Orange / port 25 / mon compte perso) pas de souci, les mails passent.
Quand les applis tournent en prod (SMTP OVH / port 587 / comptes mails appli), rien de se passe.
Quand les applis tournent en prod (SMTP OVH / port 25 / comptes mails appli), j'ai une erreur timeout (normal : OVH bloque le trafic non SSL)
 
Je pense que la demande arrive bien chez OVH puisque je n'ai pas d'erreur de timeout, juste rien ne se passe :(
Lorsque je tente un envoi de mail à la main depuis le webmail de OVH, je reçois bien les tests envoyés !
 
Une idée de ce que j'aurai foiré ?
 
Je m'en vais poser la question dans la section Réseau aussi, on sait jamais.
N'étant pas expert infra, c'est peut être de ce côté là que ça bloque :(
 
Merci pour votre aide ! :)
:hello:


---------------
La DiBerie | Rehost | Link
Reply

Marsh Posté le 31-01-2021 à 11:01:21   

Reply

Marsh Posté le 31-01-2021 à 11:24:18    

OVH fait pas un filtrage sur l'IP ? Genre que ton IP n'est pas autorisée à envoyer des mails ?
Par contre, tu fais communiquer tes VM entre elles comment : avec les urls du reverse proxy ou avec des IP locales et ports ?
A vu de nez, je dirais que c'est le SMTP qui te renvoie une réponse sur une url pas bonne. Du genre : si tu communiques entre les VM avec de l'IP locale, si ta VM envoie une requête au SMTP avec comme source une IP loocale de VP, le SMTP d'OVH va pas être capable de te renvoyer ses réponses. Je sais pas si je suis très clair.
Mais je pense que c'est plus un pb de conf infra que de dév.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 31-01-2021 à 11:34:07    

Merci pour ta réponse :)
 
A priori, pas de filtrage IP côté OVH activé.
De toute façon, que la requête parte directement de mon serveur web (192.168.a.b) ou de mon NAS (192.168.a.c), l'IP publique reste la même (mon IP Orange 86.x.x.x), de ce côté, la config n'a pas changé.
 
Les VM dialoguent entre elles par des appels locaux (192.168.x.x), étant donné qu'Orange bloque le loopback, je ne peux pas appeler "vm1.diberie.com" depuis "vm2.diberie.com", par exemple.
En réalité si, je peux, en bidouillant mon fichier HOST pour forcer les appels locaux (vm1.diberie.com --> 192.168.a.b).
 
Mais plus j'y réfléchis, plus je pense que c'est une problématique réseau plutôt que dév, oui en effet :jap:


---------------
La DiBerie | Rehost | Link
Reply

Marsh Posté le 31-01-2021 à 11:57:47    

Ah oui, le loopback pas fait par la Livebox, ça m'en a fait perdre des heures à comprendre pourquoi un truc devrait marcher et que c'était pas le cas parce que je faisais mes tests depuis le LAN alors qu'en-dehors, ça marchait  :fou:


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 31-01-2021 à 15:08:33    

:D
C'est ça.
 
Je pense que je vais devoir revoir un peu mes plans et me passer de reverse proxy...


---------------
La DiBerie | Rehost | Link
Reply

Marsh Posté le 31-01-2021 à 15:57:16    

Moi, le reverse proxy pour l'école de ma fille, je l'ai géré via le NAS Synology derrière la Livebox.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 31-01-2021 à 18:48:41    

Ah bah c'est exactement cette installation que j'ai en place :)
 
Une Livebox v4 (routeur / serveur DHCP / pare feu / NAT...) et le Synology derrière (NAS, Reverse Proxy, DynDNS...) :)
 
Je sais que c'est très amateur, mais c'est simplissime à mettre en oeuvre.


---------------
La DiBerie | Rehost | Link
Reply

Marsh Posté le 31-01-2021 à 20:36:49    

Moi, ça fait depuis 7 ans que c'est comme ça, ça marche très bien. On a même ajouté une Overthebox pour agréger la Livebox avec un routeur 4G pour passer de 5-6 Mbps à 40 Mbps ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 01-02-2021 à 10:12:23    

Euh là tu confonds un peu tout et il y a plusieurs problèmes dans ton cas.
Le reverse proxy ne s'occupe que de la redirection HTTP/HTTPS, ton SMTP sortant il est complètement indépendant. Il faut que ta VM/container ait une connectivité à internet pour envoyer des mails. Ca a l'air d'être le cas vu qu'elle arrive à joindre le SMTP d'Orange.
 
Ensuite tu sembles confondre SMTP 25 = non chiffré, SMTP 587 = chiffré, mauvaise nouvelle encore une fois ça n'a rien à voir. Les 2 peuvent être chiffrés, suffit juste d'envoyer la commande STARTSSL au début de l'échange. SMTP 25 est normalement utilisé pour faire communiquer 2 serveurs SMTP entre eux et SMTP 587 pour faire communiquer un client avec un serveur.
Orange bloque toutes les connexions sur le port 25 qui ne sont pas à destination de son propre serveur SMTP d'où le timeout. https://lafibre.info/orange-les-new [...] ez-orange/
 
Tu as pas les logs des connexions au SMTP OVH sur le port 587 ? Tu fais de l'authentification au moins ?

Reply

Marsh Posté le 01-02-2021 à 10:59:27    

Merci pour ces éléments de réponse Je@nb.
 
Oui, la VM est connectée.
 
Je faisais en effet à tort le parallèle SMTP // HTTP, pensant bêtement que le trafic sur le port 25 était implicitement non chiffré (comme le 80) et celui sur les 465/587 chiffré (comme le 443).
 
Pour mes appels SMTP, évidemment oui, j'utilise l'authentification (credentials) fournis par OVH (ou Orange, en localhost) :D
D'ailleurs je confirme aussi faire un mail.Enablessl = true sur les environnements de prod (où je vise donc le port 587), et false sur mon localhost, où je passe par le port 25.
 
Je n'ai pas encore creusé côté OVH, pensant que c'était ma façon de paramétrer mon envoi qui était mauvaise. Je vais aller voir de ce côté-là :jap:


---------------
La DiBerie | Rehost | Link
Reply

Marsh Posté le 01-02-2021 à 10:59:27   

Reply

Marsh Posté le 01-02-2021 à 11:19:33    

En fait pour faire du SSL/TLS sur SMTP tu as 2 moyens, soit c'est implicite parce que le port fait que tu es en SSL par définition (port 465 pour SMTP), ça ressemble à ce que tu as avec HTTP/HTTPS entre le 80 et 443, soit tu es en mode expicite où tu commences la communication en claire et après que le serveur ait annoncé qu'il sait faire du TLS, le client va demander à passer en mode chiffré en envoyant la commande STARTTLS (plus moderne :D).
La classe SmtpClient ne sait pas faire le premier protocole de base d'après la doc : https://docs.microsoft.com/en-us/do [...] ew=net-5.0
Faut donc voir si OVH permet sur son port 587 de faire du STARTTLS ou pas mais vu que leurs docs sont à chier j'ai pas trouvé :D

Reply

Marsh Posté le 01-02-2021 à 12:53:33    

Merci beaucoup Je@nb.
Je regarde ça dans la journée :jap:


---------------
La DiBerie | Rehost | Link
Reply

Marsh Posté le 01-02-2021 à 17:09:30    

Ok, alors là je suis un peu perplexe :o

 

Voici le code issu de Rehost, ASP .NET MVC :
https://rehost.diberie.com/Uploads/2/20210201-170010-0fc51a99-410f-4d87-ac33-946941bf0173.2.min.jpg

 

Voici le code issu d'un projet de test Winforms :
https://rehost.diberie.com/Uploads/2/20210201-170222-5e651ff2-3e1f-48f4-a927-d779cb1b66de.2.min.jpg

 

Le code est "identique"
Juste un peu personnalisé dans le premier cas, posé en vrac dans le 2e, mais les appels sont les mêmes, les credentials aussi (le texte habillement caché en jaune dans le cas 2 provient des clés de config même du cas 1).

 

Je vous le donne en 1000 : l'appli MVC n'envoie rien, mais l'appli Winforms oui ! :ouch:
https://rehost.diberie.com/Uploads/2/20210201-170520-3123b1c0-ca36-452e-bea8-d8bbabb7d8bb.2.min.jpg

 

Les 2 applis tournent sur ma même machine de dev, ici, en local.
Elles ciblent (du coup) bien le même serveur mail OVH.
L'une en direct (Winforms), l'autre en passant (je suppose) par IIS Express.
Aucune exception de levée dans les 2 cas. Mes points d'arrêt dans les catch() ne se déclenchent pas.

 

J'en conclue donc que, en effet, mon Reverse Proxy n'a RIEN à voir dans cette histoire, déjà.
J'ai pas trouvé de quoi consulter les logs côté OVH, donc j'ai ouvert un ticket pour demander de l'aide. pas encore de réponse.

 

EDIT : Sur chacune de mes machines d'où l'appli est exécutée (mon poste de dev, ma VM de "test" et ma VM de "prod" ), un telnet vers le serveur OVH est pourtant bien fonctionnel :
http://rehost.diberie.com/Uploads/2/20210201-174611-d1c60f07-6087-4484-87d1-6bec5d7c501b.2.pic.png

 

A ce stade, je pense qu'on peut donc conjecturer qu'il y a vraiment un truc qui bloque côté IIS Express / IIS, non ?


Message édité par DiB91 le 01-02-2021 à 17:48:30

---------------
La DiBerie | Rehost | Link
Reply

Marsh Posté le 02-02-2021 à 00:00:17    

et le code est bien exécuté au moins ? :D
Tu peux tjr faire un wireshark ou autre pour capturer le flux même en SSL tu verras que le début de l'échange
 
ou le mail part bien mais il y a qqch qui plait pas au destinataire et qui le met en quarantaine côté serveur ou spam côté boite de réception

Reply

Marsh Posté le 02-02-2021 à 08:12:28    

Si t'as pas de timeout ni d'exception c'est probablement que le mail part, possible qu'il se fasse choper par autre chose ? (anti spam, etc ?)
Tu es en quelle version de .net ? Pour être sûr de bien faire du tls 1.2.
Pas possible de tester ca avec une lib moins antique que SmtpClient ?


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 02-02-2021 à 10:27:26    

Merci pour vos réponses les gars.
 

Je@nb a écrit :

et le code est bien exécuté au moins ? :D
Tu peux tjr faire un wireshark ou autre pour capturer le flux même en SSL tu verras que le début de l'échange
 
ou le mail part bien mais il y a qqch qui plait pas au destinataire et qui le met en quarantaine côté serveur ou spam côté boite de réception


Ouais ça c'est bon :D
Le point d'arrêt en entrée dans la méthode pope bien, le pas à pas passe bien, le mail.send() passe et on sort de la méthode pépère... mais rien ne se passe après.
J'ai essayé de sniffer avec Fiddler, mais effectivement, j'arrivais pas à capturer la trame puisqu'elle était chiffrée.
 

TotalRecall a écrit :

Si t'as pas de timeout ni d'exception c'est probablement que le mail part, possible qu'il se fasse choper par autre chose ? (anti spam, etc ?)
Tu es en quelle version de .net ? Pour être sûr de bien faire du tls 1.2.
Pas possible de tester ca avec une lib moins antique que SmtpClient ?


Je suis presque convaincu qu'il part de mon serveur oui, mais que quelque chose bloque derrière, puisqu'en Winforms ça passe nickel.
Du coup, je penche vraiment pour une config IIS :??:
Pour l'appli web : ASP .NET MVC sur du .NET Framework 4.8 --> envoi KO
Pour l'appli winforms : .NET Framework 4.7.2 --> envoi OK
Le tout essayé sur 3 machines différentes (Windows 10, Windows Server 2012 R2, Windows Server 2019).
Si je précise bien que je souhaite utiliser SSL, c'est vrai que j'impose pas la version de TLS en place.
Si ça se trouve, il y a une différence implicite à ce niveau-là entre Winforms et ASP .NET MVC :jap:
Je me renseigne :)


---------------
La DiBerie | Rehost | Link
Reply

Marsh Posté le 02-02-2021 à 11:04:28    

Fiddler ça capture aussi des flux non HTTP/HTTPS ?
Wireshark je te dis :D tu verras au moins la connexion jusqu'au STARTTLS et tu verras si elle casse ou pas.
 
Oui le niveau de TLS peut être différent.
Tu peux pas essayer un mail "à la con" genre juste "Ceci est un test" plutôt que ton parsing d'un email template ? :D

Reply

Marsh Posté le 02-02-2021 à 11:16:20    

J'ai capturé un essai avec Wireshark.
J'ai essayé de faire un peu de tri dans les trames, désolé si c'est un peu brouillon.
Je tâcherai par la suite de supprimer ces infos personnelles ...

 

Echange 1 : envoi de mail depuis l'appli MVC, depuis mon poste de dev (192.168.1.132) : mail jamais reçu
https://rehost.diberie.com/Uploads/2/20210202-105937-a46d4bdf-2152-402b-85c2-1a17ad1abc64.2.min.jpg
On voit l'initiation de la communication, le SMTP répond bien, accepte mon authent, on passe en TLS rapidement, et des données sont échangées (probablement le corps du mail).

 

Plus tard (~+4s) d'autres trames TLS 1.2 puis TCP sont échangées avec la même machine :
https://rehost.diberie.com/Uploads/2/20210202-110722-644a76be-0958-41bc-a683-f91bce49ae85.2.min.jpg

 

Je ne saurai pas interpréter le contenu, si il y a erreur ou pas, mais l'enchainement de trames me laisse penser que le contenu part bien chez OVH.
Malheureusement, ce qu'il se passe après et ce que OVH décide de faire avec ces trames, je n'ai pas la main dessus :(

 

Je vais tenter de capturer le même échange depuis l'appli Winforms, voir si quelque chose saute aux yeux.

 

EDIT : Ah bah j'ai croisé ton message :D
Oui bien sûr, l'appli Winforms envoie "<p>Coucou !</p>" :o


Message édité par DiB91 le 02-02-2021 à 11:17:37

---------------
La DiBerie | Rehost | Link
Reply

Marsh Posté le 02-02-2021 à 11:36:01    

Echange 2 : envoi de mail depuis l'appli Winforms, depuis mon poste de dev (192.168.1.132) : mail reçu dans la minute

 

https://rehost.diberie.com/Uploads/2/20210202-113431-ee93ddda-407c-445e-ac90-f4847bd20d82.2.min.jpg
https://rehost.diberie.com/Uploads/2/20210202-113537-71f11f9e-e47f-4b30-b9af-e0b52bdb8c1a.2.min.jpg

 

Les trames ignorées concernaient d'autres appareils.

 

Le séquencement est quasiment identique au précédent : échange TCP (authent) > passage TLS 1.2 > transmission de données > rebascule en TCP > idle
Le contenu est un peu plus court ici parce que le mail est plus court.
Pour moi, rien ne flashe :/


Message édité par DiB91 le 02-02-2021 à 11:38:46

---------------
La DiBerie | Rehost | Link
Reply

Marsh Posté le 02-02-2021 à 11:47:28    

P*TIN  arrêtez-tout !
 
https://rehost.diberie.com/Uploads/2/20210202-114528-19063591-da80-4a99-bf93-557caf085c21.2.min.jpg
 
-->
 
https://rehost.diberie.com/Uploads/2/20210202-114658-d1887d8e-09b9-4740-a89d-ac167ae84a2e.2.min.jpg
 
C'est donc bien ma superbe transfo template HTML qui pose problème :o
 
Bon bah au moins je sais où chercher....


---------------
La DiBerie | Rehost | Link
Reply

Marsh Posté le 02-02-2021 à 13:17:36    

:D haha told you

Reply

Marsh Posté le 02-02-2021 à 14:14:26    

Désolé :o
Effectivement, la transfo HTML de "<p>Coucou</p>" passe chez OVH, mais mes trucs complexes non. Je corrigerai ça quand j'aurai (plus) de temps à passer dessus. Pour le moment, une transfo en texte plein m'ira très bien :jap:
 
Merci à votre aide en tout cas
:)


---------------
La DiBerie | Rehost | Link
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed