Postfix 中继主机连接失败:接收初始服务器问候时超时

Postfix 中继主机连接失败:接收初始服务器问候时超时

我有一个 Elastix 服务器盒,我想从它发送语音邮件的电子邮件通知。我想通过我们公司的电子邮件发送它们(由共享网络主机提供商 Bluehost 托管)。我已按照有关如何使用 Postfix 作为中继服务器的说明进行操作。但是电子邮件没有发出去。我在日志中收到以下内容(略有混淆):

Sep 27 16:31:51 TD1000 postfix/smtp[9757]: 1B2C357117: to=<[email protected]>, relay=boxNNN.bluehost.com[a.b.c.d]:465, delay=5241, delays=5076/0.03/165/0, dsn=4.4.2, status=deferred (lost connection with boxNNN.bluehost.com[a.b.c.d] while receiving the initial server greeting)

很多地方都说这可能是黑名单问题。但是,这似乎也是我在 PC 上运行的 Outlook 的问题。我试图让 Postfix 像 Outlook 一样运行,并使用 SSL 通过 Bluehost 发送。(我的 Outlook 设置:boxNNN.bluehost.com:465,SSL,需要身份验证)

当我提高调试级别时,我收到以下消息:

dns_query: boxNNN.bluehost.com (MX): Host found but no data record of requested type

但由于最终的消息是没有响应,并且它找到了服务器的 IP 地址,所以我认为 DNS 问题不是问题所在。

postconf -n 显示:

alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/libexec/postfix
debug_peer_level = 5
debug_peer_list = boxNNN.bluehost.com
html_directory = no
inet_interfaces = all
mail_owner = postfix
mailq_path = /usr/bin/mailq.postfix
manpage_directory = /usr/share/man
mydestination = $myhostname, localhost.$mydomain, localhost
mydomain = cenginc-office.local
myhostname = td1000.my-office.local
mynetworks = /etc/postfix/network_table
newaliases_path = /usr/bin/newaliases.postfix
queue_directory = /var/spool/postfix
readme_directory = /usr/share/doc/postfix-2.5.6/README_FILES
relayhost = boxNNN.bluehost.com:465
sample_directory = /usr/share/doc/postfix-2.5.6/samples
sendmail_path = /usr/sbin/sendmail.postfix
setgid_group = postdrop
smtp_connect_timeout = 300
smtp_enforce_tls = yes
smtp_helo_name = my-phone-system
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options =
smtp_sasl_type = cyrus
smtpd_sasl_auth_enable = yes
smtpd_sasl_path = smtpd
unknown_local_recipient_reject_code = 550
virtual_alias_maps = hash:/etc/postfix/virtual
virtual_mailbox_base = /var/mail/vhosts
virtual_mailbox_domains =
virtual_transport = lmtp:unix:/var/lib/imap/socket/lmtp

(根据 Elastix UI,我们使用的是 Postifix 2.3.3,所以我不确定为什么样本说的是 2.5.6)

当我通过 telnet 连接到 bluehost 框和端口时,连接保持打开状态一小段时间,然后关闭,我想是因为我没有以 SSL 形式进入。

我使用这个网站(以及其他网站)进行配置,但我不知道我遗漏了什么。https://www.zulius.com/how-to/set-up-postfix-with-a-remote-smtp-relay-host/

你知道我哪里做错了吗?我的理论是,postfix 在初始连接中没有做 bluehost 期望的事情,但我不知道是什么。谢谢你的帮助。

答案1

这里有两个事实

  • 您已通过端口 465 连接到 bluehost
  • Postfix 报告错误信息:接收初始服务器问候语时与 boxNNN.bluehost.com[abcd] 失去连接

一种可能的解释是Postfix 2.11 或更早版本中的 SMTP 客户端不支持 SSL

解释

在 SMTP 中,有双重加密方案:STARTTLS 和 SMTPS。区别在于 (1) SMTPS 从第一个字节开始就要求 SSL 加密,而 (2) STARTTLS 首先要求纯文本模式,并且客户端和服务器可选择在 STARTTLS 命令之后进行 SSL 协商。

Postfix SMTP 服务器 (smtpd)支持两种协议. 问题出在 SMTP 客户端(postfix 3.0 之前) -发送电子邮件到远程服务器的人- 不支持 SMTPS 连接。它仅支持纯文本模式或 STARTTLS 模式。

这里发生的事情是:Postfix SMTP 客户端使用纯文本模式连接到 Bluehost,因为 postfix 想要建立 STARTTLS。但 Bluehost 认为第一个字节是 SSL 协商而不是纯文本。这种不匹配导致 Bluehost 服务器默默丢弃数据并断开 postfix。Postfix 不知道这里发生了什么,所以它在邮件日志中抛出错误

Sep 27 16:31:51 TD1000 postfix/smtp[9757]: 1B2C357117: to=<[email protected]>, relay=boxNNN.bluehost.com[a.b.c.d]:465, delay=5241, delays=5076/0.03/165/0, dsn=4.4.2, status=deferred (lost connection with boxNNN.bluehost.com[a.b.c.d] while receiving the initial server greeting)

解决方案

Postfix TLS 文档在此处提供了使用 stunnel 的解决方法。因此MrPhilTX 的解决方案对于 Postfix <3.0 来说是正确的。

在 postfix 3.0 中,Wietse Venema 决定为 postfix SMTP 客户端提供额外的 SMTPS 功能。有了这个功能,这里就不需要 stunnel 解决方案了。这里有两种变体:

a) 对所有传出的 SMTP 连接启用 SMTPS

relayhost通常,在这种情况下,postfix 会像 OP 的问题一样只支持 SMTPS 。因此

# Client-side SMTPS requires "encrypt" or stronger.
smtp_tls_security_level = encrypt
smtp_tls_wrappermode = yes
# The [] suppress MX lookups.
relayhost = [mail.example.com]:465

b) 为多个主机启用 SMTPS

对于其他情况,您需要自定义传输和传输图来选择性地打开 SMTPS

# /etc/postfix/main.cf:
transport_maps = hash:/etc/postfix/transport

# /etc/postfix/transport:
example.com  relay-smtps:example.com:465

#/etc/postfix/master.cf:
relay-smtps  unix  -       -       n       -       -       smtp
    # Client-side SMTPS requires "encrypt" or stronger.
    -o smtp_tls_security_level=encrypt
    -o smtp_tls_wrappermode=yes

答案2

我不确定这是否是我应该放它的地方,但是这是我让它工作的方式。

所以,kworr 和 befreeandgood 让我走上了正确的道路。smtp_sasl_* 不与 SSL 进行任何操作,只进行身份验证。

我按照以下链接中的说明操作:这个让我接近了 http://www.eglug.org/book/export/html/1923 但遗漏了一些需要设置的内容。这个http://tech.surveypoint.com/blog/relay-mail-with-postfix-and-stunnel/添加inet_interfaces = loopback_only

这些选项让我遇到了一些问题,邮件服务器拒绝了各种标题名称,例如“发件人”和“回复”。我通过谷歌搜索找到一些说明修复了这些问题(但我不能发布这些链接,因为我已经超出了我的链接配额)。

alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/libexec/postfix
debug_peer_level = 2
html_directory = no
inet_interfaces = loopback-only
mail_owner = postfix
mailq_path = /usr/bin/mailq.postfix
manpage_directory = /usr/share/man
mydestination = $myhostname, localhost.$mydomain, localhost
mydomain = my-office.local
myhostname = td1000.my-office.local
mynetworks = /etc/postfix/network_table
newaliases_path = /usr/bin/newaliases.postfix
queue_directory = /var/spool/postfix
readme_directory = /usr/share/doc/postfix-2.5.6/README_FILES
relayhost = 127.0.0.1:5001
sample_directory = /usr/share/doc/postfix-2.5.6/samples
sendmail_path = /usr/sbin/sendmail.postfix
setgid_group = postdrop
smtp_connect_timeout = 60
smtp_generic_maps = hash:/etc/postfix/generic
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options =
smtp_sasl_type = cyrus
smtp_use_tls = yes
smtpd_sasl_auth_enable = yes
smtpd_sasl_path = smtpd
smtpd_tls_auth_only = no
smtpd_tls_loglevel = 2
smtpd_tls_received_header = no
unknown_local_recipient_reject_code = 550
virtual_alias_maps = hash:/etc/postfix/virtual
virtual_mailbox_base = /var/mail/vhosts
virtual_mailbox_domains =
virtual_transport = lmtp:unix:/var/lib/imap/socket/lmtp

因此 smtp_generic_maps 用于将出现的各种地址重命名为实际存在的某个地址。我必须对两个不同的名称执行此操作,这是我通过查看 /var/log/maillog 文件找到的。

因此,连接到 Bluehost 的摘要:

  • 启用 smtp_sasl 身份验证
  • 用于stunnel创建 SSL 隧道
  • 用于smtp_generic_maps映射 asterisk 正在使用的不存在的用户名。
  • 使用 mydomain 等可能会让您绕过通用地图要求。我还看到有人提到了$myorigin潜在的解决方法。

答案3

当目标域没有 MX 记录时,SMTP 服务器应尝试将邮件投递到域 A 记录中的任何一个。因为example.net这可以是 的任何地址example.net

如果加密端口连接失败,您需要查阅 postfix 手册smtp_tls_security_level参数。您可以在那里找到冗长的解释,但我认为在大多数情况下,您只需要在配置中添加以下内容:

smtp_tls_security_level=may

相关内容