分享

SMTP协议

 大宝2338 2017-11-20
编辑本段 简介

  SMTP目前已是事实上的在Internet传输E-Mail的标准,是一个相对简单的基于文本的协议。在其之上指定了一条消息的一个或多个接收者(在大多数情况下被确定是存在的),然后消息文本就传输了。可以很简单地通过Telnet程序来测试一个SMTP服务器,SMTP使用TCP端口25。要为一个给定的域名决定一个SMTP服务器,需要使用MX(Mail eXchange)DNS。

  SMTP协议发展

  在20世纪80年代早期SMTP开始被广泛地使用。当时它只是作为UUCP的补充,UUCP更适合于处理在间歇连接的机器间传送邮件。相反SMTP在发送和接收的机器始终都联网的情况下工作得最好。

  SMTP独立于特定的传输子系统,且只需要可靠有序的数据流信道支持。SMTP重要特性之一是其能跨越网络传输邮件,即"SMTP邮件中继"。通常,一个网络可以由公用因特网上TCP可相互间访问的主机、防火墙分隔的TCP/IP网络上TCP可相互访问的主机,以及其他LAN/WAN中的主机利用非TCP传输层协议组成。使用SMTP,可实现相同网络上处理机之间的邮件传输,也可通过中继器或网关是实现某处理机与其他网络之间的邮件传输。

  SMTP的作用

  在smtp这种方式下,邮件的发送可能经过从发送端到接收端路径上的大量中间中继器或网关主机。域名服务系统(DNS)的邮件交换服务器可以用来识别出传输邮件的下一跳IP地址。

  Sendmail是最早实现SMTP的邮件传输代理之一。到2001年至少有50个程序将SMTP 实现为一个客户端(消息的发送者)或一个服务器(消息的接受者)。一些其他的流行的SMTP服务器包括Philip Hazel 的exim,IBM的Postfix,D.J.Bernstein的Qmail,以及Microsoft Exchange Server.

  由于这个协议开始是基于纯ASCⅡ文本的,在二进制文件上处理得并不好。后来开发了用来编码二进制文件的标准,如MIME,以使其通过SMTP来传输。今天,大多数SMTP服务器都支持8位MIME扩展,它使二进制文件的传输变得几乎和纯文本一样简单。

  ( 注意:SMTP是一个"推"的协议,它不允许根据需要从远程服务器上"拉"来消息。要做到这点,邮件客户端必须使用POP3IMAP上。另一个,SMTP服务器可以使用ETRN(Extended Turn,扩展回车)命令在SMTP上触发一个发送。)

  SMTP协议的局限

  垃圾邮件仍然是个重要的问题。原始的SMTP协议的局限之一在于它没有为发送方进行认证的功能。因此定义了SMTP-AUTH 扩展。由于SMTP 巨大安装基础的网络效应,广阔地修改SMTP或者完全替代它被认为是不现实的。Internet Mail 2000 就是这样一个为替换而做的建议。IRTF 的反垃圾邮件研究小组正在研究一些提供简单、灵活、轻量级的、可升级的源端认证的建议。最有可能被接受的建议是Sender Policy Framework 协议。

  编辑本段 命令

  SMTP命令是发送于SMTP主机之间的ASCⅡ信息,可能使用到的命令如下表所示。

  SMTP协议命令

  命令

  描述

  DATA

  开始信息写作

  EXPN<string>

  验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用

  HELO<domain>

  向服务器标识用户身份,返回邮件服务器身份

  HELP<command>

  查询服务器支持什么命令,返回命令中的信息

  MAIL FROM<host>

  在主机上初始化一个邮件会话

  NOOP

  无操作,服务器应响应OK

  QUIT

  终止邮件会话

  RCPT TO<user>

  标识单个的邮件接收人;常在MAIL命令后面可有多个rcpt to:

  RSET

  重置会话,当前传输被取消

  SAML FROM<host>

  发送邮件到用户终端和邮箱

  SEND FROM<host>

  发送邮件到用户终端

  SOML FROM<host>

  发送邮件到用户终端或邮箱

  TURN

  接收端和发送端交换角色

  VRFY<user>

  用于验证指定的用户/邮箱是否存在;由于安全方面的原因,服务器常禁止此命令

  收起

  编辑本段 ​工作原理

  SMTP是工作在两种情况下:一是电子邮件从客户机传输到服务器:二是从某一个服务器传输到另一个服务器。SMTP也是个请求/响应协议,命令和响应都是基于ASCⅡ文本,并以CR和LF符结束。响应包括一个表示返回状态的三位数字代码。SMTP在TCP协议25号端口监听连续请求。

  smtp连接和发送过程

  (1)建立TCP 连接。

  (2)客户端发送HELO命令以标识发件人自己的身份,然后客户端发送MAIL命令;服务器端正希望以OK作为响应,表明准备接收。

  (3)客户端发送RCPT命令,以标识该电子邮件的计划接收人,可以有多个RCPT行;服务器端则表示是否愿意为收件人接收邮件。

  (4)协商结束,发送邮件,用命令DATA发送。

  (5)以"."号表示结束输入内容一起发送出去,结束此次发送,用QUIT命令退出。

  SMTP协议的邮件路由过程及个人SMTP邮件服务器简单配置

  SMTP协议的邮件路由过程

  SMTP服务器基于域名服务DNS中计划收件人的域名来路由电子邮件。SMTP服务器基于DNS中的MX记录来路由电子邮件,MX记录注册了域名和相关的SMTP中继主机,属于该域的电子邮件都应向该主机发送。若SMTP服务器 mail.abc.com收到一封信要发到shuer@sh.abc.com,则执行以下过程:

  (1)Sendmail 请求DNS给出主机sh.abc.com的CNAME 记录,如有,假若CNAME(别名记录)到shmail.abc.com,则再次请求shmail.abc.com的CNAME记录,直到没有为止。

  (2)假定被CNAME到shmail.abc.com,然后sendmail请求@abc.com域的DNS给出shmail.abc.com的MX记录(邮件路由及记录),shmail MX 5 shmail.abc.com10 shmail2.abc.com。

  (3)Sendmail组合请求DNS给出shmail.abc.com的A记录(主机名(或域名)对应的IP地址记录),即IP地址,若返回值为1.2.3.4(假设值)。

  (4)Sendmail与1.2.3.4连接,传送这封给shuser@sh.abc.com的信到1.2.3.4 这台服务器的SMTP后台程序。

  个人SMTP邮件服务器简单配置

  一、安装POP3和SMTP服务组件

  Windows Server 2003默认情况下是没有安装POP3和SMTP服务组件的,因此我们要手工添加。

  1.安装POP3服务组件

  以系统管理员身份登录Windows Server 2003 系统。依次进入"控制面板添加或删除程序→添加/删除Windows组件",在弹出的"Windows组件向导"对话框中选中"电子邮件服务"选项,点击"详细信息"按钮,可以看到该选项包括两部分内容:POP3服务和POP3服务Web管理。为方便用户远程Web方式管理邮件服务器,建议选中"POP 3服务Web管理"。

  2.安装SMTP服务组件

  选中"应用程序服务器"选项,点击"详细信息"按钮,接着在"Internet信息服务(IIS)"选项中查看详细信息,选中"SMTP Service"选项,最后点击"确定"按钮。此外,如果用户需要对邮件服务器进行远程Web管理,一定要选中"万维网服务"中的"远程管理(HTML)"组件。完成以上设置后,点击"下一步"按钮,系统就开始安装配置POP3和SMTP服务了。

  二、配置POP3服务器

  1.创建邮件域

  点击"开始→管理工具→POP3服务",弹出POP3服务控制台窗口。选中左栏中的POP3服务后,点击右栏中的"新域",弹出"添加域"对话框,接着在"域名"栏中输入邮件服务器的域名,也就是邮件地址"@"后面的部分,如"MAIL.COM",最 后点击"确定"按钮。

  2.创建用户邮箱

  选中刚才新建的"MAIL.COM"域,在右栏中点击"添加邮箱",弹出添加邮箱对话框,在"邮箱名"栏中输入邮件用户名,然后设置用户密码,最后点击"确定"按钮,完成邮箱的创建。

  三、配置SMTP服务器

  完成POP3服务器的配置后,就可开始配置SMTP服务器了。点击"开始→程序→管理工具→Internet信息服务(IIS)管理器",在"IIS管理器"窗口中右键点击"默认SMTP虚拟服务器"选项,在弹出的菜单中选中"属性",进入"默认SM TP虚拟服务器"窗口,切换到"常规"标签页,在"IP地址"下拉列表框中选中邮件服务器的IP地址即可。点击"确定"按钮,此时SMTP服务器默认的是匿名访问,打开切换到"访问"标签页,点击"身份验证"按钮,在对话框中去掉"匿名访问"选项,选中"基本身份验证(Basic authentication)"。这样一个简单的邮件服务器就架设完成了。

  编辑本段 服务扩展

  smtp服务的意义

  SMTP提供一种可靠的有效的传送机制,它用于传送电子邮件。虽然十几年来,它的作用已经有目共睹,可是对它功能的扩充也是必不可少的。对SMTP服务的扩展我们介绍一下:在SMTP转发的邮件中包括信封和内容这两种东西。我们写信也写信封和信皮,我们可以借生活中的信件来帮助理解。

  (1)SMTP信封比较容易理解,它被作为一系列的SMTP协议单元传送,它包括发送者地址,传送模式,还有一个或多个接收者地址。如果有不清楚的地方,请参阅《SMTP协议标准》。

  (2)至于内容,它是由两部分组成的,一部分是信头,一部分是信体,信头是由一个个的域/值对(一个域,一个值)组成的,如果信体有结构的话,它的结构是以MIME构造的。内容从根本上来说是文本的,一般也是由ASCII码构成的,但是由于使用了MIME,所以这个限制应该也是没有了,但信头却不行,一般都应该使用ASCII码表示。虽然SMTP协议是一个不错的协议,可是对它的扩展还是不可避免,本文主要说明了一种扩展方法,使用这种扩展方法,服务器和用户之间可以相互知道对方使用了扩展,使用了多少,如果进行通信。

  这里我们希望让大家知道网络协议中的一个经验:参数越多,死得越快;参数越少,越能持久。参数太多了,根本不利于使用,无法推广,早晚会被别的协议取代。这也符合科学的基础原理,简单。这说明在实现时一定要小心,如果不小心会便得到的远远小于付出的,有时根本不能提供任何益处。

  EHLO命令

  支持SMTP服务扩展的客户应该以EHLO命令开始SMTP会话,而不是通常的HELO命令。如果服务器也支持,那就返回确认响应,如果不支持就返回失败响应。因为引入了EHLO命令,因此会话开始的第一条命令可以是HELO或EHLO。

  因此引入了新的参数,所以SMTP的MAILFROM和RCPTTO命令行长度也能再是512字节了,但是引入新参数的长度必须加以说明,以便实现者准备缓冲区

  命令格式如下:

  ehlo-cmd::="EHLO"SPdomainCRLF

  在命令成功是,服务器返回代码250,如果失败返回代码550,如果出错,返500,501,502,504或421。对比《SMTP协议标准》,EHLO命令可以出现在任何HELO命令出现的地方,在成功发送一个HELO或EHLO命令后再次发送它会使服务器返回503。客户这时不能缓存服务器返回的任何信息。这里一定要注意的是,每次开始SMTP扩展服务会话的时候必须发送EHLO命令。如果服务器能够处理EHLO命令,它会返回代码250。这样,服务器和客户就处于初始状态了,也就是说,所有的状态表和缓冲区已经准备完毕。通常这种响应是多行的,每行响应包括一个关键字,如果有的话,还有一个或多个参数,响应的语法如下:

  ehlo-ok-rsp::="250"domain[SPgreeting]CRLF

  /("250-"domain[SPgreeting]CRLF

  *("250-"ehlo-lineCRLF)

  "250"SPehlo-lineCRLF)

  greeting::=1*<除了CR或LF的所有字符>

  ehlo-line::=ehlo-keyword*(SPehlo-param)

  ehlo-keyword::=(字母/数字)*(字母/数字/"-")

  ehlo-param::=1*<随了空格和控制字符外的字符>

  ALPHA::=<大写A到Z,小写A到Z>

  DIGIT::=<0到9>

  CR::=<回车,ASCII码13>

  LF::=<换行,ASCII码10>

  SP::=<空格,ASCII码32>

  虽然EHLO关键字可以是大写,小写,大小写混合的,但是对它的处理是大小写敏感的,这是与原来规定不同的。IANA支持SMTP服务扩展注册,相对于每个扩展都有一个相应的EHLO关键字值,每个在IANA注册的服务扩展必须在一个RFC中定义。如果一个关键字以X开头,它指的是这个服务扩展是双方约定的,不是标准的。

  如果出于某种原因,服务器不能列出它所支持的服务扩展,就返回代码554。在接收到这个代码后,客户要么发送HELO,要么发送QUIT命令。有时候服务器接收到EHLO命令,可是命令参数不可接受,它就返回代码501。如果服务器识别了EHLO,但对服务器扩展未实现,则返回代码502。

  如果服务器不再提供服务扩展,则返回代码421。在接收到这个代码后,客户要么发送HELO,要么发送QUIT命令。如果服务器不支持服务扩展,则返回500,服务器保持现有状态,在接收到这个代码后,客户要么发送HELO,要么发送QUIT命令。

  有时候,SMTP服务器会在接收到EHLO命令后因为某种原因关闭连接,这种情况在原来的SMTP协议标准中未涉及。为了处理这种情况,客户必须能够确认服务器是否能够工作,它可以重新连接并发送HELO或EHLO命令。有些服务器在接收到一个EHLO命令后会拒绝接收新的HELO命令,这时可以利用RSET命令重新启动,然后再发送HELO。如果客户不注意这样的小细节,会收到失败代码。

  下面我们来看一下MAILFROM和RCPTTO参数。许多服务扩展是在MAILFROM和RCPTTO命令后加入一些参数来实现的。下面我们看一下这两个命令的格式:

  esmtp-cmd::=inner-esmtp-cmd[SPesmtp-parameters]CRLF

  esmtp-parameters::=esmtp-parameter*(SPesmtp-parameter)

  esmtp-parameter::=esmtp-keyword["="esmtp-value]

  esmtp-keyword::=(字母/数字)*(字母/数字/"-")

  esmtp-value::=1*<除了空格,"="和控制字符的所有字符>

  inner-esmtp-cmd::=("MAILFROM:"返回路径)/("RCPTTO:"转发路径)

  如果服务器不能识别或实现一个或多个MAILFROM或RCPTTO参数,它应该返回代码555。如果这种情况只是暂时的,服务器返回代码455。其它返回代码请查阅相关资料,这里不再详述了。服务器以服务扩展处理时,它处理的任何信息都应该在包头上加上"服务扩展标记"以示区别。

  下面是一个例子:

  (1)双方交互:S是服务器,C是客户。

  S:<等待连接在TCP端口25>

  C:<连接到服务器>

  S:220dbc.mtview.ca.usSMTPserviceready

  C:EHLOymir.claremont.edu

  S:250dbc.mtview.ca.ussayshello

  ...

  (2)下面也是一个例子:

  S:<等待连接在TCP端口25>

  C:<连接到服务器>

  S:220dbc.mtview.ca.usSMTPserviceready

  C:EHLOymir.claremont.edu

  S:250-dbc.mtview.ca.ussayshello

  S:250-EXPN

  S:250-HELP

  S:250-8BITMIME

  S:250-XONE

  S:250XVRB

  ...

  这说明服务器实现了服务扩展EXPN和HELP,这两个是标准的服务扩展,另外两个以X开头的是非标准的。

  (3)最后,我们来看看服务器不支持服务扩展时的情况:

  S:<等待连接在TCP端口25>

  C:<连接到服务器>

  S:220dbc.mtview.ca.usSMTPserviceready

  C:EHLOymir.claremont.edu

  S:500Commandnotrecognized:EHLO

  ...

  代码500表示服务器不支持服务扩展。

  编辑本段 通讯模型

  SMTP协议是TCP/IP协议族中的一员,主要对如何将电子邮件从发送方地址传送到接收方地址,也即是对传输的规则做了规定。SMTP协议的通信模型并不复杂,主要工作集中在发送SMTP和接收SMTP上:首先针对用户发出的邮件请求,由发送SMTP建立一条连接到接收SMTP的双工通讯链路,这里的接收SMTP是相对于发送SMTP而言的,实际上它既可以是最终的接收者也可以是中间传送者。发送SMTP负责向接收SMTP发送SMTP命令,而接收SMTP则负责接收并反馈应答。

  从前面的通讯模型可以看出SMTP协议在发送SMTP和接收SMTP之间的会话是靠发送SMTP的SMTP命令和接收SMTP反馈的应答来完成的。在通讯链路建立后,发送SMTP发送MAIL命令指令邮件发送者,若接收SMTP此时可以接收邮件则作出OK的应答,然后发送SMTP继续发出RCPT命令以确认邮件是否收到,如果接收到就作出OK的应答,否则就发出拒绝接收应答,但这并不会对整个邮件操作造成影响。双方如此反复多次,直至邮件处理完毕。SMTP协议共包含10个SMTP命令,列表如下:

  SMTP命令说明

  HELO<domain><CRLF>;识别发送方到接收SMTP的一个HELLO命令

  MAIL FROM:<reverse-path><CRLF>;为发送者地址。此命令告诉接收方一个新邮件发送的开始,并对所有的状态和缓冲区进行初始化。此命令开始一个邮件传输处理,最终完成将邮件数据传送到一个或多个邮箱中。

  RCPT TO:<forward-path><CRLF>;标识各个邮件接收者的地址

  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工具,它通过"/

  etc/smrsh"目录来明确指定可执行文件的列表。简而言之smrsh限制了攻击者可以执行的程序集。当它与sendmail程序一起使用的时候,smrsh有效的将sendmail可以执行的程序的范围限制在smrsh目录之下。

  第一步:

  决定smrsh可以允许sendmail运行的命令列表。缺省情况下应当包含以下命令,但不局限于这些命令:

  "/bin/mail"(如果在你的系统中安装了的话)

  "/usr/bin/procmail"(如果在你的系统中安装了的话)

  注意:不可在命令列表里包括命令解释程序,例如sh(1),csh(1),perl(1),uudecode(1)及流编辑器sed(1)。

  第二步:

  在"/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.c f"文件,修改一下这个配置文件,使你的邮件服务器能够挡住欺骗邮件。

  编辑"sendmail.c f"文件(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"换成你所在的国家和地区代码。后面的更改其实不会影响任何东西。但这是"news.admin.net-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.c f中的"PrivacyOptions="行中添加了"noexpn"和"novrfy"选项,现在在这一行中我们接着添加"restrictmailq"选项。

  任何一个没有特权的用户如果试图查看邮件队列的内容会收到下面的信息:

  [user@deep]$/usr/bin/mailq

  Youarenotpermittedtoseethequeue

  SMTP

  6、限制处理邮件队列的权限为"root"

  通常,任何人都可以使用"-q"开关来处理邮件队列,为限制只允许root处理邮件队列,需要在"/etc/sendma il. 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地址属于本地网络,则认为该发送者为自己的客户。

  这里就要使用ucspi-tcp软件包。在这里我们要使用该软件包的tcpserver程序。该程序的功能类似于inetd-监听进入的连接请求,为要启动的服务设置各种环境变量,然后启动指定的服务。

  tcpserver的配置文件是/etc/tcp.smtp,该文件定义了是否对某个网络设置RELAYCLIENT环境变量。例如,本地网络是地址为192.168.10.0/24的C类地址,则tcp.smtp的内容应该设置如下:

  127.0.0.1:allow,RELAYCLIENT=""

  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<tcp.smtp

  然后再回头看在/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. SMTP是什么?有什么作用?

  SMTP是Simple Mail Transfer Protocol的缩写,即简单邮件传输协议,是一种提供有效可靠传送电子邮件的协议,用于在两台邮件服务器间交换邮件。负责发送邮件的服务器称为SMTP客户,负责接收邮件的服务器称为SMTP服务器. 例如本动画中SMTP-1是客户,SMTP-2是服务器. 如果 Alice采用用户代理形式,则用户代理是客户,SMTP-1是服务器.

  2. 什么是SMTP命令和应答?

  SMTP客户使用命令把邮件信息传送到服务器。共有4个字母组成,例如MAIL命令传送发件人信息,DATA传送邮件内容等.服务器使用应答对此回应,由3个数字后面附上简单的文字说明组成,例如"250 OK" 表示同意客户发来的命令。

  3. 为什么发送邮件前先发送RCPT 命令而不是直接发送邮件?

  先发送RCPT命令的目的是为了弄清服务器是否做好接收邮件的准备,然后才发送邮件. 这样避免浪费网络资源,不致于发送了很长的邮件后才发现收件人帐户有问题,例如查无此人、信箱存储空间不够.

  4.邮件服务器间邮件传输使用了TCP协议,为何邮件有时还会丢失?

  邮件服务器之间的SMTP协议使用TCP连接,可以保证邮件准确无误地在邮件服务器之间传输. 但由于邮件服务器本身的故障,例如邮件空间不足等,会导致邮件无法完成传输而导致丢失.

  5. 发件人用户代理为何不直接将邮件发送给收件人的用户代理,而是通过邮件服务器来传输?

  因为用户电脑、手机性能有限,无法运行收发邮件的程序,并且无法不间断地运行并连接到互联网上. 因此只能将信件暂时存放在邮件服务器中,用户需要时就可以去下载信件.

  6. 为什么用户收发邮件时感觉不到SMTP过程?

  如果用户使用用户代理软件,则这个复杂的过程被用户代理屏蔽了,用户只需要进行简单的发送操作就可完成邮件的发送. 如果用户使用Web方式,则所有过程都由邮件服务器完成.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多