extmail_solution
壹、extmail_solution概述
1、版权声明
本文版权归作者所有,如其他个人、第三方网站或媒体报刊等需转载全文或节选,为支持我们的工作,请务必注明如下信息:
文档所有者:Extmail Dev Team;
文章原始出处:http://wiki.extmail.org/extmail_solution_for_linux
项目首页:http://www.extmail.org
如果因此而给您带来麻烦,请您原谅,谢谢合作。
2、变更说明:
最后修改:2010-11-16
3、关于此文:
版  本:0.1
作  者:Liushaobo <liushaobo (at) extmail (dot) org>
项目主页:http://www.extmail.org
更新日期:2010-11-19
本文档以extmail_solution_for_linux文档为蓝本,以EMOS-1.5的RPM包为基础,采用yum(解决安装过程的软件依赖关系)安装方式,所涉及软件全部是OpenSource软件,版权以GPL为主,作为企业应用没有任何版权/法律问题。
编写本文的初衷,是给那些希望快速架设邮件系统而不想过多了解复杂的系统知识的网管/用户,为了使软件之间的结合更紧密,部分软件的配置及测试方面进行了增强改进,因此本文的一些操作步骤Extmail Dev Team不保证在其他场合能完全适用,敬请注意。
本文档假设读者在CentOS-5.x或 RedHat EnterPrise Linux-5.x平台上安装,并具有一定的Unix平台 / Linux平台系统经验,懂得rpm基本命令及常规的系统操作,如文件的删除,目录创建,改名,和vi编辑器的基本使用等。
本文档假设待安装邮局的域名为extmail.org并已在DNS设置MX记录指向mail.extmai.org。读者请根据自身实际情况予以修改。
本文档所有内容均在Centos-5.3系统安装、测试通过。本文档所涉及的配置文件的内容同样适用于CentOS-5.x;
本文档由Extmail项目组负责解释,并根据Extmail项目的建设和发展,适时予以更新。如手册与实际项目情况有冲突,以文档服从实际为原则。
4、ExtMail Solution 结构
ExtMail Solution 是一个基于优秀开源软件的电子邮件系统解决方案,核心部件包括了Postfix、Amavisd-new、ClamAV、ExtMail、ExtMan、Courier系列软件。是一个功能相对比较齐全的免费电子邮件系统。以下是其主要的特性列表:
主要特性

支持SMTP/POP3/HTTP协议

支持SMTP认证及ESMTP

可支持大容量邮箱(大于1GB)

高速Web界面访问邮箱

完整的Web管理后台

在线服务端病毒过滤

内建内容过滤

SMTP行为识别垃圾邮件

支持大量反垃圾邮件技术

图形化邮件日志分析

支持别名/多域/域管理员等

支持网络磁盘/POP3邮件

支持读/写HTML格式邮件

支持定制模板及多语言

5、邮件解决方案的软件组成:
功能模块
功能模块2
功能模块2

操作系统(OS)
CentOS-5.3
CentOS和RHEL是一样的,而且升级免费

邮件传输代理(MTA)
postfix-2.6.2
使用最新版本2.6.2

数据库/目录服务
MySQL-5.0.X
CentOS 自带

邮件投递代理(MDA)
maildrop-2.0.x
支持过滤和强大功能

Web帐户管理后台
ExtMan-1.0
支持无限域名、无限用户

WebMail 系统
ExtMail-1.1.0
支持多语言、全部模板化,功能基本齐全

防病毒软件(Anti-Virus)
ClamAV 0.95.2
最热门的开源杀毒软件

SMTP阶段反垃圾邮件工具
Spam-Locker 0.99
基于SMTP行为识别的Antispam软件,大量可选插件

内容过滤器
Amavisd-new 2.6.4
Content-Filter软件,支持与Camav/SA的挂接

内容级别的反垃圾邮件工具
SpamAssassin-3.2.5
著名的SA,可以支持大量规则

SMTP认证库
Cyrus-SASL-2.1.x
标准的SASL实现库,可以支持Courier authlib

其他数据认证库
Courier-Authlb-0.62
负责courier-imap,maildrop的认证

日志分析及显示
mailgraph_ext
在ExtMan中已经包含了

Web 服务器
Apache 2.2.x
CentOS 自带

高效的反垃圾邮件工具
Dspam-3.8
高精确度的、智能的过滤功能

6、硬件配置
要流畅地运行邮件系统,建议的硬件配置如下:
名称
说明

物理内存
512M+ 推荐1024M

交换区:
2倍物理内存大小

CPU
PIII 1G+ 推荐P4及其以上级别

主板
推荐Intel原装

网卡
100M/1000M 推荐3Com/Intel


贰、操作系统安装
1、CentOS系统所需组件:
本文档支持RedHat Enterprise-5.x 及CentOS-5.x版本。要注意的是安装系统时,只安装如下的组件:
MYSQL数据库:
注意必须选中php-mysql模块,否则extmail将无法连接mysql
VIM编辑器:
建议安装vim软件包,它支持main.cf彩色高亮语法分析。
其余的Xwindows, 打印,KDE/Gnore, 服务器配置工具,网络工具,开发包等都不是必选组件。
安装完毕进入操作系统后,为增加系统安全性,建议禁止root直接登陆,并增加一个非root帐户,例如sysadmin。
这样无法以root账户直接登陆系统,必须先以sysadmin身份登陆再su到root执行。
2、CentOS-5.3安装步骤图解:
以下将以详细的图解来介绍如何安装CentOS-5.3
CentOS启动光盘的启动画面,直接回车即可。

系统提示“是否需要校验CD媒质”,请选择“Skip”

安装欢迎界面

选择“English”作为安装界面的语言

选择键盘类型

磁盘分区设置

磁盘分区设置请选择“定制分区”(自动和手动分区根据自己喜好选择

Disk Druid分区工具界面

建立“boot分区”

建立“Swap分区”

建立“home分区”

建立“根分区”

Disk Druid分区完成

“swap分区警告”,不必理会

引导装载程序配置界面

网络配置界面,设置“IPv4”

网络配置界面,设置“网关、DNS”

时区选“ShangHai”

输入root帐户密码,建议使用较长的密码,并混杂数字与字母及特殊字符

进入软件组的选择界面,勾选“Customize now”

Desktop Environments界面,去掉“GNOME Desktop Environment”

Applications界面,只保留“Editors”

Servers界面,只保留“MySQL Database、Web Server”

点击MySQL Database的“Optional packages”选择“php-mysql”

即将安装界面

开始安装CentOS-5.3

安装完成的界面,点Reboot重新启动。至此,CentOS-5.3的安装就结束了

进入CentOS-5设置界面

设置防火墙为“Disabled”

设置SELinux为“Disabled”

时间设置

建立用户,点“Continue”

设置声音

设置完成,reboot机器

3、配置SSH:
以root身份登进系统后,增加一个非root帐户,名称为sysadmin,密码按您的需求设置一个即可。接下来我们要禁止root直接登陆。
shell
# vi /etc/ssh/sshd_config
修改以下配置为:
PermitRootLogin no
然后重新启动sshd,这样禁止了root直接登陆。
shell
# service sshd restart

叁、制作_yum_仓库
1、下载软件包
整个系统的安装全过程都要求以root身份执行,如果机器没有访问外部网络的能力,则事先下载好EMOS光盘映像,并上传到服务器。
备注:如果要在CentOS 5.x上面进行配置,请下载EMOS-1.5.ISO,配置方法不变;
shell
# su - root
# cd /root
# wget http://blog.linuxemail.cn/EMOS/EMOS_1.5_i386.iso
2、制作本地 yum 仓库
使用EMOS-1.5.ISO光盘制作本地 yum 仓库;
此外,我们假设本次安装默认域是extmail.org,主机名为:mail.extmail.org
安装CentOS-5.3光盘中createrepo工具
shell
# rpm -ivh createrepo-0.4.11-3.el5.noarch.rpm
加载EMOS-1.5的光盘,请把emos的光盘放到光驱中
shell
# mkdir /mnt/EMOS
# mount /dev/cdrom /mnt/EMOS
# cd /mnt
# createrepo .
3、创建客户端 yum 的定义文件:
shell
# cd /etc/yum.repos.d
# mkdir backup
# mv *.repo ./backup
# vi EMOS.repo
加入以下内容:
[EMOS]
name=EMOS
baseurl=file:///mnt/
enabled=1
gpgcheck=0
重新获取最新的仓库信息:
shell
# yum clean all
# yum list

肆、配置mta-postfix
1、安装postfix
安装postfix
shell
# yum install postfix
# rpm -e sendmail
2、配置postfix
shell
# postconf -n > /etc/postfix/main2.cf
# mv /etc/postfix/main.cf /etc/postfix/main.cf.old
# mv /etc/postfix/main2.cf /etc/postfix/main.cf
编辑main.cf:
shell
# vi /etc/postfix/main.cf
增加如下内容:
# hostname
mynetworks = 127.0.0.1
myhostname = mail.extmail.org
mydestination = $mynetworks $myhostname

# banner
mail_name = Postfix - by extmail.org
smtpd_banner = $myhostname ESMTP $mail_name

# response immediately
smtpd_error_sleep_time = 0s

# Message and return code control
message_size_limit = 5242880
mailbox_size_limit = 5242880
show_user_unknown_table_name = no

# Queue lifetime control
bounce_queue_lifetime = 1d
maximal_queue_lifetime = 1d
设置postfix开机自启:
shell
# chkconfig postfix on

伍、配置courier-authlib
1、安装Courier-Authlib
安装以下软件包:
shell
# yum install courier-authlib
# yum install courier-authlib-mysql
编辑/etc/authlib/authmysqlrc文件:
shell
# vi /etc/authlib/authmysqlrc
并将其内容清空,然后增加如下内容:
MYSQL_SERVER            localhost
MYSQL_USERNAME          extmail
MYSQL_PASSWORD          extmail
MYSQL_SOCKET            /var/lib/mysql/mysql.sock
MYSQL_PORT              3306
MYSQL_OPT               0
MYSQL_DATABASE          extmail
MYSQL_USER_TABLE        mailbox
MYSQL_CRYPT_PWFIELD     password
MYSQL_UID_FIELD         uidnumber
MYSQL_GID_FIELD         gidnumber
MYSQL_LOGIN_FIELD       username
MYSQL_HOME_FIELD        homedir
MYSQL_NAME_FIELD        name
MYSQL_MAILDIR_FIELD     maildir
MYSQL_QUOTA_FIELD       quota
MYSQL_SELECT_CLAUSE     SELECT username,password,"",uidnumber,gidnumber,\
                        CONCAT('/home/domains/',homedir),               \
                        CONCAT('/home/domains/',maildir),               \
                        quota,                                          \
                        name                                            \
                        FROM mailbox                                    \
                        WHERE username = '$(local_part)@$(domain)'
修改authdaemonrc文件
shell
# vi /etc/authlib/authdaemonrc
修改如下内容:
authmodulelist="authmysql"
authmodulelistorig="authmysql"
2、启动courier-authlib:
shell
# service courier-authlib start
如一切正常,命令行将返回如下信息:
Starting Courier authentication services: authdaemond
修改authdaemon socket目录权限
如果该目录权限不正确修改,maildrop及postfix等将无法正确获取用户的信息及密码认证:
shell
# chmod 755 /var/spool/authdaemon/
陆、配置maildrop
1、安装maildrop
shell
# yum install maildrop
配置master.cf 为了使Postfix支持Maildrop,必须修改/etc/postfix/master.cf文件,注释掉原来的maildrop的配置内容,并改为:
maildrop   unix        -       n        n        -        -        pipe
  flags=DRhu user=vuser argv=maildrop -w 90 -d ${user}@${nexthop} ${recipient} ${user} ${extension} {nexthop}
配置main.cf 由于maildrop不支持一次接收多个收件人,因此必须在main.cf里增加如下参数:
maildrop_destination_recipient_limit = 1
2、测试maildrop对authlib支持
shell
# maildrop -v
看是否出现以下内容:
maildrop 2.1.0 Copyright 1998-2005 Double Precision, Inc.
GDBM/DB extensions enabled.
Courier Authentication Library extension enabled.
Maildir quota extension enabled.
This program is distributed under the terms of the GNU General Public
License. See COPYING for additional information.
注意事项:
1、如需重新编译Maildrop软件包,必须先获得其源码rpm包,并且必须先行安装courier-authlib及其devel软件包,否则编译后的maildrop将无法打开authlib支持。
2、maildrop RPM包安装时,会自动创建vuser用户及vgroup用户组,专门用于邮件的存储,vuser:vgroup的uid/gid都是1000,这与一般 的邮件文档中提及用postfix用户存邮件不一样。因为postfix用户的uid一般都低于500,而Suexec模块编译时对UID/GID的要求 是要大于500,因此使用postfix用户不能满足要求。其次,如果用Maildrop作为投递代理(MDA),以postfix身份投递的话,会导致 postfix MTA错误。
柒、配置apache
1、虚拟主机设置
编辑httpd.conf文件:
shell
# vi /etc/httpd/conf/httpd.conf
在最后一行加上:
NameVirtualHost *:80
Include conf/vhost_*.conf
编辑 vhost_extmail.conf
shell
# vi /etc/httpd/conf/vhost_extmail.conf
里面定义虚拟主机的相关内容:
# VirtualHost for ExtMail Solution
<VirtualHost *:80>
ServerName mail.extmail.org
DocumentRoot /var/www/extsuite/extmail/html/

ScriptAlias /extmail/cgi/ /var/www/extsuite/extmail/cgi/
Alias /extmail /var/www/extsuite/extmail/html/

ScriptAlias /extman/cgi/ /var/www/extsuite/extman/cgi/
Alias /extman /var/www/extsuite/extman/html/

# Suexec config
SuexecUserGroup vuser vgroup
</VirtualHost>
设置apache开机启动
shell
# chkconfig httpd on

捌、配置webmail-extmail
1、安装ExtMail
shell
# yum install extsuite-webmail
2、编辑webmail.cf
shell
# cd /var/www/extsuite/extmail
# cp webmail.cf.default webmail.cf
# vi webmail.cf
主要变动的内容见下:
SYS_MYSQL_USER = extmail
SYS_MYSQL_PASS = extmail
SYS_MYSQL_DB = extmail
更新cgi目录权限 由于SuEXEC的需要,必须将extmail的cgi目录修改成vuser:vgroup权限:
shell
# chown -R vuser:vgroup /var/www/extsuite/extmail/cgi/

玖、配置管理后台-extman
1、yum安装ExtMan
shell
# yum install extsuite-webman
更新cgi目录权限 由于SuEXEC的需要,必须将extman的cgi目录修改成vuser:vgroup权限:
shell
# chown -R vuser:vgroup /var/www/extsuite/extman/cgi/
链接基本库到Extmail
shell
# mkdir /tmp/extman # chown -R vuser:vgroup /tmp/extman
注意事项:
由于RedHat发 行版中包含了一个叫tmpwatch的工具,该工具会定期扫描/tmp/下的文件,如果这些文件很久都没被使用,将被删除,因此如果后台长期不使用, /tmp/extman目录有可能被tmpwatch删除,所以要么定期登陆后台,要么修改 webman.cf将临时目录修改到另一个地方。此处暂以/tmp/extman默认值为例。
2、数据库初始化
启动Mysql
shell
# service mysqld start
# chkconfig mysqld on
导入mysql数据库结构及初始化数据,root密码默认为空
shell
# mysql -u root -p < /var/www/extsuite/extman/docs/extmail.sql
# mysql -u root -p < /var/www/extsuite/extman/docs/init.sql
注意事项:
上述导入初始化SQL时,默认的uidnumber/gidnumber都是1000,这和vuser:vgroup 的uid/gid一致,是因为maildrop投递时会从数据库里取uidnumber/gidnumber,而在master.cf里已经定义好了投递 时的运行身份(vuser:vgroup),所以这两个字段的内容必须为1000,否则将出现投递错误,例如报0×06等错误。
3、设置虚拟域和虚拟用户的配置文件
shell
# cd /var/www/extsuite/extman/docs
# cp mysql_virtual_alias_maps.cf /etc/postfix/
# cp mysql_virtual_domains_maps.cf /etc/postfix/
# cp mysql_virtual_mailbox_maps.cf /etc/postfix/
# cp mysql_virtual_sender_maps.cf /etc/postfix/
配置main.cf:
shell
# vi /etc/postfix/main.cf
增加以下内容:
# extmail config here
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_transport = maildrop:
重启postfix :
shell
# service postfix restart
4、测试authlib
在命令行下执行:
shell
# /usr/sbin/authtest -s login postmaster@extmail.org extmail
结果如下:
Authentication succeeded.

     Authenticated: postmaster@extmail.org  (uid 1000, gid 1000)
    Home Directory: /home/domains/extmail.org/postmaster
           Maildir: /home/domains/extmail.org/postmaster/Maildir/
             Quota: 104857600S
Encrypted Password: $1$phz1mRrj$3ok6BjeaoJYWDBsEPZb5C0
Cleartext Password: extmail
           Options: (none)
这样表明ExtMan的正确安装,数据库也正确导入,courier-authlib能正确连接到mysql数据库
最后访问http://mail.extmail.org/extmail/,如无意外,将看到webmail的登陆页,不过此时还没有加正式的用户,所以不能登陆,包括postmaster@extmail.org也不行。必须要登陆到http://mail.extmail.org/extman/ 里增加一个新帐户才能登陆。
ExtMan的默认超级管理员帐户:root@extmail.org,初始密码:extmail*123*,登陆成功后,建议将密码修改,以确保安全。
5、配置图形化日志
启动mailgraph_ext
shell
# /usr/local/mailgraph_ext/mailgraph-init start
启动cmdserver(在后台显示系统信息)
shell
# /var/www/extsuite/extman/daemon/cmdserver --daemon
加入开机自启动:
shell
# echo “/usr/local/mailgraph_ext/mailgraph-init start” >> /etc/rc.d/rc.local
# echo “/var/www/extsuite/extman/daemon/cmdserver -v -d” >> /etc/rc.d/rc.local
使用方法: 等待大约15分钟左右,如果邮件系统有一定的流量,即可登陆到extman里,点“图形日志”即可看到图形化的日志。具体每天,周,月,年的则点击相应的图片进入即可。
拾、配置cyrus-sasl
RHEL-5/CentOS-5的cyrus-sasl默认没有打开authdaemon的支持,为了使用集中认证的authlib,必须打开这个支持。为此我们必须删除系统的cyrus-sasl软件包,替换成打开了authdaemon支持的sasl软件包。
1、安装cyrus-sasl
删除系统的cyrus-sasl:
shell
# rpm -e cyrus-sasl --nodeps
安装新的支持authdaemon的软件包
shell
# yum install cyrus-sasl
2、配置main.cf文件
Postfix的SMTP认证需要透过Cyrus-SASL,连接到authdaemon获取认证信息。
编辑main.cf
shell
# vi /etc/postfix/main.cf
增加如下内容:
# smtpd related config
smtpd_recipient_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_non_fqdn_hostname,
        reject_non_fqdn_sender,
        reject_non_fqdn_recipient,
        reject_unauth_destination,
        reject_unauth_pipelining,
        reject_invalid_hostname,

# SMTP sender login matching config
smtpd_sender_restrictions =
        permit_mynetworks,
        reject_sender_login_mismatch,
        reject_authenticated_sender_login_mismatch,
        reject_unauthenticated_sender_login_mismatch

smtpd_sender_login_maps =
        mysql:/etc/postfix/mysql_virtual_sender_maps.cf,
        mysql:/etc/postfix/mysql_virtual_alias_maps.cf
 
# SMTP AUTH config here
broken_sasl_auth_clients = yes
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
3、编辑smtpd.conf文件
shell
# vi /usr/lib/sasl2/smtpd.conf
确保其内容为:
pwcheck_method: authdaemond
log_level: 3
mech_list: PLAIN LOGIN
authdaemond_path:/var/spool/authdaemon/socket
重新启动postfix:
shell
# service postfix start
4、测试SMTP认证
通过以下命令获得postmaster@extmail.org的用户名及密码的BASE64编码:
shell
# perl -e ‘use MIME::Base64; print encode_base64(”postmaster\@extmail.org”)’
内容如下:
cG9zdG1hc3RlckBleHRtYWlsLm9yZw==
shell
# perl -e ‘use MIME::Base64; print encode_base64(”extmail”)’
内容如下:
ZXh0bWFpbA==
然后本机测试:
shell
# telnet localhost 25
其过程如下:
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 mail.extmail.org ESMTP Postfix - by extmail.org
ehlo demo.domain.tld     << 输入内容
250-mail.extmail.org
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
auth login     << 输入内容
334 VXNlcm5hbWU6
cG9zdG1hc3RlckBleHRtYWlsLm9yZw==     << 输入内容
334 UGFzc3dvcmQ6
ZXh0bWFpbA==     << 输入内容
235 2.0.0 Authentication successful
quit     << 输入内容
221 2.0.0 Bye
最后出现235 Authentication Successful 表明认证成功了。
拾壹、配置courier-imap
1、安装Courier-imap
默认的courier-authlib及courier-imap都会增加系统自启动设置,因此下一次服务器启动将自动启动相应的authlib及POP3服务
shell
# yum install courier-imap
配置courier-imap
由于Courier-imap的IMAP目录是按UTF-7编码的,ExtMail目前还没有正式支持IMAP目录,因此需要屏蔽IMAP,只提供pop3服务。而就目前的使用情况来看,IMAP使用的非常少,绝大部分OutLook/Foxmail用户都习惯使用POP3而非IMAP。
shell
# vi /usr/lib/courier-imap/etc/imapd
修改内容如下:
IMAPDSTART=NO
shell
# vi /usr/lib/courier-imap/etc/imapd-ssl
修改内容如下:
IMAPDSSLSTART=NO
然后重新启动courier-imap:
shell
# service courier-imap start
测试POP3 请按如下步骤输入pop3命令测试其是否正常工作,注意蓝色的信息是我们输入到POP3服务器的(请首先登录extman自行建立test@extmail.org用户,密码:extmail)
shell
# telnet localhost 110
其过程如下:
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
+OK Hello there.
user test@extmail.org     << 输入内容
+OK Password required.
pass extmail     << 输入内容
+OK logged in.
list     << 输入内容
+OK POP3 clients that break here, they violate STD53.
.
quit     << 输入内容
+OK Bye-bye.
Connection closed by foreign host.

拾貳、配置内容、病毒过滤
1、安装amavisd-new
shell
# yum install amavisd-new
设置相关目录权限:
shell
# chown -R amavis.amavis /var/spool/vscan/
2、配置SpamAssassin
Amavisd-new 通过Mail::SpamAssassin 模块来调用SA的功能,因此这里配置SA和常规配置SA软件有些区别,主要集中在修改local.cf文件上。
增加中文规则: 用于处理中文(简体)垃圾邮件。
shell
# wget -N -P /usr/share/spamassassin www.ccert.edu.cn/spam/sa/Chinese_rules.cf
设置规则自动更新:
shell
# /usr/bin/crontab -e
然后输入如下的内容:
0 0 1 * * wget -N -P /usr/share/spamassassin www.ccert.edu.cn/spam/sa/Chinese_rules.cf; /etc/init.d/amavisd restart
存盘退出即可。最后运行以下调试命令以确认amavisd没有错误:
shell
# /usr/sbin/amavisd -c /etc/amavisd.conf debug
如果没有异常提示或报错退出则表示一切都正常,按ctrl+c终止,然后正常启动,若提示pid不存在等错误,不必理会。
设置amavisd开机自启:
shell
# service amavisd start
# chkconfig amavisd on
3、配置ClamAV
安装ClamAV
shell
# yum install clamd
编辑clamd.conf文件
shell
# vi /etc/clamd.conf
去掉 ‘LocalSocket /var/run/clamav/clamd.sock’的注释,并注释掉 ‘TCPSocket 3310’,我们将使用unix socket而不是TCP,两者不可并存。
变动内容见下:
# Default: disabled
LocalSocket /var/run/clamav/clamd.sock

#TCPSocket 3310
设置相关目录权限:
将clamav加到amavis运行组里,并调整目录权限,否则clamav将无法扫描amavisd-new产生的临时文件
shell
# gpasswd -a clamav amavis
# usermod -G amavis clamav
# chown amavis.amavis /var/spool/vscan
# chmod 750 /var/spool/vscan
# chown amavis.amavis /var/spool/vscan/tmp
# chmod 750 /var/spool/vscan/tmp
默认的/var/spool/vscan 目录属性是:
drwxr-x---   5 amavis amavis
对于clamav用户而言,则无任何权限访问该目录,因此maillog里amavisd-new会提示:
May 19 08:38:53 as3 amavis[1752]: (01752-01) ask_av (ClamAV-clamd) FAILED - unexpected result: /var/spool/vscan/tmp/amavis-20050519T
083853-01752/parts: Access denied. ERROR\n
May 19 08:38:53 as3 amavis[1752]: (01752-01) WARN: all primary virus scanners failed, considering backups
启动ClamAV及开机自启:
shell
# service clamd start
# freshclam –daemon
4、配置amavisd.con文件
修改amavisd.conf
shell
# vi /etc/amavisd.conf
修改的主要参数如下:
$mydomain = 'extmail.org';
$db_home   = "$MYHOME/db";
$lock_file = "$MYHOME/amavisd.lock";  # -L
$pid_file  = "$MYHOME/amavisd.pid";   # -P
$myhostname = 'mail.extmail.org';
@local_domains_maps = qw(.);
@mynetworks = qw( 127.0.0.0/8 );
对本地发出的邮件不进行内容过滤
$policy_bank{'MYNETS'} = {   # mail originating from @mynetworks
  originating => 1,  # is true in MYNETS by default, but let's make it explicit
  os_fingerprint_method => undef,  # don't query p0f for internal clients
  allow_disclaimers => 1,  # enables disclaimer insertion if available
  bypass_spam_checks_maps => [1],
  bypass_banned_checks_maps => [1],
  bypass_header_checks_maps => [1],
}; 
$sa_spam_modifies_subj = 0;            # 当邮件被认为是垃圾邮件时,是否修改邮件的主题
$remove_existing_x_scanned_headers= 1; # 凡是经过 Amavisd 过滤的邮件,都会在邮件头中被加入一行邮件头信息
$remove_existing_spam_headers = 1;
# 修改投递/拦截的方法:
$final_virus_destiny      = D_DISCARD;
$final_banned_destiny     = D_DISCARD;
$final_spam_destiny       = D_PASS;
$final_bad_header_destiny = D_PASS;
# 配置Amavisd与Clamav结合
['ClamAV-clamd',
  \&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd.sock"],
  qr/\bOK$/, qr/\bFOUND$/,
  qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
);

@av_scanners_backup = (
  ['ClamAV-clamscan', 'clamscan',
    "--stdout --no-summary -r --tempdir=$TEMPBASE {}",
    [0], qr/:.*\sFOUND$/, qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
);
amavisd.conf常用参数说明:
$max_servers = 10;                   设置最大可使用的进程数
$sa_spam_subject_tag = '[SPAM] ';    加 [SPAM] 标记
$mydomain = 'mail.extmail.org';      设置域名
$myhostname = 'mail.extmail.org';    设置主机名
@local_domains_maps = qw(.);         对所有的域检查
$sa_tag2_level_deflt = 5.0;          超过这个分数,允许在邮件标题加入[SPAM] 标记
$sa_kill_level_deflt = 5.0;          超过这个分数,直接將信件备份后删除
$final_virus_destiny:                检测到病毒时的动作
$final_banned_destiny:               检测到受禁止的内容时的动作
$final_spam_destiny:                 检测到垃圾邮件、广告邮件(spam)时的动作
$final_bad_header_destiny:          检测到不良信件时的动作

默认有以下几种动作:
D_PASS:                              无论信件是否有问题,都会将信件发给收件人
D_DISCARD:                           信件将被丢弃,并且不会告知收件人及发件人
D_BOUNCE:                            信件不会发送给收件人,但会通知发件人邮件没有被投递
D_REJECT:                            邮件不会被投递给收件人,但会通知发件人邮件被拒绝
注意事项:
上述$mydomain参数与$myhostname参数相同,主要是为了方便之后的病毒/垃圾汇报邮件发给系统管理员时,能投递到本地的别名里,再转交到虚拟域的特定用户。
5、配置Postfix 集成amavisd-new
增加邮件别名
shell
# vi /etc/postfix/aliases
增加如下信息,注意:默认的aliases数据库里已有一条virusalert的别名,请删除,再输入下面的别名记录,并确保所有记录都是唯一的:
virusalert:    root
spam.police:   root
postfix:       test@extmail.org
保存并执行newaliases命令生成新的别名数据库,重新启动amavisd:
shell
# newaliases
# service amavisd restart
编辑master.cf文件:
shell
# vi /etc/postfix/master.cf
增加如下内容:
smtp-amavis unix    -    -    n    -    3    smtp
    -o smtp_data_done_timeout=1200
    -o smtp_send_xforward_command=yes
    -o disable_dns_lookups=yes
    -o max_use=10

127.0.0.1:10025 inet    n       -       n       -       -       smtpd
    -o content_filter=
    -o local_recipient_maps=
    -o relay_recipient_maps=
    -o smtpd_restriction_classes=
    -o smtpd_client_restrictions=
    -o smtpd_helo_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks,reject
    -o mynetworks=127.0.0.0/8
    -o strict_rfc821_envelopes=yes
    -o smtpd_error_sleep_time=0
    -o smtpd_soft_error_limit=1001
    -o smtpd_hard_error_limit=1000
    -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
编辑main.cf文件:
shell
# vi /etc/postfix/main.cf
增加如下内容:
# Content-Filter
content_filter = smtp-amavis:[127.0.0.1]:10024
receive_override_options = no_address_mappings
注意:receive_override_options 这里必须增加,禁止地址展开/影射,否则如果遇到别名的时候会引起冗余邮件的产生。
重启postfix :
shell
# service postfix restart
重新启动amavisd:
shell
# service amavisd restart
6、测试Clamav
shell
# telnet localhost 25
其过程如下:
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 mail.extmail.org ESMTP Postfix - by extmail.org
mail from:<postmaster@extmail.org>     << 输入内容
250 2.1.0 Ok
rcpt to:<test@extmail.org>     << 输入内容
250 2.1.5 Ok
data     << 输入内容
354 End data with .
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*     << 输入内容
.
250 2.0.0 Ok: queued as BC24E85260
quit     << 输入内容
221 2.0.0 Bye
Connection closed by foreign host.
在邮件日志里,应该有相应的信息出现:
Mar 22 06:43:15 localhost amavis[15405]: (15405-01) Blocked INFECTED (Eicar-Test-Signature), [192.168.0.235] ->, quarantine:
virus-mI6vbjkWZ2Tz, Message-ID: <003401c88c1a$74706360$eb00a8c0@nbk00045>, mail_id: mI6vbjkWZ2Tz, Hits: -, size: 1757, 474 ms
如果看到类似这样的日志,表明Clamav+Amavisd-new工作正常。
拾叁、配置spam_locker
1、安装Spam_Locker
shell
# yum install extsuite-slockd
配置resolv.conf
请确认/etc/resolv.conf里的dns服务器是离你的邮件服务器最近,速度最快的dns server,slockd很依赖dns的好坏,因此给系统配置一个快速的dns能大幅度提高处理速度。以下给出一个配置仅供参考:
shell
# vi /etc/resolv.conf
增加以下内容:
nameserver 202.96.209.6
上述dns服务器是上海电信的DNS服务器,对于非广东朋友,请改为离你最近的DNS服务器IP,如果可能的话,请配置一个简单的bind,成为本地的 dns cache server,可以获得最高性能。这里略过这一步骤,但您必须确保dns的配置是正确并且可靠的,否则slockd将不能工作!
2、测试slockd
启动slockd
shell
# /usr/local/slockd/slockd-init start
此时slockd将启动,并进入非daemon方式的监听模式,接受来自10030端口的请求,命令行下将显示如下调试信息:
Starting spam locker daemon: slockd
starting child 2908
starting child 2909
打开另一个ssh/终端窗口:
shell
# cd /usr/local/slockd/tools
输入:
shell
# perl policy_sig -h localhost -p 10030 --helo FOOBAR --ip 192.168.0.1 --from test@foo.com --to test@bar.com
此时,程序应该返回如下错误信息:这表示slockd初步的正常工作了。
action=554 blocked using zen.spamhaus.org, see http://bl.extmail.org/cgi/rbl?192.168.0.1
设置slockd开机自启动
shell
# /usr/local/slockd/slockd-init start # echo “/usr/local/slockd/slockd-init start” >> /etc/rc.d/rc.local
3、配置Postfix
slockd调试正常后,必须配置postfix以使其打开对slockd的支持。
编辑main.cf文件
shell
# vi /etc/postfix/main.cf
将 check_policy_service inet:127.0.0.1:10030 这一行记录增加到smtpd_recipient_restrictions 里,例如:
smtpd_recipient_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_non_fqdn_hostname,
        reject_non_fqdn_sender,
        reject_non_fqdn_recipient,
        reject_unauth_destination,
        reject_unauth_pipelining,
        reject_invalid_hostname,
        check_policy_service inet:127.0.0.1:10030
 
  
重新启动postfix以使配置生效
shell
# service postfix restart
注意事项: 上述配置是将slockd的查询放到最后,这也是进一步提高资源利用律的办法,因为有部分功能postfix已实现了,所以就先由postfix检测,如果检测不到再由slockd完成。
拾肆、配置dspam
1、安装dspam
Dspam的配置主要参考《Dspam+Amavis-new+SA-Clamav for EMOS》
链接: http://www.extmail.org/forum/viewthread.php?tid=10393&extra=&page=1
shell
# yum install dspam-mysql
2、导入 DSPAM 训练库
shell
# cd /root/
# wget http://www.extmail.org/download/misc/dspam/dspam-trained-data.sql.gz
# gzip -d dspam-trained-data.sql.gz
# rm -rf /var/lib/mysql/dspam/ (备注:如果没有dspam的库,可以不用执行)
# mysql -u root -p -e “create database dspam”
# mysql -u root -p -e “grant all on dspam.* to dspam@localhost identified by ‘dspam’”
# mysql -u dspam -p dspam dspam < /root/dspam-trained-data.sql
DSPAM的token数据库的定时清理:
shell
# crontab -e
加入以下内容:
0 0 * * * /usr/bin/mysql -u dspam -p'dspam' dspam < /usr/share/dspam/sql/mysql/purge.sql
0 0 * * * /usr/bin/dspam_logrotate -a 30 -d /var/spool/dspam/data
3、配置 dspam.conf 文件
shell
# vi /etc/dspam/dspam.conf
变动内容如下:
DeliveryHost        127.0.0.1
DeliveryPort        10024
DeliveryIdent       localhost
DeliveryProto       SMTP

Trust extmail
Preference "signatureLocation=headers"  # 'message' or 'headers'
Preference "showFactors=off"

MySQLUIDInSignature    on
MySQLServer             /var/lib/mysql/mysql.sock
MySQLUser               dspam
MySQLPass               dspam
MySQLDb                 dspam
MySQLCompress           true
MySQLConnectionCache   10
ServerPort              10028
ServerQueueSize 32
ServerPID               /var/spool/dspam/dspamd.pid
ServerMode              auto
ServerPass.Relay1       "secret"
ServerParameters        "--user extmail --deliver=innocent,spam"
ServerIdent             "localhost.localdomain"

ClientHost      127.0.0.1
ClientPort      10028
ClientIdent     "secret@Relay1"
3、启动 dspam 进程
shell
# chkconfig dspamd on
# service dspamd start
查看dspam启动进程
shell
# ps aux |grep dspam
显示以下内容:
dspam    18407  0.0  0.5  5452 1344 pts/0    S    19:16   0:00 /usr/sbin/dspamd --daemon
root     18412  0.0  0.2  5140  668 pts/0    S+   19:17   0:00 grep dspamd
4、修改main.cf文件
shell
# vi /etc/postfix/main.cf
增加以下内容:
header_checks = regexp:/etc/postfix/dspam_header_checks
设置邮件标题过滤管理 以防止重复X-DSPAM-Signature标题,可以防止签名被报道为垃圾。这发生在当你从一个已经运行Dspam的服务器收到邮件,或被用于通过伪造的、滥发邮件来阻止你训练数据库,
shell
# vi /etc/postfix/dspam_header_checks
增加以下内容:
/^(X-DSPAM-.*)/ IGNORE
/^(X-Spam-.*)/  IGNORE
重启postfix :
shell
# service postfix restart
5、编辑 amavisd.conf 文件
shell
# vi /etc/amavisd/amavisd.conf
增加以下内容:
$dspam = '/usr/bin/dspam';
@spam_scanners = (
    ['SpamAssassin', 'Amavis::SpamControl::SpamAssassin'],
    ['DSPAM',  'Amavis::SpamControl::ExtProg', $dspam,
      [ qw(--client --stdout --deliver=spam,innocent --mode=teft --user extmail)],
    ],
);
SA增加DSpam插件:
shell
# cd /usr/lib/perl5/vendor_perl/5.8.8/Mail/SpamAssassin/Plugin/
# wget http://www.extmail.org/download/misc/dspam/dspam.pm
编辑 local.cf 文件
shell
# cd /etc/mail/spamassassin/
# wget http://www.extmail.org/download/misc/dspam/dspam.cf
# vi local.cf
在下面增加以下内容
include dspam.cf
编辑 init.pre 文件:
shell
# vi init.pre
在下面增加以下内容
loadplugin Mail::SpamAssassin::Plugin::dspam
重启amavisd
shell
# service amavisd restart
6、增加 extmail 的垃圾邮件举报
说明:
Extmail 1.0.9正式加入垃圾邮件举报功能,主要基于(xueron)的补丁包,并进行了一定的调整,使该功能可以兼容DSPAM及Spamassassin两种内容过滤软件的训练。
Extmail1.1.1加入(stvictor)提供的spamassassin举报功能,感谢!
修改 webmail.cf
shell
# vi /var/www/extsuite/extmail/webmail.cf
主要变动的内容如下:
SYS_SPAM_REPORT_ON  = 1
SYS_SPAM_REPORT_TYPE = dspam
设置maidrop的全局过滤
shell
# vi /etc/maildroprc
内容如下:
# Decoder for high quality key word filtering
# Author: hzqbbc <hzqbbc@hzqbbc.com> - ExtMail Dev Team
DECODER="/var/www/extsuite/extmail/tools/decode -v"
if ((/^(From|Sender|Return-Path):.*MAILER\-DAEMON/))
{
  BADSENDER=1
}

# Custom filter and auto deliver to Junk mailbox support
# need test command and other Unix command
`test -f $HOME/.mailfilter && exit 1 || exit 0`

# No customize filtering rules
if ( $RETURNCODE == 0 )
{
  if (/^X-Spam-Flag:.*YES/ || /^X-DSPAM-Result:.*Spam/)
  {
    exception {
      to "$HOME/Maildir/.Junk/."
    }
  }
}
7、配置DSPAM Web 界面
安装相关的rpm包:
shell
# yum install perl-GDGraph
# yum install perl-GD-Graph3d
# yum install dspam-web
创建dspam-web 认证用户:
shell
# cd /usr/share/dspam/webui/cgi-bin
# echo “extmail” > admins
# htpasswd -c .htpasswd extmail
输入认证密码
New password:
Re-type new password:
Adding password for user extmail
启动 dspam-web 守护进程
shell
# service dspam-webd start
这实际是启动了mini_httpd进程,查看 mini_httpd 是否启动正常:
shell
# ps aux |grep mini
显示以下内容:
dspam    18580  0.0  0.3  4152  820 ?        Ss   20:05   0:00 mini_httpd -C /etc/dspam/webui.conf
root     18582  0.0  0.2  5316  668 pts/0    S+   20:05   0:00 grep mini
重启 apache
shell
# service httpd restart
访问 dspam-web
http://mail.example.com/dspam
输入你在 .htpasswd 文件中创建的用户和密码
拾伍、补充设置
以下是补充的ExtMail Solution有关文档,主要是为希望进一步了解mail系统运行,并提高extmail效能的朋友准备,对于初学者而言,建议要先打好基础再进行测试。
1、增加FCGI支持
为extmail增加FCGI的支持,主要是为了获得优异的web效能,克服CGI不能应付大量访问及低效率的缺陷。根据我们的测试,CGI模式下的页面效率只有FCGI下的1/10~1/100,因此建议有条件的用户还是使用FCGI。日后ExtMail Solution的web CGI程序将全部都支持FCGI。
Extmail开发团队花了大量时间重新设计了FCGI server的进程管理模型,并参考了apache的机制,新版dispatch.fcgi 终于可以象apache一样定义max server数,min server(启动进程数)以及每进程服务次数,每进程执行时限等,可较好的利用系统cpu/内存资源,既保证不多占内存,又可保证请求数上升时能有足够 进程数服务。
就我们搜索发现,目前网上还没有开源版的FastCGI server能实现上述自适应负载功能(例如php-fpm还未实现,POE等也未实现),所以Extmail的dispatch.fcgi也许是第一个实现了这个功能。
mod_fastcgi 是针对Apache Web服务器的FCGI支持模块
下载地址: http://www.fastcgi.com/dist/mod_fastcgi-2.4.6.tar.gz
安装mod_fastcgi :
shell
# wget http://www.fastcgi.com/dist/mod_fastcgi-2.4.6.tar.gz
# tar xfz mod_fastcgi-2.4.6.tar.gz
# cd mod_fastcgi-2.4.6
# cp Makefile.AP2 Makefile
# make top_dir=/etc/httpd install
安装perl-FCGI 除了Apache需要FCGI的支持外,extmail也需要相应的perl-FCGI模块。
shell
# yun install perl-FCGI
配置虚拟主机:
shell
# vi /etc/httpd/conf/vhost_extmail.conf
增加内容如下:
LoadModule fastcgi_module modules/mod_fastcgi.so

<Ifmodule mod_fastcgi.c>
FastCgiExternalServer /usr/bin/dispatch.fcgi -host 127.0.0.1:8888 -idle-timeout 240
</Ifmodule>

#同时,去掉如下行:
#ScriptAlias /extmail/cgi/ /var/www/extsuite/extmail/cgi/

#改为:
Alias /extmail/cgi/ /usr/bin/dispatch.fcgi/
<Location "/extmail/cgi">
SetHandler fastcgi-script
</Location>
重启Apache和fastcgi server开机自启动:
shell
# service httpd restart
# /var/www/extsuite/extmail/dispatch-init start
# echo “/var/www/extsuite/extmail/dispatch-init start” >> /etc/rc.d/rc.local
结束语:
通过此文档,读者应该能够较容易地架设一个功能较齐全的电子邮件系统。本文档将继续保持更新,逐步将一些高级的设置方法公布出来,争取ExtMail Solution更加完整,力求完美。
已知Bugs:
整个ExtMail Solution尽力将Opensource软件的优点发挥到极至,但免不了还是有bug。以下是几个已知的问题:
Amavisd-new
退信模板还是英文的
产生的汇报信息不够友好
TODO 列表
支持SMTP 及 POP3/IMAP的TLS/SSL加密
HTTP及SMTP/POP3等CA证书的配置
更精细的Anti-Spam策略及关键字过滤
系统安全配置(基于iptables)