我正在运行 Ubuntu VPS(运行 20.04.6 LTS),并在其上安装了 exim4。我想使用 exim 从我在此服务器上运行的 PHP 应用程序发送一些电子邮件。我对在此服务器上接收电子邮件不感兴趣(没有指向此服务器以接收邮件的 MX 记录)。
当我尝试通过命令行或应用程序发送邮件时,没有邮件发送并且出现以下内容/var/log/exim4/mainlog
:
2023-08-22 20:01:43 1qYXZP-00AlXT-0B <= <REDACTED> U=<REDACTED> P=local S=300
2023-08-22 20:01:43 Warning: No server certificate defined; will use a selfsigned one.
Suggested action: either install a certificate or change tls_advertise_hosts option
2023-08-22 20:03:53 1qYXZP-00AlXT-0B H=reception.mail-tester.com [94.23.206.89]: SMTP timeout after initial connection: Connection timed out
2023-08-22 20:03:53 1qYXZP-00AlXT-0B == [email protected] R=dnslookup T=remote_smtp defer (110): Connection timed out H=reception.mail-tester.com [94.23.206.89]: SMTP timeout after initial connection
可能相关的信息:
我使用的 VPS 主机有一个防火墙,我可以在其中添加入口和出口规则。我尝试查找有关 exim4 用于传出连接的端口的信息,但一无所获。我发现的唯一相关内容是有人建议它通过高“非特权”端口进行通信,而不是低“特权”端口,这对我来说意味着它通过的端口通常不受(传出)安全规则的约束。
我在电子邮件的发件人标头中使用的域名在其 SPF 记录中列出了服务器的 IP。
我的问题
有没有办法正确调试?这是否像为防火墙设置正确的出口规则一样简单,还是我需要做其他事情?
免责声明:我意识到电子邮件通常是留给专业人士的东西,这里没有发生任何关键任务,如果它不起作用,那就不起作用。这纯粹是因为我想了解它。
答案1
我尝试寻找有关 exim4 用于传出连接的端口的信息,但什么也没找到。
域之间的 SMTP 邮件交换(MX 服务)始终使用标准 SMTP 端口 25(TCP)。
这不是 Exim4 特有的 - 如果您正在运行邮件服务器,它将在您这边的端口 25 接受入站邮件,并将出站邮件发送到收件人的 MX 服务器上的端口 25。
找出某个程序试图使用的端口的一个简单方法是通过数据包捕获tcpdump
或 之类的工具tshark
,可显示网络接口上的进出情况。如果 exim4 尝试与某个服务器建立 TCP 连接,您会在 tcpdump 的输出中看到 TCP SYN 数据包,其中记录了 IP 地址和端口。
2023 年的这些天大多数云托管服务都会阻止端口 25因为他们的“客户”中有很多会迅速启动大量虚拟机,使用可疑资金发送垃圾邮件。所以现在您的云主机有一个隐藏的防火墙规则,可以双向阻止 TCP 端口 25。
根据您使用的托管服务,可能只需礼貌地要求解除 SMTP 阻止即可;该过程可能会记录在他们的网站上;或者他们可能会告诉您改用第三方邮件发送 API。
我发现唯一看似相关的事情是,有人建议它通过高“非特权”端口进行通信,而不是低“特权”端口,这对我来说意味着它通过其进行通信的端口通常不受(传出)安全规则的约束。
嗯,有点这样,但不完全是这样。
每个 TCP 连接都有二端口(每端一个);通常客户端的端口将从高“临时”范围中随机选择。
例如,当你的浏览器连接到 superuser.com 的“443 端口”上的 HTTPS 服务时,初始数据包将从你这边的一个临时端口到端口 443 到 Web 服务器端。当 Web 服务器回复时,回复将从服务器的端口 443 发送到您机器上的临时端口。
(回复确实会绕过防火墙,但这并不是因为它们被发送到了一个临时端口,而是因为一个状态防火墙记得您与哪些主机:端口进行通信。请注意,对于云托管防火墙来说,情况并非总是如此;它们通常是无状态的。)
顺便说一句,“特权”与“非特权”与防火墙无关——它只是传统的 Unix 特定限制,即只有以 root 身份运行的服务才可以收到连接到特权端口(1024 以下)。
我在电子邮件的发件人标头中使用的域名在其 SPF 记录中列出了服务器的 IP。
“连接超时”消息意味着 Exim4 根本无法连接,因此它永远无法进行 SPF 检查(因为收件人服务器还不知道哪个域名SPF 失败会导致出现 SMTP 级拒绝消息(带有 3 位错误代码),或者导致邮件被接受但被丢弃。
请记住二“发件人”地址;一个位于电子邮件标题中,另一个位于 SMTP 信封中(收件人可能会将其视为“Return-Path”标题)。SPF 主要涉及后者。
我对在此服务器上接收电子邮件不感兴趣(没有指向此服务器用于接收邮件的 MX 记录)。
您可能想要改变这种情况,因为由于前面提到的垃圾邮件问题,如果您的域名根本没有 MX 记录,大多数收件人的垃圾邮件过滤器都会对您的域名感到有些奇怪。
因此,这与能否接收邮件无关(你能接收没有明确 MX 记录的邮件 - 服务器本身按照标准成为隐式 MX),而是向其他人表明您是合法运营,而不仅仅是被黑客入侵的随机网络主机。
虽然理论上您的 SPF 记录应该胜过 MX 的缺失(因为它更明确地说明了它的含义),但实际上许多过滤器无论如何都会检查 MX(甚至可能在检查 SPF 之前拒绝您的邮件)。
(而且,说实话,你应该希望收到发送至 abuse@ 的邮件,至少理论上是这样。)