Email SMTP 发信泄露源站 IP 的问题以及解决措施

Email SMTP 发信泄露源站 IP

SMTP 协议介绍

SMTP(Simple Mail Transfer Protocol)是历史悠久的发送电子邮件的协议,并且是一个相对简单的基于文本的协议,在 Web 程序(WordPress 以及大部分 PHP 程序) 用户消息通知有着广泛的应用。

泄露原因

当 Web 加上 CDN 之后,访问者只能拿到 CDN 节点的 IP,获取不到 Web 本身的服务器 IP,避免服务器因 IP 泄露而受到密码暴力暴击、端口扫描、DDoS攻击等恶意行为。

SMTP 发信过程中,客户端将邮件发送到服务器。如果服务器必须将其移交给另一台服务器(因为它本身不为邮件需要发送的域提供邮件),则会将其转发到负责处理的服务器。然后该服务器将其添加

Received: from xxxx

到标头中。因为发信必然存在两个邮箱系统的信息交换(发信人的邮箱系统和收件人的邮箱系统),所以只要是使用 SMTP 协议,就包含这样的 Header 字段。

SMTP 协议 Header Received 字段示例:

Received: from wordupr.com (1.1.1.1)
        by email.cloudflare.net (unknown) Idefwe34
        for <[email protected]>; Sat, 21 Oct 2023 02:14:49 +0000

Header Received 字段的设计本身用于记录传递链路的信息,确定邮件的来源和可信度,从而排除伪造和欺诈邮件。但是也暴露了发信客户端的 IP。

如果你是直接在 Web 程序所在服务器运行 SMTP 发信,此时服务器的 IP 就会被记录到 Header Received 字段,就造成了源站 IP 可以被收件人获得。

由于 Header Received 字段由 SMTP 服务器填写,我们作为客户端无法屏蔽此字段,所以就不能仅通过代码修改的方式屏蔽该字段。

改进措施

使用专业的发信服务 API

常见的发信服务:

SMTP 发信程序部署到独立服务器

SMTP 发信程序和 WEB 服务器分离,保证 SMTP 发信程序所在的服务器防火墙设置不可外部访问,从而降低安全风险。

使用支持屏蔽 Received 字段的邮箱系统

部分企业邮箱和自建邮箱系统允许设置屏蔽 Received 字段,比如改写为 127.0.0.1。