postfix-企业邮件服务器搭建完整版

声明:本文为个人原创,引用请申明出处。此文在百度文库等地方上传过。百度文库ID:denhuaibo!此文最早上传于2014年。
附件提供文档下载。

postfix邮件服务器安装配置文档






目录
简介... 2
构建运行环境... 2
安装配置postfix. 5
在客户端发送邮件... 7
另一种认证更简单... 11
在客户端接收邮件... 12
邮件传输加密... 13
邮件病毒扫描... 14
广告邮件的抵挡... 19
邮件监控... 20












简介 这是一个集成项目,请仔细阅读本文档后再操作。遇到问题时请耐心检查配置和日志文件,本文档中如果没有列出相关解决方法请到网上寻求帮助吧!
本文档旨在让大家明白postfix和其它程序之间的关系,如何让他们协同工作。每种软件提供的功能,所完成何种任务。本文档不详细介绍postfix,具体详细的postfix参数和优化请参阅《POSTFIX权威指南》
这里以redhat6.4系统为例进行安装,其它系统可以根据实际情况对命令进行相应调整,配置方式不变。
在redhat中默认安装了sendmail的需要先使用rpm 命令安装完postfix后卸载掉sendmail,也可以不卸载使用chkconfig sendmail off命令禁止其启动。
在此使用的是一个完整的架构,其中会用到非常多的软件,所以在进行此实验之前需要一定的linux系统基础知识才能保证成功率。
会用到的软件有:
apache 提供网页后台管理功能,可使用nginx或者其它相关程序代替。
php为postfixadmin组件提供浏览,因为postfix admin是使用php编写的网页
mysql提供用户认证和虚拟邮件路径等数据信息
postfix 主邮件系统,提供邮件管理
postfix admin 提供邮件网页管理功能,是一个使用php编写的网页。可使用extmail代替。
cyrus-sasl提供smtp发送邮件认证功能
pam_mysql提供pam的mysql认证,与cyrus-sasl协同工作。可使用courier-authlib代替
dovecot提供收件服务功能
Amavisd-new 邮件系统和杀毒软件之间的中介程序,负责调用杀毒软件对邮件进行病毒扫描
Clamav一个开源的杀毒软件,另外一个比较好的是f-prot但是要收费。
总共有10个软件协同工作来构建出一套实用安全的邮件系统。以下内容是本人在部署完整个系统后发现在整个过程中费了很多的时间和经历,所以想想还是把它写下来贡献给大家学习参考。由于是事后回忆,当初也没有做笔记,所以很多在过程中遇到的错误没有记录下来实在是一个遗憾。希望大家引以为鉴,在平时工作和学习当中一定要做好笔记,特别是错误的处理过程。这里只能通过日志内容回忆一下处理的全过程供大家参考了。下面如无特殊说明,所使用的rpm包均在安装光盘中能直接找到
构建运行环境 为了方便后续操作,在安装之前有必要进行yum源的配置,然后通过光盘进行安装是比较方便的事情。所以下面从光盘安装的rpm包都使用yum命令操作,当然也可以使用rpm命令,看个人喜好了.
1、apache和php安装
yum install httpd安装apache程序
php安装:
虽然安装光盘中有php的rpm包,但是只能提供一般的功能,postfixadmin中会用到两个功能是rpm包无法提供的,所以必须下载源码编译安装。否则打开网页配置时会出现如下错误,提示缺少mbstring和imap组件。

  • Error: Depends on:multibyte string - NOT FOUND
    To install multibyte string support, install php5-mbstring
  • Warning: Depends on: IMAPfunctions - NOT FOUND
    To install IMAP support, install php5-imap
    Without IMAP support, you won't be able to create subfolders when creatingmailboxes.

可以到http://www.php.net/ 官网下载php的源代码,这里使用的是php-5.5.5.tar.gz当前最新版本。使用tar -zxf php-5.5.5.tar.gz解压然后编译,下面是编译的.configure选项
./configure --prefix=/usr/local/php5.5 --enable-bcmath--enable-mbstring--enable-sockets--enable-zip --with-apxs2=/usr/sbin/apxs --with-libxml-dir --with-gd --with-mysql--with-mysql-sock --with-jpeg-dir --with-freetype-dir --with-gettext--with-imap --with-imap-ssl --with-kerberos
程序运行的过程中可能会出现错误,无法继续的可能。下面列出一些来:
./configure: line 8423: /usr/sbin/apxs: No such file ordirectory请安装httpd-devel组件
configure: error: xml2-config not found请安装libxml2-devel
configure: error: jpeglib.h not found 请安装libjpeg-turbo-devel
configure: error:png.h not found 请安装 libpng-devel
configure: error: freetype.h not found. 请安装 freetype-devel
error: utf8_mime2text() has new signature 需要安装libc-client和libc-client-devel 可到rpmfind.net上下载
configure: error: Kerberos libraries not found. 请安装krb5-devel
configure: error: Cannot find OpenSSL's 请安装openssl-devel
其它错误,请自行网上查找答案。
如果通过,你会看到Thank you for using PHP.的这么一行,当然不一定显示在最后。
看到这个就表示成功很近了,使用make编译,然后make install安装。
默认安装完以后使用servicehttpd start就可以启动了,不需要什么配置。
可以在/var/www/html/下写一个php的测试页。
vi/var/www/html/index.php内容为:
phpinfo();
?>
然后保存,使用浏览器输入服务器的ip地址就能看到一片php的信息。当然如果高端一点的可以使用源码进行安装,其中配置过程就比较麻烦一点。具体方式可以参考网上的文档,这里不细说。
如果php网页无法执行,只能看到文件内容请检查httpd.conf文件中是否有一下内容:
LoadModulephp5_module modules/libphp5.so
AddHandlerphp5-script .php
AddTypetext/html .php
2、mysql安装配置:
同样使用yum installmysql-server 进行安装,当然数据库就比较麻烦一点。
安装完成后使用mysql_install_db命令对数据库进行初始化,接下来就可以启动数据库了。service mysqld start 启动
/usr/bin/mysqladmin-u root password “newpassword” 修改数据库密码,然后使用service mysqld restart重新启动一次,使用mysql -u root -p 输入上面的密码后登录数据库测试是否能正常使用。
3、postfixadmin安装
下载位置http://sourceforge.net/projects/postfixadmin/files/postfixadmin/目前使用的是2.3.6版本。
删除/var/www/html/index.php之前的测试文件,然后把postfixadmin-2.3.6.tar.gz解压到此处。
为postfix单独创建一个数据库和帐号,是比较明智的选择,便于管理和备份。
mysql -u root -p
输入密码登录数据库
mysql> createdatabase postfix character set utf8; 创建数据库
mysql> grantall privileges on postfix.* to postfix@localhost identified by 'youpassword';
vi/var/www/html/config.inc.php修改内容
$CONF['configured']= true; 打开配置功能
$CONF['database_type']= 'mysql'; 设置网页数据库类型
$CONF['database_host']= 'localhost'; 数据库主机地址
$CONF['database_user']= 'postfix'; 数据库账户
$CONF['database_password']= 'postfix'; 数据库密码
$CONF['database_name']= 'postfix'; 数据库名字
修改完后保存
在浏览器中输入http://192.168.4.11/setup.php如果正常就能看到

输入一个密码点下面的按钮,会有提示要求再次编辑config.inc.php 文件输入

修改好以后在第一项输入刚才设置的密码,第二项为管理员email地址如admin@test.com下面输入设置的密码。然后点按钮提交,这样就算设置完了。
首先新建一个域:

然后可以新建邮箱:

注意用户名和名字需要一模一样,否则可能会导致后面无法登录验证。具体原因不知道,如果你们明白怎么回事情,还希望发送邮件给我谢谢! denwork#qq.com把#改成@
建立还邮箱地址以后还是不能发送邮件,因为没有邮件服务程序。
安装配置postfix 配置好yum源,然后通过光盘进行安装是比较方便的事情。其实redhat系统在安装完成以后就已经安装完成了。yum install postfix进行安装
主要的配置文件:
/etc/postfix/main.cfpostfix的打部分设置都在此文件中,后面会多次用到这个文件
/etc/postfix/master.cf该文件规定了postfix每个程序的运行参数,后面也会使用到
编辑main.cf文件这里只列出修改的内容

myhostname =mail.test.com输入本机的计算机名
mydestination = 因为要在下面设置virtual_mailbox_domains所以这里需要留空
mydomain = test.com输入域名
inet_interfaces= all运行的接口
mynetworks =192.168.4.11/32,127.0.0.1/32 设置信任的客户端地址
注释:设置虚拟邮件目录(下面的内容一样在main.cf里面)
virtual_mailbox_base= /var/mailbox设置虚拟邮件目录
virtual_mailbox_maps= mysql:/etc/postfix/mysql/mysql_virtual_mailbox_maps.cf 定义邮件结构,使用到的表是mailbox。里面保存了用户名密码,用户邮件的路径等。
virtual_mailbox_domains= mysql:/etc/postfix/mysql/mysql_virtual_domains_maps.cf定义邮件域名。里面记录了邮件服务器可以服务的域名,可以为很多域名提供邮件服务。
virtual_alias_maps= mysql:/etc/postfix/mysql/mysql_virtual_alias_maps.cf定义邮件别名,比如每个部门有一个名字对应了整个部门所有的员工邮件地址。
virtual_minimum_uid= 48 因为是网页上面对其进行操作,所以这里的uid和gid需要是apahce的用户id,可以在/etc/passwd文件中查看,或者使用id apache命令查看。
virtual_uid_maps= static:48 同上
virtual_gid_maps= static:48 同上
virtual_transport= virtual 传输类型当然是virtual了
message_size_limit= 41720000允许发送的最大邮件大小,注意这里不是附件而是整个邮件的大小。单位为Byte
mailbox_size_limit= 209715200定义邮件可以使用的空间
virtual_mailbox_limit= 209715200 定义虚拟邮件可以使用的空间
virtual_create_maildirsize= yes
virtual_mailbox_extended= yes
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql/mysql_virtual_mailbox_limit_maps.cf用来定义设置邮箱容量,有了上面的两个项可以不使用。
virtual_mailbox_limit_override= yes
virtual_maildir_limit_message= Sorry, the user’s maildir has overdrawn his disspace quota, please try againlater.
virtual_overquota_bounce= yes
==============================main.cf完=========================================
上面main.cf文件中还有几个cf的文件,如
mysql:/etc/postfix/mysql/mysql_virtual_mailbox_maps.cf意思是需要在/etc/postfix/mysql 目录下创建mysql_virtual_mailbox_maps.cf的文件,下面就给出这几个文件的内容。
/etc/postfix/mysql/mysql_virtual_mailbox_maps.cf:
user = postfix填写数据库账户
password = postfix 数据库密码
hosts = localhost数据库地址
dbname = postfix数据库名
table = mailbox使用的表
select_field = maildir关键字
where_field = username 条件
上面的动作完成使用账户密码等内容登录数据库,然后执行use postfix; select maildir from mailbox where username=”test@test.com”; 得到的结果是这个邮件用户保存邮件的相对main.cf配置文件中virtual_mailbox_base = /var/mailbox选项设置的路径加上查询的结果。比如邮件名为test@test.com的用户邮件路径为/var/mailbox/test@test.com/。告诉postfix程序保存邮件的具体位置,下面其它类似文件的作用也是如此。就不做一一讲解了。
mysql_virtual_domains_maps.cf内容:
user = postfix
password = postfix
hosts = localhost
dbname = postfix
table = domain
select_field = domain
where_field = domain
mysql_virtual_alias_maps.cf内容:
user = postfix
password = postfix
hosts = localhost
dbname = postfix
table = alias
select_field = goto
where_field = address
mysql_virtual_mailbox_limit_maps.cf内容:
user = postfix
password = postfix
hosts = localhost
dbname = postfix
table = mailbox
select_field = quota
where_field = username
=================================关于数据库的设置文件完========================
还需要对master.cf文件进行设置,上面就写过这个文件是对postfix的各个程序进行控制,所以后面的收发文件、病毒查杀等程序都是在这个文件中设置。添加一行:
smtpsinetn-n--smtpd

到这里postfix基本就可以搭配postfixadmin进行收发邮件了。但是这尽限于本机,还无法像其它客户端一样通过网页或者outlook等客户端进行收发邮件。
对postfix进行测试,使用service postfix start命令启动程序。这里需要注意,就算显示OK也需要查看一下/var/log/maillog文件中是否有错误。否则还是会不成功的。
telnet 127.0.0.1 25可以测试postfix是否正常。
输入ehlo local
mail from:test@test.com
rcpt to:main@test.com
data
“输入邮件内容”
. 输入一个点结束编辑
250 2.0.0 Ok: queued as 2AE65203D6 出现类似内容代表邮件已经发出了。
在客户端发送邮件 经过上面的设置后,就可以发送邮件了。如果要达到使用foxmail或者outlook客户端进行邮件的收发还需要进行下一步配置,就是登录邮件服务器的验证。
启用stmpd程序的认证,这个认证的目的是可以使用客户端登录邮件服务器发送邮件,如果需要收邮件还需要另外一个程序。
常常使用saslauthd来进行程序认证,需要安装如下rpm包:
cyrus-sasl-lib、cyrus-sasl-devel、cyrus-sasl-plain、cyrus-sasl-md5、cyrus-sasl。
编辑/etc/sasl2/smtpd.conf配置文件:
pwcheck_method:saslauthd 认证程序
log_level: 3 日志级别
mech_list: plainlogin 提供的认证类型
saslauthd_path:/var/run/saslauthd/mux 执行程序的socket文件默认为此位置
这里更正一下网上的内容,很多网站上面写的都是一样的,各个网站互相复制内容。导致结果全是错误的根本无法提供验证。后来找到一个方法,就是使用pam_mysql模块为sasl程序提供pam的验证功能达到验证的目的。
下载pam_mysql源代码。http://download.chinaunix.net/download/0008000/7820.shtml在网上找到的链接,只能保证暂时有效。大家可以去网上搜索。我目前找到的最高版本pam_mysql-0.7RC1.tar.gz
使用如下命令进行编译安装。
./configure--with-openssl=/usr/include/openssl/ --with-mysql=/usr--with-pam=/usr--with-cyrus-sasl=/usr/include/sasl/
在配置程序运行的过程中会提示没有pam的头文件,需要安装pam-devel、mysql-devel
其中由于需要md5支持,需要把/usr/include/openssl/md5.h文件拷贝到/usr/include/md5.h下才能编译成功。如果没有这个文件需要安装openssl-devel。
然后make &&make install 编译并安装
把编译好的模块cp/usr/lib/security/pam_mysql.* /lib/security/目录下
编辑PAM模块,让smtp程序能调用pam进行mysql数据库认证,使用vi 打开/etc/pam.d/smtp.postfix删除原来的两项内容,添加以下两项内容:
auth sufficientpam_mysql.so user=postfix passwd=postfix host=localhost db=postfixtable=mailbox usercolumn=name passwdcolumn=password crypt=1 4
accountrequired pam_mysql.souser=postfixpasswd=postfixhost=localhostdb=postfix table=mailbox usercolumn=name passwdcolumn=password crypt=1 4
以上参数的解释和其它参数请查看程序编译目录的README文件。
除了上面的配置以外还需要在/etc/postfix/main.cf配置文件中添加以下内容:
broken_sasl_auth_clients= yes 启用sasl登录认证
smtpd_recipient_restrictions=
permit_mynetworks 允许mynetworks选项中的主机
permit_sasl_authenticated 允许通过sasl_authenticated认证的主机
reject_invalid_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_path= smtpd
smtpd_sasl_local_domain= $myhostname
smtpd_sasl_security_options= noanonymous
smtpd_banner =Welcome to our $myhostname ESMTP,Warning: Version Available!


调试方法:
配置好上面的配置文件以后重新启动postfix,使用telnet127.0.0.1 25进行调试,以下是调试内容:
[root@localhostlog]# telnet 127.0.0.1 25
Trying127.0.0.1...
Connected to127.0.0.1.
Escape characteris '^]'.
220 Welcome toour localhost.localdomain ESMTP,Warning: Version Available!这里显示的内容是上面main.cf中smtpd_banner= Welcome to our $myhostname ESMTP,Warning: Version Available!的信息。
ehlo local 查看服务器支持的信息。
250-localhost.localdomain
250-PIPELINING
250-SIZE41720000
250-VRFY
250-ETRN
250-AUTH PLAINLOGIN
250-AUTH=PLAINLOGIN显示这两项说明支持plain 和login认证
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
auth login使用login认证方式
334 VXNlcm5hbWU6提示输入用户名
dGVzdEB0ZXN0LmNvbQ==
334 UGFzc3dvcmQ6提示输入密码
cmVkaGF0
235 2.7.0 Authenticationsuccessful出现这个表示认证成功。
上面输入的密码是通过命令编码后的内容,在shell命令行中输入printf”test@test.com” | openssl base 64,然后就能看到了,密码也是如此。同时可以在日志里面查看认证过程,涉及到的日志文件有/var/log/maillog, /var/log/message, /var/log/secure, 如果其中的内容都不能判断是什么错误的话,那么请启用mysql的详细日志。进入mysql 使用show variables like "%general_log%"; 语句进行查看,如果|general_log| OFF,那么set globalgeneral_log=1; 语句开启,并在上一条语句中查看到的路径中文件的位置进行查看。然后再此执行认证过程,看是否mysql参与了认证过程。我在安装的时候就忘记把pam文件中原来的两行注释,造成没有通过mysql认证所以导致日志文件中总是提示认证失败没有别的错误提示。
在实际应用过程中会发现,当你使用A用户登录后以B用户的名义来寄信这也是可以的。所以必须杜绝这种情况发生。设置防止伪造发信人:
在main.cf中添加
smtpd_sender_login_maps=
mysql:/etc/postfix/mysql/mysql_sender_login_maps.cf,mysql:/etc/postfix/mysql/mysql_virtual_alias_maps.cf
smtpd_reject_unlisted_sender= yes
smtpd_sender_restrictions= reject_authenticated_sender_login_mismatch
smtpd_recipient_restrictions=
reject_sender_login_mismatch
reject_authenticated_sender_login_mismatch
修改后的smtpd_recipient_restrictions=
permit_mynetworks
reject_invalid_hostname
reject_unknown_sender_domain
reject_sender_login_mismatch
reject_authenticated_sender_login_mismatch
permit_sasl_authenticated
reject_non_fqdn_sender
reject_non_fqdn_recipient
reject_unknown_recipient_domain
reject_unauth_pipelining
reject_unauth_destination
#reject_non_fqdn_hostname
注意这个列表的顺序,否则可能出问题。
数据库文件配置:
mysql_sender_login_maps.cf:
user = postfix
password = ps.test.com
hosts =localhost
dbname = postfix
table = mailbox
select_field =username
where_field =username
mysql_virtual_alias_maps.cf:
user = postfix
password = ps.test.com
hosts =localhost
dbname = postfix
table = alias
select_field =goto
where_field =address
additional_conditions= AND active='1'
配置完后重启postfix服务,再进行测试。使用A账户和密码登录,指定发件人为B 如如果以上配置成功会出现如下类似错误:
postfix/smtpd[10220]:NOQUEUE: reject: RCPT from unknown[112.193.145.100]: 553 5.7.1 :Sender address rejected: not owned by user test@test.com; from=< test@test.cn> to=< testwork@qq.com> proto=ESMTP helo=
另一种认证更简单
smtp.conf配置

pwcheck_method:authdaemond
log_level: 3
mech_list: plainlogin
srp_mda: md5
password_format:crypt
authdaemond_path:/usr/local/courier-auth/var/spool/authdaemon/socket


courier-authlib安装
./configure--sysconfdir=/etc --prefix=/usr/local/courier-auth--with-authmysqlrc=/etc/authlib/authmysqlrc--with-mysql-libs=/usr/lib/mysql/ --with-mysql-includes=/usr/include/mysql/
在configure期间如果提示LibToolltdl库文件没找到就需要安装libtool-ltdl-devel这个软件包。
makeinstall-configure配置文件可以使用这个命令来生成
按照上面的配置安装完成后,所有的配置文件都在/etc/authlib下面。
配置authdaemonrc文件告诉程序使用mysql模块认证。
authmodulelist="authmysql"
authmodulelistorig="authmysql"
只需要修改这两项就行了。
authmysqlrc文件

MYSQL_SERVERlocalhost
MYSQL_USERNAMEpostfix
MYSQL_PASSWORDpostfix
MYSQL_SOCKET/var/lib/mysql/mysql.sock
MYSQL_PORT3306
MYSQL_DATABASEpostfix 数据库名称
MYSQL_USER_TABLEmailbox 数据库表名
MYSQL_CRYPT_PWFIELDpassword 密码字段
DEFAULT_DOMAINtest.com服务器域名
MYSQL_UID_FIELD89 postfix的账户ID
MYSQL_GID_FIELD89 postfix组ID
MYSQL_LOGIN_FIELDusername 数据库表中带域名的字段
MYSQL_HOME_FIELD'/var/mailbox/' 邮件存放位置,和main.cf文件中的一致
MYSQL_NAME_FIELDname用户名字段
MYSQL_MAILDIR_FIELDmaildir 邮件路径字段
MYSQL_WHERE_CLAUSEactive='1' 是否为激活状态

在编译目录下把courier-authlib.sysvinit文件复制到/etc/init.d目录下courier-authlib这样就可以使用service命令启动了。


排错:
warning: SASL authentication failure: cannotconnect to Courier authdaemond: Permission denied
出现以上信息时,请检查/usr/local/courier-auth/var/spool/authdaemon目录的权限,请增加执行权限。
warning: SASL authentication failure: cannotconnect to Courier authdaemond: No such file or directory
1、出现以上信息,请确认courier-authlib已经启动。
2、authmysqlrc、smtp.conf文件中每行的结尾是否有空格。特别是authdaemond_path:/usr/local/courier-auth/var/spool/authdaemon/socket
3、main.cf文件中smtpd_sasl_local_domain= 参数需要为空。
在客户端接收邮件 如果你通过了上面的配置,那么恭喜你。经过漫长的测试和配置过程,你的邮件服务器已经可以通过客户端发送邮件了,但是很遗憾的告诉你。到这里你也才刚刚完成了整个邮件系统建设的一半工作,只能发不能收算什么邮件系统。下面就来介绍如何使用客户端来接收别人发来的邮件。
这里使用到的软件是dovecot使用yum installdovecot进行安装,可以先查看一下包的文件结构,这样比较能知道配置文件等的位置。
首先打开/etc/dovecot/dovecot.conf,里面修改的内容有
base_dir =/var/run/dovecot/
protocol pop3
把这两行的注释去掉,
接下来是下级目录conf.d中10-auth.conf配置认证方式
disable_plaintext_auth= no 支持明文传输
auth_mechanisms= plain login加上认证类型
#!includeauth-system.conf.ext 注释掉这行
!includeauth-sql.conf.ext取消这样的注释。打开使用sql认证的功能
10-mail.conf配置mail的存放路径。
找到mail_location的行,添加mail_location= maildir:/var/mailbox/%n@%d/ 这里只的是mail的目录为/var/mailbox/邮箱名@域名/。
first_valid_uid= 48 uid为系统的apache用户ID,这里一定要修改正确否则也会认证不成功
20-pop3.conf配置去掉pop3_uidl_format的注释。
在/etc/dovecot/下新建一个配置文件dovecot-sql.conf.ext,这个文件的位置取决于在conf.d目录下auth-sql.conf.ext配置文件中的路径。内容如下
driver =mysql
connect =host=localhost dbname=postfix user=postfix password=postfix 数据库的链接信息
default_pass_scheme= MD5 邮件密码加密方式
password_query =SELECT password, concat('/var/mailbox/',maildir) AS home, 48 AS uid, 48 AS gidFROM mailbox WHERE username = '%u'
user_query =SELECT concat('/var/mailbox/',maildir) AS home, 48 AS uid, 48 AS gid FROMmailbox WHERE username = '%u'
配置完成后就可以启动dovecot服务了。servicedovecot start
测试方式也可以使用telnet127.0.0.1 110
[root@localhostconf.d]# telnet 127.0.0.1 110
Trying127.0.0.1...
Connected to127.0.0.1.
Escape characteris '^]'.
+OK Dovecot ready.
usertest@test.com
+OK
pass redhat
+OK Logged in.
list
+OK 3 messages:
1 2492
2 435
3 320
如果到这里就证明认证已经可以正常使用了,如果遇到无法认证可以到maillog文件中查看日志。
在配置dovecot时总会发现日志内容不够详细,可以通过下面选项打开程序的调试日志便于程序的排错。
# 显示协议层的SSL错误
verbose_ssl = yes
# 详细的认证过程信息记录
auth_verbose = yes
# 更详细的认证调试(debug)信息
auth_debug = no
邮件传输加密 以上配置中的,密码和内容都是在网络上明文传输的,所以非常的不安全。可以启用SSL加密方式进行认证。
smtp邮件发送的加密认证:
生成ssl证书文件:
make -C/etc/pki/tls/certs smtpd.pem
mv/etc/pki/tls/certs/smtpd.pem/etc/postfix/
在生成证书是会提示输入一些内容,按照提示输入即可。
打开/etc/postfix/main.cf文件,添加以下内容:
#=========================postfixssl config==================
smtp_use_tls =yes
smtpd_use_tls =yes
smtp_tls_note_starttls_offer= yes
smtpd_tls_key_file= /etc/postfix/smtpd.pem
smtpd_tls_cert_file= /etc/postfix/smtpd.pem
smtpd_tls_CAfile= /etc/postfix/smtpd.pem
smtpd_tls_loglevel= 1
smtpd_tls_received_header= yes
smtpd_tls_session_cache_timeout= 3600s
打开/etc/postfix/master.cf文件:
smtpsinet n-n--smtpd
前面已经添加过这一项了,不过还是请确认一下。默认配置里面会有多余的两个-o选项,还请不要配置。
注意,经过测试在配置邮件客户端的时候需要选择认证加密方式。分别发送加密为tls端口还是25,收信加密为ssl端口会变成993或者995。
dovecot邮件接收的加密认证:
首先配置conf.d目录下的10-auth.conf文件:
disable_plaintext_auth= yes
10-master.conf文件:
inet_listenerimap {
port = 0 改成0.
#port = 143
}
inet_listener pop3{
port = 0 改成0
#port = 110
}
10-ssl.conf文件:
ssl = yes
ssl_cert = ssl_key = 查看一下/etc/pki/dovecot/certs/dovecot.pem是否有此文件,如果没有此文件需要运行/usr/libexec/dovecot/mkcert.sh脚本。如果使用rpm包安装默认文件是已经存在的。
然后重新启动dovecot程序,servicedovecot restart
SSL认证登录时,使用mutt-f pops://test@test.com登录发现调试日志中的用户名是test。自动加上域名需要在10-auth.conf中配置
auth_default_realm= test.com
设置完以上内容后就可以使用客户端进行测试了,outlook或者foxmail。
邮件病毒扫描 目前邮件病毒比较猖獗,如果有相关的杀毒软件放在服务器上就能保护所有的用户。现在比较好的邮件杀毒软件算是f-prot和clamav。
配置杀毒软件需要两个软件支持,amavisd和clamav 或者f-prot
其中amavisd可以在这个网站下载rpm包http://www.ijs.si/software/amavisd/#download或者源码,这里为了方便我下载了rpm包。同时如果需要安装这个rpm包的话还需要很多的依赖包,而且有很多是在光盘中无法找到的。这些包可以到rpmfind.net或http://pkgs.repoforge.org/ 下载。下面列出光盘中没有的包:
amavisd-new-2.8.0-1.el6.rf.i686.rpm这个包可以到官网下载
altermime-0.3.10-1.el6.rf.x86_64.rpmperl-BerkeleyDB-0.43-1.el6.rf.x86_64.rpm
amavisd-new-2.8.0-1.el6.rf.x86_64.rpmperl-Convert-TNEF-0.18-1.el6.rf.noarch.rpm
arc-5.21p-1.el6.rf.x86_64.rpmperl-Convert-UUlib-1.34-1.el6.rf.x86_64.rpm
cabextract-1.4-1.el6.rf.x86_64.rpmperl-Net-Server-0.99-1.el6.rf.noarch.rpm
freeze-2.5.0-3.el6.rf.x86_64.rpmperl-Unix-Syslog-1.1-1.el6.rf.x86_64.rpm
lha-1.14i-19.2.2.el6.rf.x86_64.rpmripole-0.2.0-1.2.el6.rf.x86_64.rpm
ncompress-4.2.4-54.el6_2.1.x86_64.rpmunarj-2.63-0.a.2.el6.rf.x86_64.rpm
nomarch-1.4-1.el6.rf.x86_64.rpmunrar-4.2.3-1.el6.rf.x86_64.rpm
p7zip-9.20.1-1.el6.rf.x86_64.rpmzoo-2.10-2.2.el6.rf.x86_64.rpm
使用rpm -ivh安装完所有rpm包以后就可以进行配置了。
amavisd配置很简单打开/etc/amavisd.conf文件,搜索clamav。然后去掉其中内容的注释就行了:
['ClamAV-clamd',
\&ask_daemon, ["CONTSCAN {}\n","/tmp/clamd.socket"],
qr/\bOK$/m, qr/\bFOUND$/m,
qr/^.*?: (?!Infected Archive)(.*) FOUND$/m ],

['ClamAV-clamd-stream',
\&ask_daemon, ["*", 'clamd:/tmp/clamd.socket'],
qr/\bOK$/m, qr/\bFOUND$/m,
qr/^.*?: (?!Infected Archive)(.*) FOUND$/m ],
/tmp/clamd.socket这个文件需要安装了clamav之后再确定正确路径。
上面是病毒引擎,还需要一些别的基本配置才可以使用。
$mydomain =修改成你的域名
$MYHOME =amavis的默认目录,如果是rpm安装的。应该不需要修改。
$inet_socket_port = 10024程序监听端口
$myhostname = mail.test.com本地主机名
$notify_method= 'smtp:[127.0.0.1]:10025';
$forward_method = 'smtp:[127.0.0.1]:10025'; 设置链接端口,在postfix权威指南里面说到是只扫描完邮件后通过这个端口传回给postfix处理。
下面是找到问题邮件后进行什么操作的规则
$final_virus_destiny=D_DISCARD; 找到病毒后
$final_banned_destiny= D_BOUNCE; 找到禁止项目
$final_spam_destiny= D_PASS; 找到广告
$final_bad_header_destiny = D_PASS; 找到不良信件标头
操作的选项有 D_PASS无论邮件的内容是否有问题,都发给收件人。
D_DISCARD 邮件被直接丢弃,而且不会告知收件人和发件人。
D_BOUNCE 邮件不会传给收件人,但无法传递的信息会传给发件人。
D_REJECT 邮件不会传给收件人,但发件人会收到拒绝的信息。
暂时先不要启动amavisd因为还没有安装杀毒软件,这只是一个杀毒软件与postfix之间的接口程序而已。
下面来安装clamav:
下载clamav源代码,./configure --prefix=/usr/local/clamav命令进行配置安装。
安装完以后配置文件在/usr/local/clamav/etc/目录下,里面有两个默认的实例文件,把clamd.conf.sample复制一份成clamd.conf另外一个也进行类似操作,然后对文件进行修改。
clamd.conf文件配置:
#Example把这行注释掉。
LogFile /var/log/clamav/clamd.log
LogFileMaxSize 1M
LogVerbose
LogTime
LocalSocket /tmp/clamd.socket
PidFile /var/run/clamav/clamd.pid
DatabaseDirectory/usr/local/clamav/data
MaxDirectoryRecursion 15
User amavis默认为clamav一定要修改,否则会lstat() failed: Permission denied. ERROR\n" at (eval 113) line897.的提示信息而无法扫描。
ScanMailyes
ScanArchive yes
上面的选项可根据实际情况调整,在配置文件中有详细的说明。
freshclam.conf文件配置:
#Example 注释掉
DatabaseDirectory /usr/local/clamav/data 和上面一样配置
UpdateLogFile /var/log/clamav/freshclam.log
LogSyslog
LogVerbose
DatabaseOwner amavis
Checks 12
DatabaseMirror db.CN.clamav.net这里默认CN是XY
DatabaseMirror database.clamav.net
NotifyClamd /usr/local/clamav/etc/clamd.conf
创建相关目录 mkdir /var/log/clamav && chown -c amavis /var/log/clamav/
mkdir /usr/local/clamav/data && chown -c amavis /usr/local/clamav/data
执行/usr/local/clamav/bin/freshclam升级病毒库。
为方便启动和管理程序方便,创建一个程序启动脚本:
vi /etc/init.d/clamd:
#! /bin/bash
#
# crond Start/Stop the clam antivirusdaemon.
#
# chkconfig: 2345 90 60
# description: clamdis a standard UNIXprogram that scans for Viruses.
# processname: clamd
# config: /usr/local/etc/clamd.conf
# pidfile: /var/run/clamav/clamd.pid

# Source function library.
. /etc/init.d/functions

RETVAL=0

# See how we were called.

prog="clamd"
progdir="/usr/local/clamav/sbin"

# Source configuration
if [ -f /etc/sysconfig/$prog ] ; then
. /etc/sysconfig/$prog
fi

start() {
echo -n $"Starting $prog: "
daemon $progdir/$prog
RETVAL=$?
echo
return $RETVAL
}

stop() {
echo -n $"Stopping $prog: "
killproc $prog
RETVAL=$?
echo
return $RETVAL
}

rhstatus() {
status clamd
}

restart() {
stop
start
}

reload() {
echo -n $"Reloading clam daemonconfiguration: "
killproc clamd -HUP
retval=$?
echo
return $RETVAL
}

case "$1" in
start)
start
; ;
stop)
stop
; ;
restart)
restart
; ;
reload)
reload
; ;
status)
rhstatus
; ;
condrestart)
[ -f /var/lock/subsys/clamd ] &&restart || :
; ;
*)
echo $"Usage: $0 {start|stop|status|reload|restart|condrestart}"
exit 1
esac

exit 0
设置 clamav 为自启动项

# chmod 755 /etc/init.d/clamd
# chkconfig --add clamd
# chkconfig clamd on
配置postfix,让接收的邮件都需要先经过病毒扫描后再转发给收件人。
vi /etc/postfix/main.cf在文件中添加下面一项:
content_filter = SMTP-amavis:[127.0.0.1]:10024
vi /etc/postfix/master.cf编辑文件添加以下内容:
#Set amavis
SMTP-amavisunix - - n - 2 smtp
-o SMTP_data_done_timeout=1200
-o SMTP_send_xforward_command=yes
-o disable_dns_lookups=yes
-o max_use=20
127.0.0.1:10025 inet n - n - - smtpd
-o content_filter=
-o smtpd_restriction_classes=
-o smtpd_delay_reject=no
-o smtpd_client_restrictions=permit_mynetworks,reject
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-osmtpd_recipient_restrictions=permit_mynetworks,reject
-o smtpd_data_restrictions=reject_unauth_pipelining
-o smtpd_end_of_data_restrictions=
-o mynetworks=127.0.0.1/32
-o smtpd_error_sleep_time=0
-o smtpd_soft_error_limit=1001
-o smtpd_hard_error_limit=1000
-o smtpd_client_connection_count_limit=0
-o smtpd_client_connection_rate_limit=0
-o smtpd_milters=
-o local_header_rewrite_clients=
-o local_recipient_maps=
-o relay_recipient_maps=

接下来就启动service amavisd start和 service clamd start。查看日志文件tail -f /var/log/clamav/clamd.log 如果有错误会在里面记录,如果没有就会出现很多OK的内容如下:
Wed Oct 23 14:52:01 2013 -> /var/amavis/tmp/amavis-20131023T135201-05949-WbGe3KJt/parts/p001:OK
Wed Oct 23 15:02:01 2013 -> SelfCheck:Database status OK.
这样就代表已经完成了。

广告邮件的抵挡 spamassassin是一个自动抵挡广告邮件的机制,光盘中自带有spamassassin的rpm包可以安装。安装完以后对它进行一些配置就可以了。
修改vi /etc/amavisd.conf文件,$sa_tag_level_deflt= 5.0; 从2改成5
修改vi /etc/mail/spamassassin/local.cf文件
required_hits 5广告邮件评分,如果操作这个分数就被认定为广告邮件。
report_safe 0
rewrite_header Subject [SPAM]修改邮件的标头信息
然后重新启动service amaivsd restart.就可以了。
(!!)TROUBLE in pre_loop_hook: config: norules were found!Do you need to run'sa-update'?
如果报错,请启动service spamassassin start 程序然后使用sa-update -D命令对数据库进行更新。这样能保持最新的广告邮件过滤。再次启动 amavisd就可以了。


到这里一个基本合格的postfix服务器就全部搭建完成了,算是比较漫长。写这个安装文档因为怕有错误,所以又在虚拟机上经过了一次安装调试。所以可以确定按照这个文档一步步安装应该没有什么问题。可以邮件给我denwork#vip.qq.com把#改成@!

邮件监控 就目前来看很多企业已经不对员工的往来邮件进行监控了。不过有些企业保密机制比较严格,所以还是会有这方面的需要,在这里也一起做个介绍。
postfix自带有三种bcc(密送)方式:
always_bcc:将所有的邮件都备份到指定邮箱
sender_bcc_maps:将收件人包含在map文件中的邮件被分到指定邮箱
recipient_bcc_maps:将收件人包含在map文件中的邮件被分到指定邮箱
receive_override_options 这里必须增加,禁止地址展开/影射,否则如果遇到别名的时候会引起冗余邮件的产生。
在master.cf文件里面也添加一条规则。
127.0.0.1:10025 inet n - n - - smtpd
-o receive_override_options= no_address_mappings
注意上面的参数一定要有空格,否则会出错。
首先需要编辑main.cf文件
vi/etc/postfix/main.cf #增加下面两行
recipient_bcc_maps= mysql:/etc/postfix/mysql/mysql_virtual_recipient_bcc.cf
sender_bcc_maps= mysql:/etc/postfix/mysql/mysql_virtual_sender_bcc.cf
==============================================================================
mysql_virtual_recipient_bcc.cf内容
user = postfix
password = pass.mail.com
hosts = localhost
dbname = postfix
table = bcc
select_field = user_bcc
where_field = recipient_bcc
mysql_virtual_sender_bcc.cf内容
user = postfix
password = pass.mail.com
hosts = localhost
dbname = postfix
table = bcc
select_field = user_bcc
where_field = sender_bcc
数据库结构(注意!这个数据库表需要自己单独创建)
mysql> select * from bcc;
sender_bcc| recipient_bcc|user_bcc
test1@test.com | test1@test.com | admin@test.com
配置完成后重新启动postfix就行了。
如果使用了上面的杀毒软件,可能会造成备份邮箱收到两份一样的邮件。可以这样进行修改!
编辑master.cf文件。
复制cleanupunixn-n-0cleanup这行,修改为
cleanup2unixn-n-0cleanup
-o sender_bcc_maps=
-o recipient_bcc_maps=
127.0.0.1:10025 inet n - n - - smtpd这个行里面添加一个参数
-o cleanup_service_name=cleanup2
这样就不会出现两份邮件了!
这里的设置方便把部门员工的邮件都备份给部门领导。如果公司比较小只需要把所有邮件都放到一个邮箱里面,那么可以这样做:
登录网页创建一个邮箱地址如:postback@test.com
编辑vi main.cf文件添加:
always_bcc = postback@test.com
receive_override_options =no_address_mappings
注意,这个选项和上面只能保存一个。否则可能会出现冗余邮件。这里比较简单的是不需要新建数据库表。
解决重复邮件的方法一样。编辑master.cf文件:
cleanup2unixn-n-0cleanup
-o always_bcc =
127.0.0.1:10025 inet n - n - - smtpd这个行里面添加一个参数
-o cleanup_service_name=cleanup2



【postfix-企业邮件服务器搭建完整版】转载于:https://blog.51cto.com/denwork/1773813

    推荐阅读