有些电子邮件带有类似“已接收:来自 [172.16.1.2] (some.public.ip.address)”的标题,这是为什么?为什么 NAT 后面的发件人客户端会泄露私有地址?
答案1
因为 SMTP 就是这样设计的,而且发送电子邮件的系统也是这样配置的。
有办法可以抑制这些信息,但是发送邮件系统需要明确配置才能执行此操作。
答案2
Received: from [172.16.1.2] (some.public.ip.address)"
正如您在评论中提到的,此特定位置的私有 IP 是因为它是在命令中作为客户端主机名发送的HELO
。
对于正确的邮件服务器,HELO
命令应包括其完全限定的主机名,该主机名也应与 DNS 匹配。对于入站电子邮件,许多服务器实际上会验证 HELO 主机名以确保其有效且 DNS 匹配。对于发送电子邮件,只要您经过身份验证,服务器通常会接受任何内容(您不能期望最终用户在其机器上都配置了真实有效的主机名)。
对于 Outlook 等 SMTP 客户端,它们可以发送您的计算机名称,但这不是完全合格的,并且可能不是理想的选择,具体取决于计算机的名称。例如,您经常会看到如下标头:
Received: from DESKTOP9U6J0BC (unknown)
使用 IP 地址可能提供更多的隐私,因为有些人可能认为172.1.2.3
在标题中看到比MIKES-MACBOOK
或更好CEO-WORKSTATION
。
最终,客户端只需要在 HELO 命令中提供一些合理的信息,一些客户端会选择 IP 地址。
这与其他答案讨论的内容略有不同,它们与实际 SMTP 服务器使用私有地址在组织内部传输电子邮件有关。
答案3
添加标头的不是邮件客户端Received
,而是 SMTP 消息从发件人使用的第一个外发邮件服务器(邮件中继)到收件人邮箱的最终目的地所遵循的路径中的每个 SMTP 邮件服务器。
如果第一个邮件服务器位于发件人的内部网络中,它可以(除非另有配置,否则将)在第一个标题中记录发件人的内部 IP 地址Received
。
答案4
当 SMTP 客户端向 SMTP 服务器发送邮件时,它首先会执行“helo”或“ehlo”命令。此命令有一个字段用于输入发件人的主机名。
为什么客户端要将主机名发送给服务器?因为 SMTP 被设计为运行在许多传输协议上,其中一些协议可能无法为服务器提供识别客户端的方法。当时的世界也更加信任,没有人会想到人们会故意谎报自己的身份。
在 SMTP 创建时,我们今天所知道的“个人计算机”还不存在。网络电子邮件最初是作为大型多用户计算机上使用的本地电子邮件系统互连的一种方式出现的。这些大型多用户计算机应该有一个明确定义的主机名。
接收邮件服务器会添加“已接收:”标头来记录邮件的路径。现代邮件服务器通常会在标头的“主机名”字段中记录客户端报告的“主机名”以及服务器看到的实际 IP 地址和/或反向 DNS 主机名。
进入现代社会后,我们现在使用桌面电子邮件客户端。客户端必须使用某个主机名作为主机名,因为协议要求它发送主机名,但桌面系统可能没有有意义的主机名。有些客户端使用操作系统报告的主机名(可能与网络上有意义的主机名相似,也可能不相似),有些客户端使用本地 IP 地址。