Forum Linux.général Problème envoi mail depuis docker

Posté par (page perso) . Licence CC by-sa
Tags : aucun
0
19
oct.
2016

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 . Évalué à 2.

    ton conteneur semble tenter une connection IPv4
    alors que ton hote le fait en IPv6

    • [^] # Re: ipv4/ipv6

      Posté par (page perso) . É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 (page perso) . É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:

    nmap mail.gandi.net
    
    Starting Nmap 7.30 ( https://nmap.org ) at 2016-10-21 07:49 CEST
    Nmap scan report for mail.gandi.net (217.70.184.11)
    Host is up (0.034s latency).
    Other addresses for mail.gandi.net (not scanned): 2001:4b98:c:521::11
    rDNS record for 217.70.184.11: agent.mail.gandi.net
    Not shown: 992 filtered ports
    PORT    STATE SERVICE
    80/tcp  open  http
    110/tcp open  pop3
    143/tcp open  imap
    443/tcp open  https
    465/tcp open  smtps
    587/tcp open  submission
    993/tcp open  imaps
    995/tcp open  pop3s
    
    Nmap done: 1 IP address (1 host up) scanned in 11.56 seconds
    

    Container:

    nmap mail.gandi.net
    
    Starting Nmap 6.47 ( http://nmap.org ) at 2016-10-21 05:49 UTC
    Nmap scan report for mail.gandi.net (217.70.184.11)
    Host is up (0.0013s latency).
    rDNS record for 217.70.184.11: agent.mail.gandi.net
    Not shown: 994 filtered ports
    PORT    STATE SERVICE
    80/tcp  open  http
    110/tcp open  pop3
    143/tcp open  imap
    443/tcp open  https
    993/tcp open  imaps
    995/tcp open  pop3s
    
    Nmap done: 1 IP address (1 host up) scanned in 22.19 seconds
    

    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 (page perso) . É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 à ceux qui les ont postés. Nous n'en sommes pas responsables.