动态IP地址的按需邮件转发(ODMR)1. 摘要 除了低成本计算机系统的推广及Internet的发展,本地邮件系统的需要上升了。许多人需要在服务提供商和本地网络之间架设一个邮件服务器。如果系统使用静态IP地址,那事情就好办了。但是如果系统使用动态IP地址时,现在还没有一个广泛使用的方法。本文给出一种新服务,按需要邮件转发ODMR,它提供一种安全的,可扩展的,易于实现的解决方法。 2. 针对本文的说明 客户和提供者分别是客户和服务器。P用于表示提供者,C表示客户。例子中'example.net'是提供者,'example.org'和'example.com'是客户。 3. 方案说明 ODMR是SMTP的一种扩展,端口366为此服务保留。初始的客户和服务器角色不重要,关键是中间连接主机。客户初始化一个连接到提供者,进行认证,获得邮件。然后客户和服务器的角度倒过来,进行通常的SMTP过程。有ODMR进程的提供者监视ODMR端口的连接,这个进程不必是个完整的SMTP实现,它需要作为一个SMTP客户,可以访问输出邮件队列,再实现EHLO,AUTH,ATRN和QUIT命令就可以了。 MTA通常有一个邮件客户组件,这可以处理输出邮件队列,向特定的域发送邮件,它基于的是时间和特定的事件,但是ODMR服务器则是根据请求才处理输出邮件队列。提供者方有通常的SMTP服务,包括产生传输错误通告等需要的功能。 4. 状态 ODMR服务有三个状态:初始状态(initial state),认证状态(authenticated state)和反向状态(reversed state),状态图如下:
(在反向状态,提供者发出命令,而不是客户。) 4.1. 初始状态 在初始状态中,提供者是服务器。三条命令有效:EHLO,AUTH和QUIT。 4.1.1. EHLO EHLO的定义如通常的SMTP中的一样,响应是必须包括AUTH和ATRN。 4.1.2. AUTH AUTH命令用于认证,在没有得到成功响应以前都认为未认证。为了互操作性,实现中必须支持CRAM-MD5,其它的SASL机制也要支持。如果站点使用了比CRAM-MD5更安全的机制,可以不用它。如果客户已被认证,那么EXTERNAL机制在某些情况下会有用。 4.1.3. QUIT QUIT命令和通常的SMTP中的一样。 4.2. 认证状态 AUTH命令成功后进入认证状态,在此状态下有效的命令为:ATRN和QUIT。 4.2.1. ATRN (Authenticated TURN) 不象TURN命令,ATRN可以带一个或几个域参数,ATRN在会话未得到认证时将被拒绝,返回码为530。对此命令的超时时间至少于10分钟,以供提供者处理邮件队列。如果此命令未带参数,则表示客户要访问所有域。如果认证不允许客户访问所有域,则不应该为客户发送任何域中的邮件,拒绝此命令并返回450。如果客户有权限访问所有域,但域中队列内没有邮件,则通过453进行拒绝。提供者可以发出250,在角色转换在EHLO后发出QUIT亦可。提供者可以以450拒绝此命令表示在一定时间间隔内不能接收多个请求。如果客户有权限访问所有域,而且域中也存在邮件,则返回250。如果服务器不能确定请求方是不是有权限,则返回451。下面是ATRN的语法: atrn = "ATRN" [SP domain *("," domain)] domain = sub-domain 1*("." sub-domain) sub-domain = (ALPHA / DIGIT) *(ldh-str) ldh-str = *(ALPHA / DIGIT / "-") (ALPHA / DIGIT) 4.3. 反向状态 提供方对ATRN命令返回成功后,客户变成服务器,提供者变为客户。在接收到ATRN的成功响应后,客户发出标准的SMTP初始化信息,此时提供者通常会发送EHLO,然后是MAIL FROM和其它命令。 4.4. 其它命令 提供方可以拒绝除EHLO,AUTH,ATRN和QUIT以外所有的命令,返回码为502。 5. 例子 P: 220 EXAMPLE.NET on-demand mail relay server ready ... P: QUIT 6. Response Codes 本文中使用的响应码有:
7. 安全 因为ODMR服务器只对事先约定好的服务器双方有效,所以提供方可以限制对方访问的端口,例如可以限制在本网段内部使用等等。请注意,使用这些机制不等于说就可以不用AUTH命令,这些措施只是为了更加提高安全性而已。可以在AUTH中使用SASL,其它的安全策略在文中也有所提及,文章不长,大家自己找一下就可以了。 |