Docker 容器中的 Postfix 不转发虚拟别名

Docker 容器中的 Postfix 不转发虚拟别名

我第一次尝试配置 Postfix。我不需要邮箱,我只需要虚拟别名、转发[email protected] --> [email protected]

我的 Postfix 正在 Digital Ocean droplet 上的 Docker 容器中运行。

我已经做到了:

$ postalias -q [email protected]
[email protected]

...从容器内部,即我的/etc/postfix/virtual文件正在工作。

另外,从容器外面看液滴:

telnet example.com 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 example.com ESMTP Postfix (Ubuntu)

但从我自己的电脑来看:

$ telnet example.com 25
Trying <droplet IP>...
telnet: connect to address <droplet IP>: Operation timed out
telnet: Unable to connect to remote host

我认为这是预期的,也是正确的,因为mynetworks配置设置(见下文)是按照 Digital Ocean 的建议- 我不想托管“开放”的 SMTP 中继。

example.com.我已设置了 MX 记录,我ping example.com可以通过它访问网站。此外(从我的电脑):

$ host -t mx example.com
example.com mail is handled by 1 example.com.

这看起来是正确的。

但是,如果我发送一条测试消息,[email protected]什么都没有发送出去,而且我在 Postfix 日志中也看不到任何内容...我无法判断它在什么时候失败了。

我不确定问题出在我的 Postfix 配置上还是在容器的路由上。

该容器仅暴露 25 端口,并通过 Fig 运行

ports:
  - "25:25"

从 droplet 中的 shell 中:

$ netstat -tulpn | grep 25
tcp6       0      0 :::25                   :::*                    LISTEN      10680/docker-proxy

我的/etc/postfix/main.cf里面有这个:

smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = no

# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = example.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = /etc/mailname, <container id>, localhost.localdomain, localhost, example.com
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
virtual_alias_domains = example.com
virtual_alias_maps = hash:/etc/postfix/virtual
inet_protocols = ipv4

我不太清楚myhostname(最初设置为<container id>mydestinationvirtual_alias_domains

更新

输出来自http://mxtoolbox.com/SuperTool.aspx

Connecting to <server IP>

220 example.com ESMTP Postfix (Ubuntu) [733 ms]
EHLO MXTB-PWS3.mxtoolbox.com
250-example.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN [714 ms]
MAIL FROM: <[email protected]>
250 2.1.0 Ok [722 ms]
RCPT TO: <[email protected]>
454 4.7.1 <[email protected]>: Relay access denied [715 ms]

MXTB-PWS3v2 4006ms

更新
正如 @masegaloeh 帮助我发现的那样,我的 postfix 服务器基本可以正常工作。但我遇到了两个令人困惑的问题:

  1. 由于我的 Dockerfile 中的错误,我将其/var/log/mail.log归为 root 用户所有...这就是它保持空白的原因。我没有看到任何错误,但基本上 rsyslog 无法写入它。一个chown syslog:adm /var/log/mail.log步骤解决了这个问题,我能够看到 postfix 确实在处理邮件并将其转发到别名。

  2. 我错误地认为我能够从我的笔记本电脑上通过端口 25 远程登录到其他服务器,只是因为我以为我过去做过需要这样做才能工作的事情。但实际上我不能。但是我可以telnet example.com 25从另一台服务器进行操作,所以,再说一次,一切都正常。

  3. 从另一台服务器向别名发送邮件有效,并发送到我的 Gmail 目标地址。

  4. 看来我的问题实际上出在 Gmail 上...当我[email protected]从我的 Gmail 帐户发送邮件时,它没有显示。从那时起,我尝试使用我在另一个主机上设置的别名...有些有效,有些无效...导致:

结论:
看来 Gmail 只接受在Settings > Accounts and Import > Send mail as ...下配置的别名的邮件,不幸的是,Gmail 现在要求您在设置新服务器时为其指定第三方 SMTP 服务器,所以看来我必须在安装 postfix 时掌握 TLS 等。

答案1

此 Telnet 日志消息

telnet: connect to address <droplet IP>: Operation timed out

不是由mynetworkspostfix 中的配置引起的!该错误表明你的 telnet 数据包没有到达 docker 的 IP 地址或者docker 中的 postfix 没有响应你的 telnet

正如你提到的,你从自己的电脑上进行 telnet,那么也许你的 ISP 阻止了端口 25。但是,由于您提到外部的电子邮件无法通过,甚至 postfix 日志为空,那么 postfix 容器可能根本没有响应。也许您无法将 DO droplet 端口绑定到 postfix docker 端口。尝试运行netstat -tulpn | grep 25 来自溶解氧液滴确认 Postfix 可以从外部访问。

由于我对 docker 不熟悉,所以我无法在这里提供确切的解决方案。但是一些谷歌搜索结果表明您已将 IPtables 设置为进行伪装,如官方文档所述:将容器端口绑定到主机

编辑
无论如何,您的 netstat 输出看起来不错。它表明它只在 IPv6 中监听。但是这个帖子这个帖子表示 Ubuntu/Debian 使用 IPv4 映射 IPv6 地址方法来提供连接,因此也许也可以从外部 IPv4 访问

为了进一步排除故障,我在这里给出了发送电子邮件的最低要求

  • 一些 MTA(postfix、exim、IIS)监听端口 25。您可以通过运行netstat并 telnet 到本地主机来确认这一点
  • MX 记录/A 记录必须正确配置。
  • Internet 主机可以访问您服务器上的端口 25。这意味着没有防火墙问题导致丢弃 SMTP 数据包。

由于您已将 docker 代理引入到堆栈中,因此您必须确认

  1. 数据包接收于DO滴口 25. 在发送电子邮件时尝试运行tcpdump port 25以确认您的主机是否收到了数据包。
  2. Docker 代理实际上将数据包转发到 postfix。Postfix总是记录传入 SMTP 连接。

相关内容