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

thb*_*thb 6 debian email ipv6 exim

550 relay not permitted
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Rui*_*iro 6

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

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

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

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

因此,对于 exim,您可以在应用程序/守护程序级别禁用 IPv6,使用指令disable_ipv6=truein/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
Run Code Online (Sandbox Code Playgroud)

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

添加作为最后一行以默认优先考虑 IPv4,到文件 /etc/gai.conf

precedence ::ffff:0:0/96  100 
Run Code Online (Sandbox Code Playgroud)

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

net.ipv6.conf.all.disable_ipv6=1
Run Code Online (Sandbox Code Playgroud)

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

sudo sysctl -p
Run Code Online (Sandbox Code Playgroud)

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

GRUB_CMDLINE_LINUX="ipv6.disable=1"
Run Code Online (Sandbox Code Playgroud)

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

sudo update-grub
sudo grub-install /dev/sda
Run Code Online (Sandbox Code Playgroud)

您可能必须配置一个或其他守护程序以在应用程序级别禁用 IPv6(xinetd如果您安装了它,我的脑海中会浮现)。