蓝森林首页 | 返回主页 | 本站地图 | 站内搜索 | 联系信箱 |
 您目前的位置:首页 > 自由软件 > 技术交流 > 网络通讯


    

蓝森林 http://www.lslnet.com 2006年7月28日 12:08


需要auth的本地MTA和客户端软件,远端MTA通行协议分析。

需要auth的本地MTA和客户端软件,远端MTA通行协议分析。

当一个本地的MTA需要auth时,我一直弄不清远端的MTA是如何将邮件发送给本地的MTA的,
远端MTA并不知道密码啊?他怎么通过认证的呢?
今天终于捕捉他们的通信协议,并结合打过补丁的qmail-smtp.c。终于弄清楚了客户端连接
一个需要认证MTA和一个MTA连接到一个需要认证的MTA的区别

本地需要认证MTA:192.168.1.21 (以下简称本地MTA)
远端MTA:192.168.1.2
邮件客户端:192.168.1.2

下面是邮件客户端和本地MTA的smtp协议
[code]
220 192.168.1.21 ESMTP
EHLO [192.168.1.2]
250-192.168.1.21     <-本地MTA,说,我这里要验证的
250-AUTH=LOGIN
250-PIPELINING
250 8BITMIME
AUTH LOGIN            <--客户端理睬了,说我可以提供给你认证
334 VXNlcm5hbWU6            <--本地MTA说:用户名(base64加密)
dGVzdEBzdG5jLmNvbS5jbg==    <--邮件客户端说:xxxx(base64加密)
334 UGFzc3dvcmQ6            <--本地MTA说:密码(base64加密)
MTExMTEx                    <--邮件客户端说:yyyy(base64加密)
535 auth failure            <--本地MTA说:不对,滚开,这时邮件客户端一般会弹出一个小窗口说认证不通过
RSET
[/code]

下面是远端MTA和本地MTA的smtp协议
[code]
220 192.168.1.21 ESMTP
EHLO [192.168.1.2]
250-192.168.1.21  <-本地MTA,说,我这里要验证的
250-AUTH=LOGIN
250-PIPELINING
250 8BITMIME
RSET           <--远端MTA更不就不理睬需要认证的请求,直接RSET,
250 flushed
MAIL FROM:
250 ok
RCPT TO:      <--远端MTA说:我要发行给abc@xxx.com
553 sorry, that domain isn't in my list of allowed rcpthosts (#5.7.1)  <--本地MTA说:TMD,你又没有通过验证,xxx.com有不是我本地的域,滚开
QUIT
221 192.168.1.21
[/code]

从上面,可以看到,邮件客户端,远端MTA,连接一个需要验证的MTA是有区别的。
一般来说,远端MTA连接到本地MTA,这封邮件的收件人肯定是本地MTA接受的域
而邮件客户端向本地MTA发送的邮件,接受人不一定是本地域的,所以要验证。
那么,如果邮件客户端如果向本地MTA发送本地域邮件,就应该不需要验证了。

下面就是邮件客户端直接连接本地MTA ,发给本地域的邮件过程。
(邮件客户端的smtp填上本地MTA,选择不需要验证)
[code]
220 192.168.1.21 ESMTP
EHLO [192.168.1.2]
250-192.168.1.21
250-AUTH=LOGIN
250-PIPELINING
250 8BITMIME
RSET           <--客户端不理睬需要认证的请求,直接RSET,
250 flushed
MAIL FROM:
250 ok
RCPT TO:            
250 ok no problem sir      <-- RCPT 在本地域中
DATA
354 go ahead
Date: Mon, 10 May 2004 01:42:53 +0800
From: "test@abc.com"
To: test@abc.com
Subject: asdfasdf
Message-Id: <20040510014248.0978.TEST@abc.com>;
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Content-Transfer-Encoding: 7bit
X-Mailer: Becky! ver. 2.07.04 [en]


--
testldap@abc.com

.
250 ok I will take care of that right away sir 1084124876 qp 30250
QUIT
221 192.168.1.21
[/code]
其实,这个也就是一些垃圾邮件发送软件所说的免smtp服务器的原理。


看Qmail的打过auth补丁的qmail-smtpd.c也可以发现:
[code] { "auth", smtp_auth, flush } [/code]
如果client不发送auth指令,根本就不会调用验证过程 smtp_auth()
在smtp_auth()中,如果用户名/密码验证通过,relayclient="";
在rcpt对应的函数smtp_rcpt()中,如果relayclient == "",就根本不会判断
rcpt是否本地域,则可以自由转发了。

需要auth的本地MTA和客户端软件,远端MTA通行协议分析。

写的不错,新手都进来看一下。。。。。



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 蓝森林网站 版权所有。 E-mail : webmaster@lslnet.com