![Docker 容器中的 Postfix 不转发虚拟别名](https://linux22.com/image/650189/Docker%20%E5%AE%B9%E5%99%A8%E4%B8%AD%E7%9A%84%20Postfix%20%E4%B8%8D%E8%BD%AC%E5%8F%91%E8%99%9A%E6%8B%9F%E5%88%AB%E5%90%8D.png)
我第一次尝试配置 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>
)mydestination
和virtual_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 服务器基本可以正常工作。但我遇到了两个令人困惑的问题:
由于我的 Dockerfile 中的错误,我将其
/var/log/mail.log
归为 root 用户所有...这就是它保持空白的原因。我没有看到任何错误,但基本上 rsyslog 无法写入它。一个chown syslog:adm /var/log/mail.log
步骤解决了这个问题,我能够看到 postfix 确实在处理邮件并将其转发到别名。我错误地认为我能够从我的笔记本电脑上通过端口 25 远程登录到其他服务器,只是因为我以为我过去做过需要这样做才能工作的事情。但实际上我不能。但是我可以
telnet example.com 25
从另一台服务器进行操作,所以,再说一次,一切都正常。从另一台服务器向别名发送邮件有效,并发送到我的 Gmail 目标地址。
看来我的问题实际上出在 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
不是由mynetworks
postfix 中的配置引起的!该错误表明你的 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 代理引入到堆栈中,因此您必须确认
- 数据包接收于DO滴口 25. 在发送电子邮件时尝试运行
tcpdump port 25
以确认您的主机是否收到了数据包。 - Docker 代理实际上将数据包转发到 postfix。Postfix总是记录传入 SMTP 连接。