上一篇介绍了邮件服务器的各组件功能和原理,这次来由浅的入深来一步步实现一个邮件系统。
实验环境:
操作系统 | CentOS release 5.11 64位 |
postfix-2.11.6 | |
courier-authlib-0.64.0 | |
cyrus-sasl-2.1.22-7.el5_8.1 | |
cyrus-sasl-plain-2.1.22-7.el5_8.1 | |
dovecot.x86_64 0:1.0.7-8.el5_9.1 | |
一、安装postfix,建立基本配置
postfix安装过程(略)详细可见上一篇博文
http://tchuairen.blog.51cto.com/3848118/1684872
1、编辑配置文件" /etc/postfix/main.cf " 定义如下内容:
myhostname = mail.qupeiyin.net myorigin = $mydomain mydomain = qupeiyin.net mydestination = $myhostname, localhost.$mydomain, localhost,$mydomain mynetworks = 127.0.0.0/8,mynetworks
参数说明:
myhostname | 主机名,与host那么相同。 |
myorigin | 发件人地址域 |
mydomain | 所在域 |
mydestination | 目标收件地址 |
mynetworks | 可以被中继的客户端网段 |
alias_map = hash:/etc/aliases | 别名查找表 |
2、安装dovecot实现邮件接收
yum install dovecot -y
编辑配置文件 /etc/dovecot/dovecot.conf
启用协议
protocols = imap pop3
启动dovecot服务
/etc/init.d/dovecot start
启动成功后会监听端口:imap4:143/tcp,pop3:110/tcp 以明文方式工作;
3、postfix + SASL 用户认证
saslauthd -v 显示当前主机saslauthd服务所支持的验证方式
修改验证方式
vim /etc/sysconfig/saslauthd
启动saslauthd服务
/etc/init.d/saslauthd start
设置开机启动
chkconfig saslauthd on
测试验证机制是否可用,出现OK表示正常;
testsaslauthd -u username-p pass
0: OK "Success."
邮箱格式:
mbox:一个文件存储所有邮件
maildir:一个文件存储一封邮件,所有邮件存储在一个目录中;
#home_mailbox = Mailbox 定义邮箱格式
#home_mailbox = Maildir/
#mail_spool_directory = /var/mail 定义maildir格式邮箱文件的保存路径
4、让postfix支持sasl认证功能
编辑配置文件 /etc/postfix/main.cf 添加如下内容:
broken_sasl_auth_clients = yes smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_invalid_hostname,reject_non_fqdn_hostname,reject_unknown_sender_domain,reject_non_fqdn_sender,reject_non_fqdn_recipient,reject_unknown_recipient_domain,reject_unauth_pipelining,reject_unauth_destination smtpd_sasl_auth_enable = yes smtpd_sasl_local_domain = $myhostname smtpd_sasl_security_options = noanonymous smtpd_sasl_path = smtpd smtpd_banner = Welcome to our Server !
参数说明:
broken_sasl_auth_clients | 是否要通过SASL验证客户端身份 |
smtpd_recipient_restrictions | 定义收件人限制 |
smtpd_sasl_auth_enable = yes | 启用SASL认证功能 |
smtpd_sasl_local_domain = $myhostname | 基于SASL认证的时候指定本地的域 |
smtpd_sasl_security_options | SASL认证的安全选项,noanonymous表示不支持匿名用户 |
smtpd_sasl_path = smtpd | 指定使用SASL的服务器程序 |
smtpd_banner | 定义登陆时候的欢迎信息 |
参数说明(二):
permit_mynetworks | 允许本地网络 |
permit_sasl_authenticated | 允许SASL验证通过的用户 |
reject_invalid_hostname | 拒绝不合法的主机名的主机来收发邮件 |
reject_non_fqdn_hostname | 拒绝不是fqdn格式主机名的主机 |
reject_unknown_sender_domain | 拒绝无法识别的发件人域 |
reject_non_fqdn_sender | 拒绝没有fqdn的发件人 |
reject_non_fqdn_recipient | 拒绝没有fqdn的收件人 |
reject_unknown_recipient_domain | 拒绝无法识别的收件人域 |
reject_unauth_pipelining | 无法验证的管道 |
reject_unauth_destination | 拒绝无法验证的目标地址 |
编辑配置文件/usr/lib64/sasl2/smtpd.conf 添加如下内容:
pwcheck_method:saslauthd
mech_list:PLAIN LOGIN
log_level:3
当需要调试的时候,打开log_level可以输出更为详细的信息。
5、实现postfix基于客户端的访问控制
在配置文件"/etc/postfix/main.cf"使用如下参数控制:
smtpd_client_restrictions= smtpd_data_restrictions= smtpd_helo_restrictions= smtpd_recipient_restrictions = permit_mynetworks,reject_unauth_destination smtpd_sender_restrictions=
参数说明:
smtpd_client_restrictions | 用于限定符合条件的才允许连接服务器 |
smtpd_data_restrictions | 用于限定符合条件的用户才允许发送data指令 |
smtpd_helo_restrictions | 用于限定符合条件的用户才允许发送helo指令 |
smtpd_recipient_restrictions | 用于限定符合条件的用户才允许发送rcpt to指令 |
smtpd_sender_restrictions | 用于限定符合条件的用户才允许发送mail from指令 |
内置限制条件:(更多参考postfix手册)
reject_unauth_destination-拒绝未经认证的目标
permit_mynetworks-该网段的主机可以被中继
访问控制文件
/etc/postfix/access
[email protected] reject
microsoft.com ok
规则编写格式:
pattern action
邮件地址的pattern格式如下:
[email protected] | 用于匹配指定邮件地址 |
domain.tld | 用于匹配以此域名作为邮件地址中的域名部分的所有邮件地址 |
[email protected] | 用于匹配以此作为邮件地址中用户名部分的所有邮件地址 |
主机名称/地址 pattern格式如下:
ip 用于匹配特定的IP地址或网络内的所有主机
network /mask CIDR格式,匹配指定网络内的所有主机
关于action
ok 接受其pattern匹配的邮件地址或主机名称/地址
拒绝部分:
4NN text
5NN text
其中4NN类表示过一会重试,5NN类表示严重错误。
REJECT optional text 拒绝;text为可选信息
DEFER optional text 拒绝;text为可选信息
自定义访问表的条件通常使用check_client_access,check_helo_access,check_sender_access,check_recipient_access 进行,他们后面通常跟上type:mapname格式的访问类型和名称。其中,check_sender_access,check_recipient_access 用来检查客户端提供的邮件地址,其访问表中可以使用完整的邮件地址,如[email protected];也可以只使用域名,如果tuchao.com,还可以只有用户名的部分,如[email protected]。
实例演示(一):
拒绝ip:115.204.89.87 windows 客户端发送邮件
1、编辑 /etc/postfix/access 作为客户端检查控制文件,添加如下一行:
115.204.89.87 REJECT
2、将此文件转换为hash格式
postmap /etc/postfix/access
3、配置postfix使用此文件对客户端进行检查
编辑配置文件 vim /etc/postfix/main.cf 加入一行:
smtpd_client_restrictions = check_client_access hash:/etc/postfix/access
注:这里的hash类型就代表了.db的文件,所以这里不要写后缀。
4、让postfix重新载入配置文件
/etc/init.d/postfix reload
现在使用windows上的客户端发邮件,就会看到被拒绝了;
实例演示(二):
拒绝所在域为 huairen.com 的发件人发送邮件。
1、编辑 /etc/postfix/access 作为客户端检查控制文件,添加如下一行:
huairen.com REJECT
2、将此文件转换为hash格式
postmap /etc/postfix/access
3、配置postfix使用此文件对客户端进行检查
编辑配置文件 vim /etc/postfix/main.cf 加入一行:
smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/access
4、让postfix重新载入配置文件
/etc/init.d/postfix reload
修改客户端的发件人地址,我这里使用的Outlook。 文件—账户设置—找到自己的邮箱地址—更改;
然后尝试发一封邮件出去
可以明显看到拒绝信息,Sender address rejected:Access denied
实例演示(三):
拒绝所有邮件头部用户名为tuchao的地址发邮件
1、添加一个访问控制文件 /etc/postfix/mailhostdeny 作为客户端检查控制文件,添加如下一行:
[email protected] REJECT
2、将此文件转换为hash格式
postmap /etc/postfix/mailhostdeny
3、配置postfix使用此文件对客户端进行检查
编辑配置文件 vim /etc/postfix/main.cf 加入一行:
smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/mailhostdeny,permit_mynetworks,reject_unauth_destination
注:在smtpd_recipient_restrictions配置中,必须要有两个内置参数permit_mynetworks,reject_unauth_destination,如果需要加入其他参数,这两个内置参数放到最后。
4、让postfix重新载入配置文件
/etc/init.d/postfix reload
尝试给[email protected]发送邮件
可以看到收件人不符合要求被拒绝了
邮件别名的使用
编辑别名配置文件 /etc/aliases 加入如下两行:
a: python
tuchao: [email protected]
newaliases 执行此命令用于生成别名文件的hash格式,便于查找,每次修改过aliases文件都要执行。
说明:a:表示把所有发给本地a用户的邮件,全部转发给本地的python用户,这里a用户不存在也没关系服务器能识别到别名就可以了。 把所有发给本地tuchao用户的邮件。全部转发至[email protected]。
给a用户发送邮件测试
给tuchao用户发邮件