Postfix "Error del servicio de nombres para nombre = palomar" en Docker-compose

Postfix "Error del servicio de nombres para nombre = palomar" en Docker-compose

Contexto

Mi docker-compose --versiones 2.13.0

He creado un reproductor enhttps://github.com/Losmoges/postfix-dovecot-lmtp-reproducer

Mi versión de prueba tiene tres servicios acoplables en el archivo de redacción: postfix, dovecot y client. Comparten una red a través del controlador del puente.

  • Postfix está configurado para reenviar correos electrónicos entrantes a Dovecot a través de la virtual_transport = lmtp:dovecot:24configuración en main.cf.
  • Dovecot está configurado para recibir conexiones a través de la configuración service lmtp// en la configuración de dovecot.conf.inet_listener lmtpport = 24
  • Puedo enviar un correo electrónico a través de Postfix ejecutándolo en el contenedor del cliente. Su msmtp está configurado para conectarse a través de un archivo de configuración.echo test | msmtp [email protected]host postfixmsmtprc

Esto produce el siguiente resultado en la cola de Postfix, que puedo inspeccionar ejecutándolo postqueue -pen el contenedor de Postfix.

Error

-Queue ID-  --Size-- ----Arrival Time---- -Sender/Recipient-------
DEC4F3DCBE      245 Fri Dec 16 19:41:17  [email protected]
(Host or domain name not found. Name service error for name=dovecot type=A: Host not found, try again)
                                         [email protected]

Solución alterna

Cuando encuentro la dirección IP del contenedor Dovecot docker inspecty la ingreso en la configuración de Postfix, por ejemplo como virtual_transport = lmtp:172.18.0.4:24, todo funciona como se esperaba. En este caso, el comando postqueue -pda Mail queue is empty(después de enviar un correo electrónico a través de msmtp)

Preguntas

¿Por qué virtual_transport = lmtp:dovecot:24no funciona? ¿Configuré mal algo? Cualquier forma de búsqueda de nombres, como nslookup dovecot(después de instalar dnsutils) en el contenedor Postfix, funciona bien y devuelve la dirección IP del contenedor Dovecot. ¿Postfix realiza su propia resolución de nombres de dominio por separado? Si es así, ¿cómo puedo obligarlo a utilizar la resolución de nombre de dominio predeterminada?

Editar: Solución en respuesta

Agregué la siguiente línea al Dockerfile para la imagen de Postfix

RUN sed -i'' -e 's/^lmtp .*/lmtp      unix  -       -       n       -       -       lmtp/g' /etc/postfix/master.cf

Respuesta1

¿Por qué virtual_transport = lmtp:dovecot:24 no funciona?

En su master.cf, ha lmtpconfigurado para ejecutarse en un chrootentorno:

# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (no)    (never) (100)
lmtp      unix  -       -       n       -       -       lmtp

El chrootentorno no tiene acceso al contenedor /etc/resolv.conf, por lo que no sabe cómo resolver los nombres de host. La configuración lmtp se ejecuta de forma predeterminada en un entorno chroot porque una configuración típica utiliza sockets Unix para comunicarse, por lo que la resolución del nombre de host no es un problema.

La solución más sencilla es configurarla lmtppara que no se ejecute en chrootel entorno:

lmtp      unix  -       -       y       -       -       lmtp

Con este cambio el correo se entrega correctamente:

postfix_1  | Dec 16 21:47:15 8d74be7a5951 postfix/smtpd[598]: connect from unknown[172.28.0.1]
postfix_1  | Dec 16 21:47:15 8d74be7a5951 postfix/smtpd[598]: 9131638672DA: client=unknown[172.28.0.1]
postfix_1  | Dec 16 21:47:15 8d74be7a5951 postfix/qmgr[582]: 9131638672DA: from=<[email protected]>, size=434, nrcpt=1 (queue active)
postfix_1  | Dec 16 21:47:15 8d74be7a5951 postfix/smtpd[598]: disconnect from unknown[172.28.0.1] ehlo=1 mail=1 rcpt=1 data=1 quit=1 commands=5
dovecot_1  | Dec 16 21:47:15 lmtp(16): Info: Connect from 172.28.0.3
dovecot_1  | Dec 16 21:47:15 lmtp([email protected])<16><+A19J2PnnGMQAAAAqj6rOA>: Info: msgid=<20221216164715.079491@rocket>: saved mail to INBOX
postfix_1  | Dec 16 21:47:15 8d74be7a5951 postfix/lmtp[597]: 9131638672DA: to=<[email protected]>, relay=dovecot[172.28.0.2]:24, delay=0.09, delays=0.07/0/0/0.01, dsn=2.0.0, status=sent (250 2.0.0 <[email protected]> +A19J2PnnGMQAAAAqj6rOA Saved)
dovecot_1  | Dec 16 21:47:15 lmtp(16): Info: Disconnect from 172.28.0.3: Logged out (state=READY)
postfix_1  | Dec 16 21:47:15 8d74be7a5951 postfix/qmgr[582]: 9131638672DA: removed

Una alternativa sería configurar un socket Unix compartido entre los contenedores dovecoty postfixy usarlo para la comunicación en lugar de una conexión inet.

Una segunda alternativa sería ejecutar el contenedor lmtp en el mismo espacio de nombres de red que el contenedor postfix, en cuyo caso podría usar más fácilmente el nombre de host localhost.

información relacionada