Postfix „Namensdienstfehler für Name=dovecot“ in Docker-Compose

Postfix „Namensdienstfehler für Name=dovecot“ in Docker-Compose

Kontext

Meine docker-compose --versionist 2.13.0

Ich habe einen Reproduzierer inhttps://github.com/Losmoges/postfix-dovecot-lmtp-reproducer

Meine Testversion hat drei Docker-Dienste in der Compose-Datei: Postfix, Dovecot und Client. Sie teilen sich ein Netzwerk über den Bridge-Treiber.

  • Postfix ist so konfiguriert, dass eingehende E-Mails über die virtual_transport = lmtp:dovecot:24Einstellung in der main.cf-Konfiguration an Dovecot weitergeleitet werden.
  • Dovecot ist so konfiguriert, dass es Verbindungen über die service lmtp/ inet_listener lmtp/ port = 24-Einstellung in der dovecot.conf-Konfiguration empfängt.
  • Ich kann eine E-Mail über Postfix senden, indem ich es im Client-Container ausführe. Dessen msmtp ist so konfiguriert, dass eine Verbindung über eine Konfigurationsdatei hergestellt wird.echo test | msmtp [email protected]host postfixmsmtprc

Dies führt zu folgendem Ergebnis in der Postfix-Warteschlange, das ich durch Ausführen postqueue -pim Postfix-Container überprüfen kann.

Fehler

-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]

Problemumgehung

Wenn ich die IP-Adresse des Dovecot-Containers über finde docker inspectund in die Postfix-Konfiguration eintrage, beispielsweise als virtual_transport = lmtp:172.18.0.4:24, funktioniert alles wie erwartet. In diesem Fall postqueue -pgibt der Befehl Mail queue is empty(nach dem Senden einer E-Mail über msmtp) aus:

Fragen

Warum virtual_transport = lmtp:dovecot:24funktioniert es nicht? Habe ich etwas falsch konfiguriert? Jede Form der Namenssuche, wie z. B. nslookup dovecot(nach der Installation von dnsutils) im Postfix-Container, funktioniert einwandfrei und gibt die IP-Adresse des Dovecot-Containers zurück. Führt Postfix seine eigene separate Domänennamenauflösung durch? Wenn ja, wie kann ich es zwingen, die Standarddomänennamenauflösung zu verwenden?

Bearbeiten: Lösung in der Antwort

Ich habe der Docker-Datei für das Postfix-Image die folgende Zeile hinzugefügt

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

Antwort1

Warum funktioniert virtual_transport = lmtp:dovecot:24 nicht?

In Ihrem master.cfhaben Sie lmtpdie Ausführung in einer chrootUmgebung konfiguriert:

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

Die chrootUmgebung hat keinen Zugriff auf den Container /etc/resolv.confund weiß daher nicht, wie Hostnamen aufgelöst werden. Die LMTP-Konfiguration wird standardmäßig in einer Chroot-Umgebung ausgeführt, da eine typische Konfiguration Unix-Sockets zur Kommunikation verwendet und die Auflösung von Hostnamen daher kein Problem darstellt.

lmtpDie einfachste Lösung besteht darin , die Ausführung in der Umgebung zu konfigurieren chroot:

lmtp      unix  -       -       y       -       -       lmtp

Mit dieser Änderung werden E-Mails korrekt zugestellt:

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

Eine Alternative wäre, einen gemeinsam genutzten Unix-Socket zwischen den dovecotund postfixContainern zu konfigurieren und diesen anstelle einer Inet-Verbindung für die Kommunikation zu verwenden.

Eine zweite Alternative wäre, den LMTP-Container im selben Netzwerk-Namespace wie den Postfix-Container auszuführen. In diesem Fall könnten Sie einfacher den Hostnamen verwenden localhost.

verwandte Informationen