|
蓝森林 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通行协议分析。
写的不错,新手都进来看一下。。。。。 |
| |