第一封电子邮件被退回;第二封及后续电子邮件将通过

第一封电子邮件被退回;第二封及后续电子邮件将通过
550 relay not permitted

这是 Exim4 从我的 Debian 笔记本电脑发送的电子邮件被退回时出现的错误消息。

奇怪的是,只有第一封电子邮件被退回。第二封及后续电子邮件可以顺利通过中继并到达目的地。但是,如果我重新启动笔记本电脑,重新启动后的第一封电子邮件会再次退回。

在端口 587 上的 STARTTLS 之后,中继受到纯文本密码保护。X.509 证书是真实的,而不是万金油。我管理中继服务器和笔记本电脑。如果重要的话,中继服务器也在 Debian 上运行 Exim4。 Postfix 不涉及。

我想可以通过将笔记本电脑配置为在每次启动时发送一封虚拟电子邮件(或者甚至只是一封 SMTP EHLO?)来解决该问题,但解决的行为似乎很奇怪。我很困惑。如果您知道我下一步应该调查什么来解决这个问题,您能给我建议吗?

答案1

您的电子邮件超时很可能是由于您的守护程序首先尝试 IPv6 造成的。

IPv6协议栈的实现默认情况下优先于 IPv4 堆栈,因此当程序/守护程序尝试通信时,当目标同时具有公共 IPv4 和 IPv6 地址时,它们将首先尝试使用 IPv6 地址。

即使您没有公共 IPv6,您也有 IPv6 本地主机和链接本地地址。

这已经不是第一次了可能不是最后一次时间,我确实发现互联网守护进程首先尝试将链接本地地址作为源 IP 地址与另一个地址进行通信,并且只有在超时后,如果它们仍然有分配的时间/尝试,可能会回退到将数据发送到 IPv4 目的地。 (过去,我曾在我运行的 ISP 中遇到过因此而产生的 DNS 和电子邮件问题。)

因此,对于 exim,您可以在应用程序/守护程序级别禁用 IPv6,使用或disable_ipv6=true中的指令取决于您是否使用非分割或分割配置方案。/etc/exim4/exim4.conf.template/etc/exim4/update-exim4.conf.conf

Exim Internet Mailer-第 14 章 - 主要配置

disable_ipv6 用途:main 类型:boolean 默认值:false
如果此选项设置为 true,即使 Exim 二进制文件具有 IPv6 支持,也不会发生 IPv6 活动。 AAAA 记录永远不会被查找,并且 local_interfaces 中列出的任何 IPv6 地址、手动路由路由器的数据等都会被忽略。如果启用了 IP 文字,ipliteral 路由器将拒绝处理 IPv6 文字地址。

另一种方法也可能是将其仅绑定到 IPv4 地址,但缺点是必须在配置中对 IPv4 地址进行硬编码

local_interfaces = <; 127.0.0.1 ; \
                  192.168.23.65

至于系统本身,因为您没有积极使用 IPv6:

添加为文件的最后一行,默认情况下优先考虑 IPv4/etc/gai.conf

precedence ::ffff:0:0/96  100 

添加到/etc/sysctl.conf默认情况下禁用 IPv6 堆栈(从内核 3 开始支持的设置):

net.ipv6.conf.all.disable_ipv6=1

sysctl 将在启动时应用。要在启动前激活它,请执行以下操作:

sudo sysctl -p

虽然他们称之为 IPv6 停用,但该模块仍会加载,并且虽然接口不再具有 IPv6 地址,但您仍然可以看到连接到其 IPv6 套接字的应用程序。您还可以向内核传递一个禁用 IPv6 的选项,这样 IPv6 内核模块就不会被加载。编辑/etc/default/grub

GRUB_CMDLINE_LINUX="ipv6.disable=1"

然后应用它,如果您有 grub(您的 grub 分区可能有所不同,或者您可能没有它;我的 ARM 服务器中没有它,并且必须编辑内核选项的其他文件):

sudo update-grub
sudo grub-install /dev/sda

您可能需要配置一个或其他守护程序以在应用程序级别禁用 IPv6(从我的想法来看,xinetd如果您安装了它)。

答案2

@RuiFRibeiro 的答案很重要。先读那一篇。然而,一旦您理解了这个答案,这里有一些可能有帮助的附加信息。

如果您的中继主机要求您的笔记本电脑在中继邮件之前进行自我验证(您的中继主机可能应该这样做),那么您应该在您的笔记本电脑上配置 Exim4总是要验证自己的身份到中继服务器。

中继服务器也称为“智能主机”。无论你叫它什么名字,问题都在这里。笔记本电脑 Exim4 的默认行为是 [i] 在传输邮件之前尝试对自身进行身份验证,但如果失败,[ii] 则发送未经身份验证的邮件。

如果您的设置失败了,那么您的邮件将被退回,永久失败。当然,您可能会认为它永远不会落入[ii],但显然在您的情况下,有时会落入[ii]。

修复方法在运输/30_exim4-config_remote_smtp_smarthostExim4 配置的部分(在我的系统上位于文件中)/etc/exim4/exim4.conf.template)。在本节中,查找以下开头的节:

remote_smtp_smarthost:

在这一节中,您可能会发现这样一行开头:

  hosts_try_auth =

有些东西会跟随符号,但你感兴趣的=是符号。hosts_try_auth将其更改为:

  hosts_require_auth =

标志后不做任何更改=

其效果是,只要 [i] 失败,就会导致出站邮件传输失败,从而确保永远不会到达 [ii]。这有什么帮助?它有帮助,因为与 [ii] 的失败不同,[i] 的失败是暂时的,不是永久的。如果您已进行了指示的更改,那么您的系统将通过重试身份验证来响应失败,而不会在没有身份验证的情况下放弃。这就是您想要的行为。

如何提交配置更改

仅更改配置文件并不能解决问题。您必须使用 exim4-config 提交更改,例如通过发出看似晦涩但实际上很重要的 Debian 命令dpkg-reconfigure -phigh exim4-config。我不知道提交配置更改后是否确实需要重新启动服务器,但我总是重新启动它。要重新启动,请使用命令invoke-rc.d exim4 restart。 [顺便说一句,如果您是初学者,那么您可能会更有信心重新启动系统以重新启动一切。当我还是个初学者时我也这样做过,所以我不怪你,但是重新启动以重新启动单个服务确实不是 Debian 的方式。您有点像一名拥有良好绳索和硬件的攀岩者:最终,您会知道何时适合信任您的设备。有一天,您应该学会熟悉使用重要命令 invoke-rc.d(8),而不是总是重新启动。]

如果您想了解有关符号 的更多信息hosts_require_auth,请参阅 Exim4 软件附带的详细规格手册。

(仅供参考,我是OP。当我发布问题时,我缺乏答案,但在@RuiFRibeiro 指导我之后,我发现了这个答案提供的信息。)

相关内容