SMTP简单邮件传输协议.docx
《SMTP简单邮件传输协议.docx》由会员分享,可在线阅读,更多相关《SMTP简单邮件传输协议.docx(9页珍藏版)》请在冰豆网上搜索。
SMTP简单邮件传输协议
SMTP简单邮件传输协议
展开
SMTP
SMTP-简单邮件传输协议(SimpleMailTransferProtocol),是定义邮件传输的协议,它是基于TCP服务的应用层协议,由RFC0821所定义。
SMTP协议规定的命令是以明文方式进行的。
为了讲明SMTP的工作原理,我们以向163发送邮件为实例进行讲明。
SMTP
250OK
authlogin
334dXNlcm5hbWU6
334UGFzc3dvcmQ6
PASSbase64加密后的密码
235Authenticationsuccessful
250MailOK
250MailOK
DATA
354Enddatawith.
QUIT
SMTP
250MailOKqueuedassmtp5,D9GowLArizfIFTpIxFX8AA==.41385S21211766217
当你的一个朋友向你发送邮件时,他的邮件服务器和你的邮件服务器通过S
SMTP
安装POP3和SMTP服务组件
WindowsServer2003默认情形下是没有安装POP3和SMTP服务组件的,因此我们要手工添加。
2.安装SMTP服务组件
选中“应用程序服务器”选项,点击“详细信息”按钮,接着在“Internet信息服务(IIS)”选项中查看详细信息,选中“SMTPService”选项,最后点击“确定”按钮。
此外,如果用户需要对邮件服务器进行远程Web治理,一定要选中“万维网服务”中的“远程治理(HTML)”组件。
完成以上设置后,点击“下一步”按钮,系统就开始安装配置POP3和SMTP服务了。
配置POP3服务器
1.创建邮件域
点击“开始→治理工具→POP3服务”,弹出POP3服务操纵台窗口。
选中左栏中的POP3服务后,点击右栏中的“新域”,弹出“添加域”对话框,接着在“域名”栏中输入邮件服务器的域名,也确实是邮件地址“@”后面的部分,
2.创建用户邮箱
选中刚才新建的,在右栏中点击“添加邮箱”,弹出添加邮箱对话框,在“邮箱名”栏中输入邮件用户名,然后设置用户密码,最后点击“确定”按钮,完成邮箱的创建。
[1][2]完成POP3服务器的配置后,就可开始配置SMTP服务器了。
点击“开始→程序→治理工具→Internet信息服务(IIS)治理器”,在“IIS治理器”窗口中右键点击“默认SMTP虚拟服务器”选项,在弹出的菜单中选中“属性”,进入“默认SMTP虚拟服务器”窗口,切换到“常规”标签页,在“IP地址”下拉列表框中选中邮件服务器的IP地址即可。
点击“确定”按钮,现在SMTP服务器默认的是匿名访咨询,打开切换到“访咨询”标签页,点击“身份验证”按钮,在对话框中去掉“匿名访咨询“选项,选中”差不多身份验证(Basicauthentication)“。
如此一个简单的邮件服务器就架设完成了。
SMTP
SMTP要通过建立连接、传送邮件和开释连接3个时期。
具体为:
(1)建立TCP连接。
(2)客户端向服务器发送HELLO命令以标识发件人自己的身份,然后客户端发送MAIL命令。
(3)服务器端以OK作为响应,表示预备接收。
(4)客户端发送RCPT命令。
(5)服务器端表示是否情愿为收件人接收邮件。
(6)协商终止,发送邮件,用命令DATA发送输入内容。
(7)终止此次发送,用QUIT命令退出。
最初的SMTP的局限之一在于它没有对发送方进行身份验证的机制。
因此,后来定义了SMTP-AUTH扩展。
SMTP模型
smtp提供了一种邮件传输的机制,当收件方和发件方都在一个网络上时,能够把邮件直传给对方;当双方不在同一个网络上时,需要通过一个或几个中间服务器转发。
smtp第一由发件方提出申请,要求与接收方smtp建立双向的通信渠道,收件方能够是最终收件人也能够是中间转发的服务器。
收件方服务器确认能够建立连接后,双发就能够开始通信。
发件方smtp向收件方发处mail命令,告知发件方的身份;如果收件方同意,就会回答ok。
发件方再发出rcpt命令,告知收件人的身份,收件方smtp确认是否接收或转发,如果同意就回答ok;接下来就能够进行数据传输了。
通信过程中,发件方smtp与收件方smtp采纳对话式的交互方式,发件方提出要求,收件方进行确认,确认后才进行下一步的动作。
整个过程由发件方操纵,有时需要确认几回才能够。
SMTP提供一种可靠的有效的传送机制,它用于传送电子邮件。
尽管十几年来,它的作用差不多有目共睹,但是对它功能的扩充也是必不可少的。
对SMTP服务的扩展我们介绍一下:
在SMTP转发的邮件中包括信封和内容这两种东西。
我们写信也写信封和信皮,我们能够借生活中的信件来关心明白得。
(1)SMTP信封比较容易明白得,它被作为一系列的SMTP协议单元传送,它包括发送者地址,传送模式,还有一个或多个接收者地址。
如果有不清晰的地点,请参阅《SMTP协议标准》。
SMTP
(2)至于内容,它是由两部分组成的,一部分是信头,一部分是信体,信头是由一个个的域/值对(一个域,一个值)组成的,如果信体有结构的话,它的结构是以MIME构造的。
内容从全然上来讲是文本的,一样也是由ASCII码构成的,然而由于使用了MIME,因此那个限制应该也是没有了,但信头却不行,一样都应该使用ASCII码表示。
尽管SMTP协议是一个不错的协议,但是对它的扩展依旧不可幸免,本文要紧讲明了一种扩展方法,使用这种扩展方法,服务器和用户之间能够相互明白对方使用了扩展,使用了多少,如果进行通信。
从前面的通讯模型能够看出SMTP协议在发送SMTP和接收SMTP之间的会话是靠发送SMTP的SMTP命令和接收SMTP反馈的应答来完成的。
在通讯链路建立后,发送SMTP发送MAIL命令指令邮件发送者,若接收SMTP现在能够接收邮件则作出OK的应答,然后发送SMTP连续发出RCPT命令以确认邮件是否收到,如果接收到就作出OK的应答,否则就发出拒绝接收应答,但这并可不能对整个邮件操作造成阻碍。
双方如此反复多次,直至邮件处理完毕。
SMTP协议共包含10个SMTP命令,列表如下:
SMTP命令命令讲明
HELLO<domain><CRLF>识不发送方到接收SMTP的一个HELLO命令
RCPTTO:
<forward-path><CRLF><forward-path>标识各个邮件接收者的地址
DATA<CRLF>
接收SMTP将把其后的行为看作邮件数据去处理,以<CRLF>.<CRLF>标识数据的结尾。
REST<CRLF>退出/复位当前的邮件传输
NOOP<CRLF>要求接收SMTP仅做OK应答。
(用于测试)
QUIT<CRLF>要求接收SMTP返回一个OK应答并关闭传输。
VRFY<string><CRLF>验证指定的邮箱是否存在,由于安全因素,服务器多禁止此命令。
EXPN<string><CRLF>验证给定的邮箱列表是否存在,扩充邮箱列表,也常禁止使用。
HELP<CRLF>查询服务器支持什么命令
sendmail是在Unix环境下使用最广泛的实现邮件发送/同意的邮件传输代理程序。
由于Sendmail邮件服务器的特点是功能强大而复杂,因此为保证Sendmail的安全性,需要作以下一些工作。
1、设置Sendmail使用"smrsh"
smrsh程序的目的是作为在mailer中为sendmail定义的"/bin/sh"的替代shell。
smrsh是一种受限shell工具,它通过"/
第一步:
决定smrsh能够承诺sendmail运行的命令列表。
缺省情形下应当包含以下命令,但不局限于这些命令:
"/bin/mail"(如果在你的系统中安装了的话)
"/usr/bin/procmail"(如果在你的系统中安装了的话)
第二步:
在"/etc/smrsh"名目中创建承诺sendmail运行的程序的符号连接。
使用以下命令承诺mail程序"/bin/mail"运行:
[root@deep]#cd/etc/smrsh
[root@deep]#ln-s/bin/mailmail
用以下命令承诺procmail程序"/usr/bin/procmail"运行:
[root@deep]#cd/etc/smrsh
[root@deep]#ln-s/usr/bin/procmailprocmail
这将承诺位于".forward"和"aliases"中的用户采纳"|program"语法来运行mail及procmail程序。
第三步
配置sendmail使之使用受限shell。
mailer程序在sendmail的配置文件"/etc/sendmail.cf"中仅有一行。
必须修改"sendmail.cf"文件中"Mprog"定义的那一行。
将"/bin/sh"替换为"/usr/sbin/smrsh"。
编辑"sendmail.cf"文件(vi/etc/sendmail.cf)并改动下面这一行:
例如:
Mprog,P=/bin/sh,F=lsDFMoqeu9,S=10/30,R=20/40,D=$z:
/,T=X-Unix,A=sh-c$u
应该被改为:
Mprog,P=/usr/sbin/smrsh,F=lsDFMoqeu9,S=10/30,R=20/40,D=$z:
/,T=X-Unix,A=sh-c$u
现在用以下命令手工重起sendmail进程:
[root@deep]#/etc/rc.d/init.d/sendmailrestart
2、"/etc/aliases"文件
如果没有加以正确和严格的治理的话,不名文件被用来猎取特权。
例如,专门多发行版本在不名文件中带有"decode"不名。
现在这种情形越来越少了。
如此做的目的是为用户提供一个通过mail传输二进制文件的方便的方式。
在邮件的发送地,用户把二进制文件用"uuencode"转换成ASCII格式,并把结果邮递给接收地"decode"不名。
那个不名通过管道把邮件消息发送到"/usr/bin/uuencode"程序,由那个程序来完成从ASCII转回到原始的二进制文件的工作。
删除"decode"不名。
类似的,关于所有用于执行没有被放在smrsh名目下的程序的不名,你都要认确实检查,可能它们都值得怀疑并应当删除它们。
要想使你的改变生效,需要运行:
[root@deep]#/usr/bin/newaliases
编辑不名文件(vi/etc/aliases)并删除以下各行:
#Basicsystemaliases--theseMUSTbepresent.
MAILER-DAEMON:
postmaster
postmaster:
root
#Generalredirectionsforpseudoaccounts.
bin:
root
daemon:
root
games:
root?
?
删除这一行
ingres:
root?
?
删除这一行
nobody:
root
system:
root?
?
删除这一行
toor:
root?
?
删除这一行
uucp:
root?
?
删除这一行
#Well-knownaliases.
manager:
root?
?
删除这一行
dumper:
root?
?
删除这一行
operator:
root?
?
删除这一行
#trapdecodetocatchsecurityattacks
decode:
root?
?
删除这一行
#Personwhoshouldgetroot'smail
#root:
marc
最后应该运行"/usr/bin/newaliases"程序使改动生效
3、幸免你的Sendmail被未授权的用户滥用
最新版本的Sendmail(8.9.3)加入了专门强的防止欺诈的特性。
它们能够防止你的邮件服务器被未授权的用户滥用。
编辑你的"/etc/sendmail.cf"文件,修改一下那个配置文件,使你的邮件服务器能够挡住欺诈邮件。
编辑"sendmail.cf"文件(vi/etc/sendmail.cf)并更换下面一行:
OPrivacyOptions=authwarnings
改为:
OPrivacyOptions=authwarnings,noexpn,novrfy
设置"noexpn"使sendmail禁止所有SMTP的"EXPN"命令,它也使sendmail拒绝所有SMTP的"VERB"命令。
设置"novrfy"使sendmail禁止所有SMTP的"VRFY"命令。
这种更换能够防止欺诈者使用"EXPN"和"VRFY"命令,而这些命令恰恰被那些不守规矩的人所滥用。
4、SMTP的咨询候信息
当sendmail同意一个SMTP连接的时候,它会向那台机器发送一个咨询候信息,这些信息作为本台主机的标识,而且它所做的第一件事确实是告诉对方它差不多预备好了。
编辑"sendmail.cf"文件(vi/etc/sendmail.cf)并更换下面一行:
OSmtpGreetingMessage=$jSendmail$v/$Z;$b
改为:
OSmtpGreetingMessage=$jSendmail$v/$Z;$bNOUCEC=xxL=xx
现在手工重起一下sendmail进程,使刚才所做的更换生效:
[root@deep]#/etc/rc.d/init.d/sendmailrestart
以上的更换将阻碍到Sendmail在接收一个连接时所显示的标志信息。
你应该把"`C=xxL=xx"条目中的"xx"换成你所在的国家和地区代码。
后面的更换事实上可不能阻碍任何东西。
但这是"-abuse.email"新闻组的伙伴们举荐的合法做法。
5、限制能够审核邮件队列内容的人员
通常情形下,任何人都能够使用"mailq"命令来查看邮件队列的内容。
为了限制能够审核邮件队列内容的人员,只需要在"/etc/sendmail.cf"文件中指定"restrictmailq"选项即可。
在这种情形下,sendmail只承诺与那个队列所在名目的组属主相同的用户能够查看它的内容。
这将承诺权限为0700的邮件队列名目被完全爱护起来,而我们限定的合法用户仍旧能够看到它的内容。
编辑"sendmail.cf"文件(vi/etc/sendmail.cf)并更换下面一行:
OPrivacyOptions=authwarnings,noexpn,novrfy
改为:
OPrivacyOptions=authwarnings,noexpn,novrfy,restrictmailq
现在我们更换邮件队列名目的权限使它被完全爱护起来:
[root@deep]#chmod0700/var/spool/mqueue
注意:
我们差不多在sendmail.cf中的"PrivacyOptions="行中添加了"noexpn"和"novrfy"选项,现在在这一行中我们接着添加"restrictmailq"选项。
任何一个没有特权的用户如果试图查看邮件队列的内容会收到下面的信息:
[user@deep]$/usr/bin/mailq
Youarenotpermittedtoseethequeue
SMTP
6、限制处理邮件队列的权限为"root"
通常,任何人都能够使用"-q"开关来处理邮件队列,为限制只承诺root处理邮件队列,需要在"/etc/sendmail.cf"文件中指定"restrictqrun"。
编辑"sendmail.cf"文件(vi/etc/sendmail.cf)并更换下面一行:
OPrivacyOptions=authwarnings,noexpn,novrfy,restrictmailq
改为:
OPrivacyOptions=authwarnings,noexpn,novrfy,restrictmailq,restrictqrun
任何一个没有特权的用户如果试图处理邮件队列的内容会收到下面的信息:
[user@deep]$/usr/sbin/sendmail-q
Youdonothavepermissiontoprocessthequeue
7、在重要的sendmail文件上设置不可更换位
能够通过使用"chattr"命令而使重要的Sendmail文件可不能被擅自更换,能够提升系统的安全性。
具有"+i"属性的文件不能被修改:
它不能被删除和改名,不能创建到那个文件的链接,不能向那个文件写入数据。
只有超级用户才能设置和清除那个属性。
为"sendmail.cf"文件设置不可更换位:
[root@deep]#chattr+i/etc/sendmail.cf
为"sendmail.cw"文件设置不可更换位:
[root@deep]#chattr+i/etc/sendmail.cw
为"sendmail.mc"文件设置不可更换位:
[root@deep]#chattr+i/etc/sendmail.mc
为"null.mc"文件设置不可更换位:
[root@deep]#chattr+i/etc/null.mc
为"aliases"文件设置不可更换位:
[root@deep]#chattr+i/etc/aliases
为"access"文件设置不可更换位:
[root@deep]#chattr+i/etc/mail/access
qmail安全
qmail有一个名为rcpthosts(该文件名源于RCPTTO命令)的配置文件,其决定了是否同意一个邮件。
只有当一个RCPTTO命令中的接收者地址的域名存在于rcpthosts文件中时,才同意该邮件,否则就拒绝该邮件。
若该文件不存在,则所有的邮件将被同意。
当一个邮件服务器不管邮件接收者和邮件接收者是谁,而是对所有邮件进行转发(relay),则该邮件服务器就被称为开放转发(openrelay)的。
当qmail服务器没有rcpthosts时,其是开放转发的。
设置自己服务器为非openrelay的最简单的方法确实是将你的邮件服务器的所有域名(若DNS的MX记录指向该机器,也应该包括该域名。
然而这将导致你的本地客户也被拒绝使用你的服务器转发邮件,而要支持客户使用MUA来发送邮件,必须承诺客户使用服务器转发邮件。
qmail-smtpd支持一种有选择性的忽略rcpthosts文件的方法:
若qmail-smtpd的环境变量RELAYCLIENT被设置,则rcpthost文件将被忽略,relay将被承诺。
然而如何识不一个邮件发送者是否是自己的客户呢?
qmail并没有采纳密码认证的方法,而是判定发送邮件者的源IP地址,若该IP地址属于本地网络,则认为该发送者为自己的客户。
tcpserver的配置文件是/etc/tcp.smtp,该文件定义了是否对某个网络设置RELAYCLIENT环境变量。
例如,本地网络是地址为192.168.10.0/24的C类地址,则tcp.smtp的内容应该设置如下:
192.168.10.:
allow,RELAYCLIENT=""
:
allow
这几个规则的含义是指若连接来自127.0.0.1和192.168.10则承诺,同时为其设置环境变量RELAYCLIENT,否则承诺其他连接,然而不设置RELAYCLIENT环境变量。
如此当从其他地点到本地的25号连接将会被承诺,然而由于没有被设置环境变量,因此其连接将会被qmail-smptd所拒绝。
然而tcopserver并不直截了当使用/etc/tcp.smtp文件,而是需要先将该文件转化为cbd文件:
[lix@mail/etc]$#tcprulestcp.smtp.cdbtcp.smtp.temp 然后再回头看在/service/qmail-smtpd名目下的run文件中有
/usr/local/bin/tcpserver-v-p-x/etc/tcp.smtp.cdb
能够看到,tcpserver利用了/etc/smtp.cbd文件。
若本地有多个网络,则需要这些网络都显现在/etc/tcp.smtp文件中。
如此就实现了承诺本地客户relay邮件,而防止relay被滥用。
参考资料
1
2