Bonjour,
J'écris un pot ici car j'ai actuellement un problème qui concerne l'envoi de mail à partir d'un container docker.
J'ai un programme python qui nécessite d'envoyer des mails. Le problème est que la connexion au serveur SMTP ne semble pas marcher depuis le container.
root@container:/# python
Python 2.7.9 (default, Jun 29 2016, 13:08:31)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
\> \> \> import smtplib
\> \> \> s = import smtplib
\> \> \> s = smtplib.SMTP('mail.gandi.net', 587)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/smtplib.py", line 256, in __init__
(code, msg) = self.connect(host, port)
File "/usr/lib/python2.7/smtplib.py", line 316, in connect
self.sock = self._get_socket(host, port, self.timeout)
File "/usr/lib/python2.7/smtplib.py", line 291, in _get_socket
return socket.create_connection((host, port), timeout)
File "/usr/lib/python2.7/socket.py", line 571, in create_connection
raise err
socket.error: [Errno 101] Network is unreachable
Le container a accès à internet:
root@container:/# ping mail.gandi.net
PING mail.gandi.net (217.70.184.11): 56 data bytes
64 bytes from 217.70.184.11: icmp_seq=0 ttl=55 time=1.918 ms
Mais les ports 587 et 465 ne sont pas accessibles:
root@24c18768f5b2:/# telnet mail.gandi.net 587
Trying 217.70.184.11...
Par contre, la connexion ssh sur un port non standard (222) marche.
De même que la connexion sur le port 80:
root@container:/# telnet mail.gandi.net 80
Trying 217.70.184.11...
Connected to mail.gandi.net.
L'envoi de mail fonctionne via python sur l'hôte:
root@host:/# telnet mail.gandi.net 587
Trying 2001:4b98:c:521::11...
Connected to mail.gandi.net.
Escape character is '^]'.
220 relay.mail.gandi.net ESMTP Postfix
L'hôte peut se connecter sans problème:
[user@host ~]: python
Python 2.7.9 (default, Jun 29 2016, 13:08:31)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
\> \> \> import smtplib
\> \> \> s = smtplib.SMTP('mail.gandi.net', 587)
\> \> \> s.ehlo()
(250, 'relay4-d.mail.gandi.net\nPIPELINING\nSIZE 35651584\nVRFY\nETRN\nSTARTTLS\nAUTH PLAIN LOGIN\nENHANCEDSTATUSCODES\n8BITMIME\nDSN')
\> \> \> s.starttls()
(220, '2.0.0 Ready to start TLS')
\> \> \>
Un firewall (ufw) est installé mais même désactivé, cela ne semble pas marcher. Pour info, les règles iptables sont visibles
ici.
J'ai bien activé l'envoi de mail dans les options du fournisseur du serveur. Par défaut, c'est désactivé.
Est-ce que l'un d'entre vous aurait des pistes d'investigation pour comprendre d'où vient le problème? Je ne suis pas sur qu'il s'agisse d'un problème venant de mon routage, des règles ipv4/ipv6 ou si ça provient du serveur SMTP. le serveur SMTP de Google ne fonctionne pas non plus.
Merci d'avance
# ipv4/ipv6
Posté par NeoX . Évalué à 2.
ton conteneur semble tenter une connection IPv4
alors que ton hote le fait en IPv6
[^] # Re: ipv4/ipv6
Posté par jnanar (site web personnel) . Évalué à 1.
Bonsoir,
Merci pour ta réponse. Oui, l'hôte est connecté en ipv4 et ipv6 alors que le container est uniquement connecté en ipv4. Est-ce une cause probable du problème? J'ignore si docker se marie bien avec l'ipv6.
# Complément d'informations
Posté par jnanar (site web personnel) . Évalué à 1.
Pour compléter mon investigation, j'ai lancé un scan nmap depuis le container pour le comparer à un scan depuis ma machine personnelle:
Machine perso:
Container:
On voit bien que les ports qui permettent l'envoi de mail (465 et 587) ne sont pas visibles ici. Je me demande si c'est le fournisseur du serveur mail qui bloque ou moi.
# Contournement
Posté par jnanar (site web personnel) . Évalué à 1.
Finalement, il semblerait que le problème provienne du fait que je teste ça sur un VPS. Les mails qui sortent de l'hôte passent mais tout ce qui vient d'un sous réseau est bloqué, probablement par l'hôte du VPS. Je m'en suis sortis en codant un petit serveur SMTP en python à l'aide de la bibliothèque dédiée. Ce service tourne sur l'hôte et accepte les mails des conteneurs. Il les transmet ensuite en utilisant le serveur SMTP fourni dans le fichier de configuration. Plus d'infos ici:
https://docs.python.org/3/library/smtpd.html
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.