19.4.4 信件传送流程与收信、Relay等重要观念
相信您对于MTA的设置与收发信件应该有一定程度的了解了,不过要妥善设置好您的MTA,尤其是想要了解到整台MTA是如何收发信件时,您最好需要知道MTA是如何接收来源主机所传来的信件,以及将信件转发到下一台主机去的整个流程。一般来说一封邮件的传送会经过如下流程。
(1)送信端与收信端这两台主机间会先经过一个握手(ehlo)的阶段,此时送信端被记录为发信来源(而不是Mail from)。通过握手后就可以进行信件标头(header)的传送。
(2)此时收信端主机会分析标头的信息,若信件的“Mail to: 主机名称”为收信端主机,且该名称符合mydestination的设置,则该信件会开始被接收到队列,并进一步送到Mailbox中;若不符合mydestination的设置,则终止联机且不进行信件内容(body)的传送。
(3)若“Mail to:主机名称”不是收信端本身,则开始进行转发(Relay)的分析。
(4)转发过程首先分析该信件的来源是否符合信任的客户端(这个客户端为步骤1所记录的发信主机),即来源是否符合mynetworks的设置值,若符合则开始接收信件到队列中,并等待MDA将信件再转发出去,否则继续下一步。
(5)分析信件来源或目标是否符合Relay_domains的设置,若符合则信件将被接收至队列,并等待MDA将信件再转发出去。
(6)若这封信的标头数据都不合乎上述的规范,则终止联机,并不会接收信件的内容数据。
也就是说,标头分析通过后,您的信件内容才会开始上传到主机的队列,然后通过MDA来处理该信件的流向。而不是将信件完整的传送到主机后才开始分析。而通过上述的流程后,在暂不考虑Access以及MDA的分析机制、一台MTA想要正确的收、发信件时,电子邮件必需要符合以下需求。
收信方面:需要符合以下需求。
• 发信端必须符合$inet_interfaces的设置。
• 信件标头的收件者主机名称必须符合$mydestination的设置,或者收件主机名称需要符合$virtual_maps(与虚拟主机有关)的设置。
转发方面:需要符合以下需求。
• 发信端必须符合$inet_interfaces的设置。
• 发信端来源必须为$mynetworks的设置,发信端来源或信件标头的收件者主机名称符合 $Relay_domains的设置内容。
同样的原理与想法您可以将它用在SendMail的设置中。不过很多垃圾信却是利用这个默认的收发管道来发送的,请看下面的两道例题。
|
例题1:在我的主机上面竟然发现这样的广告邮件,即利用我的主机发送广告邮件给我自己。为什么这样也可以呢? 答:首先,您必须熟悉上述的流程,由步骤2可知,当主机收到一封信且这封信的目标是自己,且符合mydestination的设置时,该信件就会被收下来而不必验证客户端是否来源于mynetworks。所以,任何人都可以用这个流程来寄信给您。不过,您的MTA并不是Open Relay,不会帮别人发送广告邮件的,不用担心。 |
|
例题2:我的主机明明没有Open Relay,但很多其他的MTA管理员发信给我,说我的主机的某个账号持续发送广告邮件,但是我的主机明明没有那个账号。这是怎么回事? 答:仔细看一下流程的步骤1与2,确认该封信能否被收下来与发信端、收信端的主机名称有关。而我们知道在邮件的header里还有一个Mail from的标头设置项目,这个标头设置是在查阅邮件时看到的“回邮地址”,这个数据是可以伪造的。而且它与收发信件的数据无关。所以,您应该告知对方MTA管理员,请他提供详细的log数据,才能够判断该封信是否由您的主机所发送出去的。一般来说,目前的广告业者很多都是利用这种欺敌的方式来处理的,所以您必须请对方提供详细的log file数据,以供查验。 |