610 likes | 908 Views
电子邮件服务器. 西安交通大学 李思 2004 年 8 月 24 日. 主要内容. Email 的基本原理与基本概念 Sendmail 的配置文件 快速建立一个 Email 服务器 Email 服务器的管理与维护 实用小技巧 Webmail 的安装. 1.Email 的基本原理与基本概念. MTS 、 MUA 、 MTA 和 MDA. MTS=Mail Transfer System ,即邮件传输系统 =MUA + MTA + MDA
E N D
电子邮件服务器 西安交通大学 李思 2004年8月24日
主要内容 • Email的基本原理与基本概念 • Sendmail的配置文件 • 快速建立一个Email服务器 • Email服务器的管理与维护 • 实用小技巧 • Webmail的安装
MTS、MUA、MTA和MDA • MTS=Mail Transfer System ,即邮件传输系统=MUA + MTA + MDA • MUA=Mail User Agent,其作用是完成Email从用户终端到邮件服务器之间的传输。例如Foxmail、Outlook • MTA=Mail Transfer Agent,用于完成服务器之间的Email传输。例如Sendmail • MDA=Mail Deliver Agent,用于把本地服务器上的邮件分类存放到用户信箱。例如Procmail
早期Email系统 POP连接 SMTP连接 客户机 客户机 Email服务器
SMTP 连接 SMTP Relay SMTP 连接 POP 连接 Email服务器 Email服务器 客户机 客户机 带Relay的小型Email系统 • SMTP Relay:是指将收件人帐号为非本机帐号的Email转发出去 • 注:图中只画出了一个Relay过程,实际上Email可能经过多次Relay才到达目标服务器
邮件存储池 SMTP连接 SMTP Relay SMTP服务器 POP服务器 SMTP连接 POP连接 客户机 注:图中仅画出了一次Relay过程 客户机 现代大型Email系统 SMTP 服务器
Email路由 • 是指SMTP服务器接收到Email后将它转发到何处的决策过程 • Email路由可以在Email头信息中看到 Received: (qmail 46284 invoked from network); 14 Oct 2003 14:16:23 -0000 Received: from unknown (HELO bigfoot.com) (211.115.216.226) by 202.106.182.233 with SMTP; 14 Oct 2003 14:16:23 -0000 Received: from ausmtp01.au.ibm.com ([202.81.18.186]) by BFLITEMAIL-KR3.bigfoot.com (LiteMail v3.03(BFLITEMAIL-KR3)) with SMTP id 14Oct2003_BFLITEMAIL-KR3_188589_9013268; Tue, 14 Oct 2003 10:18:15 -0400 EST Received: from sd0112e0.au.ibm.com (d23rh903.au.ibm.com [202.81.18.201]) by ausmtp01.au.ibm.com (8.12.10/8.12.9) with ESMTP id h9EEGFai022248 for <samuel_lee@bigfoot.com>; Wed, 15 Oct 2003 00:16:15 +1000 Received: from d23m0013.cn.ibm.com (d23av02.au.ibm.com [9.190.250.243]) by sd0112e0.au.ibm.com (8.12.9/NCO/VER6.6) with ESMTP id h9EDHL3c107890 for <samuel_lee@bigfoot.com>; Wed, 15 Oct 2003 00:16:12 +1000
SMTP • SMTP = Simple Mail Transfer Protocol • 中文名为:简单邮件传输协议 • 它规定了Internet上Email传输的方法 • 是一种基于TCP的应用层协议 • 标准端口号为25 • 采用明文方式进行传输 • 工作方式:客户机/服务器交互(一问一答)
SMTP实例 S: 220 mailei.xjtu.edu.cn C: HELO foo.com S: 250 Hello foo.com, pleased to meet you C: MAIL FROM: <samuel_lee@263.net> S: 250 samuel_lee@263.net… Sender ok C: RCPT TO: <lazy@mailei.xjtu.edu.cn> S: 250 lazy@mailei.xjtu.edu.cn … Recipient ok C: DATA S: 354 Enter mail, end with “.” on a line by itself C: How are you? C: . S: 250 Message accepted for delivery C: QUIT S: 221 mailei.xjtu.edu.cn closing connection • 客户端C, 主机名为foo.com • SMTP服务器S, 主机名为mailei.xjtu.edu.cn
SMTP常用命令 • HELO: SMTP服务标记验证 • MAIL FROM: 用于指定发信人Email地址 • RCPT TO: 用于指定收信人Email地址 • DATA: 邮件的主体信息,以“.”结束 • QUIT: 发送结束,断开SMTP连接 • HELP: 显示帮助信息
POP • POP = Post Office Protocol • 中文名为:邮局协议 • 它规定了用户从服务器接收Email的方法 • 是一种基于TCP的应用层协议 • 标准端口号为110 • 采用明文方式进行传输 • 工作方式:客户机/服务器交互(一问一答) • 目前常用的POP协议为第三版,称为POP3
POP3实例 [root@21h245 mail]# telnet localhost 110 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. +OK POP3 localhost.localdomain v2001.78 server ready user Samuel +OK User name accepted, password please pass xxxxxx +OK Mailbox open, 3 messages stat +OK 3 1807 list +OK Mailbox scan listing follows 1 602 2 610 3 595 .
POP3实例(续) retr 1 +OK 602 octets Return-Path: <root@21h245.xjtu.edu.cn> Received: from 21h245.xjtu.edu.cn (localhost.localdomain [127.0.0.1]) by 21h245.xjtu.edu.cn (8.12.8/8.12.8) with ESMTP id h9M2CCO7001877 for <Samuel@21h245.xjtu.edu.cn>; Wed, 22 Oct 2003 10:12:12 +0800 Received: (from root@localhost) by 21h245.xjtu.edu.cn (8.12.8/8.12.8/Submit) id h9M2CCXT001875 for Samuel; Wed, 22 Oct 2003 10:12:12 +0800 Date: Wed, 22 Oct 2003 10:12:12 +0800 From: root <root@21h245.xjtu.edu.cn> Message-Id: <200310220212.h9M2CCXT001875@21h245.xjtu.edu.cn> To: ls@21h245.xjtu.edu.cn Subject: Hello Status: RO This is a test email. . dele 1 +OK Message deleted quit +OK Sayonara
POP3常用命令 • USER: 输入帐号名 • PASS: 输入密码 • STAT: 显示邮箱当前的状态 • LIST: 列出所有邮件的大小 • RETR: 读取邮件 • DELE: 把邮件标记为删除 • RSET: 取消邮件删除标记 • QUIT: 收信完毕,断开连接 • HELP: 显示帮助信息
Base64编码的引入 • 根据SMTP协议规定,一个字节只传送低7位,最高一位被置零,这种方式适合于传送英文文本,不适合于传送中文字符或者二进制文件 • 虽然有些新的MTA并不会把字节的最高位置0,但是并不是所有的MTA都这样 • 为了使得中文或者二进制文件能顺利传送,引入了base64编码,它的目的是要把二进制比特流转化成英文字符发送
Base64编码规则 • Base64编码算法将输入的二进制位流看成是6个bit一个字节,高位在前,然后用下面的 64 个字符重新表示:0~25: A~Z 26~51: a~z 52~61:0~9 62: + 63: / • 如果输入流的bit数量不是6的整数倍,则在后面补零,使其bit数是6的整数倍 • 如果编码后的字符数不是4的整数倍,则用等号“=”补全成4的整数倍
Base64编码 • 中文: 你好 • 汉字内码:C4 E3 BA C3 • 8 bit位流: 11000100111000111011101011000011 • 6 bit位流: 110001001110001110111010110000110000 • Base64编码后的数值 49 14 14 58 48 48 • Base64编码后的字符 x O O 6 w w = =
DNS与Email服务器 • DNS服务器记录分为A记录、MX记录、PTR记录等 • A = Address,用于一般性的域名解析 • MX = Mail eXchange,用于Email域名解析 • 可给不直接连接在Internet上的主机发信 • 可以使用后备Email服务器 • PTR记录用于反向域名解析,即根据IP查域名 • 如果没有MX记录将无法以域名形式发送Email • 如果没有PTR记录,该服务器发出的信可能被拒收 • 配置Email服务器之前应该在该域的DNS服务器上添加与之对应的MX记录和PTR记录
垃圾邮件原因1:Open Relay • Open Relay是指未经授权的、无条件的Relay即SMTP服务器无条件地接收并转发一切Email • Open Relay曾经导致了世界上70%的垃圾邮件 • 反垃圾邮件的最重要的手段是关闭Open Relay • SMTP服务器应该只接收或转发来自特定位置或者帐号的Email
垃圾邮件原因2:冒名发信 • 一些SMTP服务器虽然关闭了Open Relay,但是允许转发信人地址为本地帐号地址的Email • 冒名发信是指冒用别人的Email地址发送Email • 在无法使用Open Relay的情况下,冒名发信是最常见的发垃圾邮件的手段 • 克服冒名发信的办法是对发信人进行身份验证(通过验证密码)
垃圾邮件的对策 • 垃圾邮件是不可能彻底避免的,但是可以采取一定措施尽可能地避免 • 禁止Open Relay • 采用ESMTP进行身份验证 • 建立垃圾邮件“黑名单” • 尽量不要暴露自己的Email地址例如:Samuel_lee at 263 dot net • 采用人工智能的方法加以鉴别
ESMTP • ESMTP即SMTP服务扩展 • ESMTP要求使用发信人提供帐号和口令 • ESMTP命令: • EHLO:EMSTP标识符,与HELO类似 • AUTH LOGIN:认证登陆开始 • xxxx 输入经过base64编码的帐户名 • xxxx 输入经过base64编码的口令 • 其它命令与SMTP相同
Sendmail是什么? • Sendmail是一个SMTP服务器程序 • 它是历史最悠久的免费服务器软件之一 • Sendmail本身并不提供POP服务 • 它提供邮件路由功能,即 • 接收邮件 • 若是本机用户邮件则存放在本机等待处理 • 否则把收到的邮件转发到下一站
Sendmail的主要配置文件 • /etc/mail/sendmail.cf 主配置文件 • /etc/mail/access.db 使用sendmail的权限列表 • /etc/aliases.db 本地帐号和别名的对照表 • /etc/mail/local-host-names 本地收信主机名表 • /etc/mail/virtusers.db 带域名的帐号别名 • /etc/mail/trusted-users.db 信任用户列表 • /etc/mail/domaintable • /etc/mail/mailertable • /etc/mail/submit.cf
xxxx与xxxx.db文件的关系 • xxxx是指列表文件例如:域名列表、信任用户列表等 • 当列表过大时,会造成查找困难 • xxxx.db是根据xxxx生成的哈希表,它能有效降低查找时间 • Sendmail只读取xxxx.db文件,因此xxxx必须转化成xxxx.db文件才有效 • 转化办法:makemap hash xxxx.db < xxxx
xxxx.mc与xxxx.cf文件的关系 • 每次启动Sendmail时,程序会自动读入sendmail.cf文件 • .cf文件是为方便机器解析而设计的配置文件格式 • .mc是为了方便用户配置而设计的宏文件 • .mc文件必须展开成.cf文件才有效 • 使用m4命令可以展开.mc文件m4 sendmail.mc > sendmail.cf
/etc/mail/sendmail.mc(1) Sendmail.mc可以包含以下内容: • define –定义一个变量 • undefine –取消某个变量的定义 • include –包含一个文件 • dnl –忽略掉从从dnl开始到行末的字符,用于注释 • divert –用于管理输出流,避免输出不必要的信息
/etc/mail/sendmail.mc(2) • OSTYPE 用于指定操作系统类型 • Linux, sgi, solaris…… • 因为不同的操作系统可以把sendmail的文件放在不同的位置 • VERSIONID 设定Sendmail的版本用于显示 • DOMAIN 用于包含域名文件以对不同的域名作出不同响应(一般的小型email服务器无需使用) • MAILER 指定邮件发送代理,即接受到邮件后如何处理
/etc/mail/sendmail.mc(3) • FEATURE 用于设置sendmail的特性 • use_cw_file 允许使用local-host-name文件 • use_cf_file 允许使用trusted-users文件 • access_db 允许使用access.db文件 • redirect 允许邮件转发 • smrsh 指定sendmail受限shell的位置 • always_add_domain 当本地用户发信未指定域名时,给它加上本地域名 • no_default_msa 关闭默认的MSA功能
/etc/mail/sendmail.mc(4) • FEATURE(续) • blacklist_recipients拒收收件人在黑名单中的邮件 • accept_unresolvable_domains 接收来自不可解析域名的Email • local_procmail 指定procmail程序用于投递本地信件 • LOCAL_DOMAIN 定义本机域名 • DAEMON_OPTIONS 将sendmail服务器进程与指定的IP地址和端口号绑定起来
/etc/mail/access(1) • 用于控制sendmail的访问权限 • 前面提到的Relay的问题,可以通过修改这个文件进行控制。例如: • 202.117.21 RELAY • 263.net RELAY • xjtu.edu.cn OK • yahoo.com REJECT • foo.com 550 You are a bad user! • Abc@bar.com 550 I hate you!! • 当文件左边一栏的模式得到匹配时,Sendmail会执行右边一栏的动作
/etc/mail/access(2) 匹配模式的几种格式: • IP(包括子网):例如192.168.0表示一个子网 • 域名,例如:xjtu.edu.cn • Email地址,例如:abc@foo.com 还可以添加from:和to:前缀,例如: • To: abc@abc.com 收信人Email地址 • From:abc.com 发信人Email地址的域名 • 有from前缀的只检查发信人,有to前缀的只检查收信人
/etc/mail/access(3) • 可设定的动作 • OK 不管后面的规则如何,无条件接收 • RELAY 允许转发邮件 • REJECT 拒绝该邮件 • DISCARD 忽略该邮件 • ### xxxx ###是RFC821定义的错误码,XXX 是提示信息 • Sendmail8.9之后版本默认的动作是REJECT。如果不在access中添加相应记录,主机就无法通过Sendmail发送Email
/etc/aliases 用于指定用户的别名,例如 mailer-daemon: postmaster postmaster: root bin: root daemon: root 则发给mailer-daemon、postmaster、bin、daemon的信实际上都是发给root
/etc/mail/local-host-names • 本机的域名列表文件 • Sendmail将收信人Email中的域名与该文件中的域名列表比较,如果有相匹配的,则邮件不会被转发出去 • 当服务器有多个域名时,可以向该文件添加多个域名 • 若不设定,sendmail有可能把应该属于本地的Email,再次查询DNS后转发出去,可能造成循环传送或者Email传送失败。
/etc/mail/domaintable • 类似于/etc/aliases,它可以指定带域名的别名 • 该文件实际上是Email路由的一个配置文件 • 例子: foo@bar.com root @bar.org Samuel@263.net @sina.com %1@vip.sina.com 第一行表示将info@bar.com的Email全部发给本地的root 第二行表示把所有目标为bar.org的邮件全部发给Samuel@263.net 第三行相当于把发送到sina.com的邮件全部发送到vip.sina.com
其它配置文件 • /etc/mail/trusted-users.db信任用户列表,对这些用户系统不产生警告信息 • /etc/mail/domaintable用于提供域名映射 • /etc/mail/mailertable用于不同协议之间的Email路由 • /etc/mail/submit.cfMSP的配置文件 • 以上配置文件都用得比较少
Sendmail快速启动 • 修改/etc/mail/sendmail.mc,将DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA‘)dnl改为: DAEMON_OPTIONS(`Port=smtp, Name=MTA')dnl • m4 sendmail.mc > sendmail.cf • 在/etc/mail/access中添加允许使用本服务器的主机列表,例如202.117.21.224 RELAY • makemap hash access.db < access • service sendmail restart
POP3服务器的启动 • 因为POP3服务相对简单,因此无需配置 • POP3服务由超级服务器进程xinetd管理 • RedHat Linux附带的POP3服务程序叫ipop3 • 注意与pop3s相区别,后者是带SSL加密的POP3服务程序 • 启动ipop3的方法:先用ntsysv允许ipop3服务,然后service xinetd start • 只有本机系统帐号才能通过POP3收取Email
Sendmail与SASL(1) • SASL = Simple Authentication & Security Layer,简单认证安全层 • Sendmail必须依靠SASL才能完成发信认证的过程 • Sendmail的配置方法,在/etc/mail/sendmail.mc中添加以下几行: define(`confAUTH_OPTIONS', `A')dnl TRUST_AUTH_MECH(`LOGIN PLAIN DIGEST-MD5')dnldefine(`confAUTH_MECHANISMS', `LOGIN PLAIN DIGEST-MD5')dnl
Sendmail与SASL(2) • m4 sendmail.mc > sendmail.cf • 把/usr/lib/sasl/Sendmail.conf文件内容改为 pwcheck_method:shadow 或 pwcheck_method:pam 用下面命令重新启动Sendmail即可service sendmail restart • 可以telnet到25端口用ehlo进行测试
帐号的添加和删除 • Sendmail使用Linux系统帐号作为Email帐号,因此添加删除Sendmail帐号就是添加删除Linux系统帐号 • 添加帐号的命令:useradd name • 修改帐号的密码:passwd name • 删除帐号:注意删除帐号后应该把用户主目录和该用户的信件一起删掉 userdel –r name; rm /var/mail/name
Sendmail运行产生的文件 • /var/log/maillog邮件日志记录,记录了系统每一个Email的时间、发送者、发送状态、失败原因等信息 • /var/spool/mail 本地用户邮件的存放处 文件名就是用户帐号名,文件大小就是用户占用的信箱大小 • /var/spool/mqueue 等待发送的Email的队列,可以使用mailq命令来查看它
邮件与邮箱大小限制 • 邮件大小限制修改/etc/mail/sendmail.cf,在文件中找到MaxMessageSize一行,把它改为:O MaxMessageSize=xxxxx (注意去掉注释符#)xxx为允许的最大邮件字节数 • 邮箱大小限制在Sendmail中不能直接限制某个用户的邮箱大小。但是可以通过Shell编程来实现。利用Shell脚本程序定时检查用户邮箱大小,若超过限量,则将用户Email地址添加到access文件中,不允许再接收新邮件即可
遇到麻烦怎么办? • telnet登陆smtp(25)端口,检查Sendmail工作是否正常 • 如果sendmail无法启动,请检查/var/log/messages,以获取错误信息 • 如果只有部分用户使用不正常,请检查/etc/mail/access、/etc/alises和用户主目录下的.forward文件 • 不明原因的信件丢失或者无法发送请打开/var/log/maillog,查看日志记录,了解邮件接收或转发过程的情况