2014-08-09 13:16:33
来 源
中存储网
Postfix
操作系统(OS) CentOS 5.5邮件传输代理(MTA) Postfix 使用最新版本2.6.x数据库/目录服务 MySQL 5.0 可选openLDAP或NetScape LDAP,本文以MySQL为蓝本邮件投递代理(MDA) maildrop 2.0.

操作系统(OS) CentOS 5.5
邮件传输代理(MTA) Postfix  使用最新版本2.6.x
数据库/目录服务 MySQL 5.0  可选openLDAP或NetScape LDAP,本文以MySQL为蓝本
邮件投递代理(MDA) maildrop 2.0.x 支持过滤和强大功能
Web帐户管理后台 ExtMan 0.2.5 支持无限域名、无限用户
POP3 服务器 Courier-IMAP 对于大部分企业而言完全足够
WebMail 系统 ExtMail 1.1 支持多语言、全部模板化,功能基本齐全
SMTP认证库 Cyrus SASL  标准的SASL实现库,可以支持Courier authlib
其他数据认证库 Courier Authlib 0.60 authlib是maildrop, courier-imap等服务的关键部件
日志分析及显示 mailgraph_ext 在ExtMan中已经包含了
Web 服务器 Apache 2.x OS 自带
1. 安装postfix
service sendmail stop
yum install httpd-devel bind bind-chroot caching-nameserver
卸载不支持mysql认证的postfix
rpm -e postfix
安装postfix
yum install postfix-2.6.2-5hzq.i386.rpm
查看是否支持mysql认证
postconf -m
修改postfix配置文件
vim /etc/postfix/main.cf
myhostname = mail.up.com
mydomain = up.com
inet_interfaces = all
mydestination = $myhostname, $mydomain, localhost
启动postfix
service postfix restart
2. 安装courier-authlib
使用authlib登陆验证.这样可以不用管后台用户数据是用什么方式存储的.比方说MySQL/LDAP
yum install courier-authlib
yum install courier-authlib-mysql
修改authdaemon socket目录权限
如果该目录权限不正确修改,maildrop及postfix等将无法正确获取用户的信息及密码认证:
chmod 755 /var/spool/authdaemon
cd /etc/authlib/
vim authdaemonrc
authmodulelist="authmysql"
authmodulelistorig="authmysql"
vim /etc/authlib/authmysqlrc
MYSQL_SERVER        localhost
MYSQL_USERNAME        extmail
MYSQL_PASSWORD        extmail
MYSQL_SOCKET        /var/lib/mysql/mysql.sock
MYSQL_PORT        3306
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    concat('/var/mailbox/',homedir)
MYSQL_MAILDIR_FIELD    concat('/var/mailbox/',maildir)
启动courier-authlib    
service courier-authlib start
创建邮箱目录
mkdir /var/mailbox
3. 安装courier-imap
yum install courier-imap
ExtMail目前还没有正式支持IMAP目录,因此需要屏蔽IMAP,只提供pop3服务。而就目前的使用情况来看,IMAP使用的非常少,绝大部分OutLook/Foxmail用户都习惯使用POP3而非IMAP。
vi /usr/lib/courier-imap/etc/imapd
IMAPDSTART=NO
vi /usr/lib/courier-imap/etc/imapd-ssl
IMAPDSSLSTART=NO
重新启动courier-imap
service courier-imap start
4. 安装maildrop
maildrop是一个使用C++编写的用来代替本地MDA的带有过滤功能邮件投递代理,是courier邮件系统组件之一,我们在此将使用maildrop来代替postfix自带的MDA。
yum install maildrop
为了使Postfix支持Maildrop,必须修改/etc/postfix/master.cf文件:
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
maildrop -v   测试
  检查安装结果,请确保有"Courier Authentication Library extension enabled."一句出现:
maildrop RPM包安装时,会自动创建vuser用户及vgroup用户组,专门用于邮件的存储,vuser:vgroup的uid/gid都是1000
修改邮箱目录属性:
chown vuser.vgroup /var/mailbox -R
5. 安装cyrus-sasl
yum install cyrus-sasl
开启postfix的smtp认证
vim /etc/postfix/main.cf
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions=permit_sasl_authenticated,reject_unauth_destination
让postfix支持虚拟用户
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
#local_recipient_maps = (注释去掉)
编辑smtpd.conf文件,让虚拟用户到mysql数据库认证
vi /usr/lib/sasl2/smtpd.conf
pwcheck_method: authdaemond
log_level: 3
mech_list: PLAIN LOGIN
authdaemond_path:/var/spool/authdaemon/socket
chmod -R 777 /var/spool/authdaemon/
service saslauthd start
6. 安装ExtMail和extman
yum install extsuite-webmail
cd /var/www/extsuite/extmail
cp webmail.cf.default webmail.cf
vi webmail.cf
语言选项,可改作:
SYS_USER_LANG = zh_CN
此处即为您在前文所设置的用户邮件的存放目录,可改作:
SYS_MAILDIR_BASE = /var/mailbox/
SYS_MYSQL_USER = extmail
SYS_MYSQL_PASS = extmail
SYS_MYSQL_DB = extmail
chown -R vuser:vgroup /var/www/extsuite/extmail/cgi/
yum install extsuite-webman
vim /var/www/extsuite/extman/webman.cf
此处即为您在前文所设置的用户邮件的存放目录,可改作:
SYS_MAILDIR_BASE = /var/mailbox
SYS_CAPTCHA_ON = 0   //不需要认证码
mkdir /tmp/extman
chown vuser.vgroup /tmp/extman
设置虚拟域和虚拟用户的配置文件
cp /var/www/extsuite/extman/docs/mysql_virtual_*.cf /etc/postfix/
chown -R vuser:vgroup /var/www/extsuite/extman/cgi/
导入mysql数据库结构及初始化数据
cd /var/www/extsuite/extman/docs
# mysql -u root -p <extmail.sql
# mysql -u root -p &lt;init.sql
测试authlib认证:
/usr/sbin/authtest -s login postmaster@extmail.org extmail
Authentication succeeded.
     Authenticated: postmaster@extmail.org  (uid 1000, gid 1000)
    Home Directory: /var/mailbox/extmail.org/postmaster
Maildir: /var/mailbox/extmail.org/postmaster/Maildir/
Quota: (none)
Encrypted Password: $1$phz1mRrj$3ok6BjeaoJYWDBsEPZb5C0
Cleartext Password: extmail
Options: (none)
这样表明ExtMan的正确安装,数据库也正确导入,courier-authlib能正确连接到mysql数据库
修改httpd.conf文件
NameVirtualHost *:80
Include conf/vhost_*.conf
vi /etc/httpd/conf/vhost_extmail.conf
&lt;VirtualHost *:80>
ServerName mail.lx.com
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/
SuexecUserGroup vuser vgroup
</VirtualHost>
service httpd restart
7. 访问及测试
http://mail.lx.com/extman
选择管理即可登入extman进行后台管理了。默认管理帐号为:root@extmail.org
密码为:extmail*123*
登录成功后创建虚拟域和虚拟用户
使用telnet登录25和110端口进行测试
telnet localhost 25
ehlo localhost
auth login
perl -MMIME::Base64 -e 'print encode_base64("abc@lx.com");'
perl -MMIME::Base64 -e 'print encode_base64("123");'
mail from:a@lx.com
rcpt to:b@lx.com
data
blablablaba
.
quit
telnet localhost 110
user b@lx.com
pass 123
list
retr 1
dele 1
quit
测试maildrop,输出如下:
echo "test mail" | maildrop -V 10 -d abc@lx.com
maildrop: authlib: groupid=1000
maildrop: authlib: userid=1000
maildrop: authlib: logname=abc@lx.com, home=/var/mailbox/lx.com/abc, mail=/var/mailbox/lx.com/abc/Maildir/
maildrop: Changing to /var/mailbox/lx.com/abc
Message start at 0 bytes, envelope sender=abc@lx.com
maildrop: Attempting .mailfilter
maildrop: Delivery complete.
如果发信提示:
SMTP rcpt error: 5.1.1 : Recipient address rejected: User unknown in local recipient table
请在/etc/postfix/main.cf里面确保存在下面配置
local_recipient_maps =
如果发送邮件成功,但是无法接收邮件,请注释掉下面三项:
#mydestination
8. extman图形日志:
/usr/local/mailgraph_ext/mailgraph-init start
/var/www/extsuite/extman/daemon/cmdserver --daemon
开机自启动:
# echo “/usr/local/mailgraph_ext/mailgraph-init start” &gt;&gt; /etc/rc.d/rc.local
# echo “/var/www/extsuite/extman/daemon/cmdserver -v -d” &gt;&gt; /etc/rc.d/rc.local
=========================
9. 邮件过滤:
Postfix可以根据“client, sender, recipient”对邮件进行过滤
postfix可以使用“smtpd_*_restrictions”参数对邮件进行约束,其中的“*” 可以以“client, sender等”代替。
1).smtpd_client_restrictions
针对client进行限制,编辑/etc/postfix/main.cf,添加以下参数
smtpd_client_restrictions = hash:/etc/postfix/client_access
这条语句的意思是要我们将把客户端的限制策略加入一条限制规则"check_client_access":把针对客户的限制写在client_access文件中,并且以hash数据库的形式存储。
编写/etc/postfix/client_access文件,内容如下
192.168.1.23      reject
这代表来自192.168.1.23这台主机将不能通过postfix服务器进行发信。本文件的格式前面为client的ip ,后面为动作“ok”或“reject”。
此时一定要记得使用“postmap”命令将client_access生成hash数据库。命令如下:
#cd  /etc/postfix
#postmap  client_access
然后重新启动postfix服务器。
2). smtpd_sender_restrictions
针对client进行限制,编辑/etc/postfix/main.cf,添加以下参数
smtpd_sender_restrictions = hash:/etc/postfix/sender_access
这条语句的意思是要我们将把客户端的限制策略加入一条限制规则“check_sender_access”:把针对客户的限制写在sender_access文件中,并且以hash数据库的形式存储。
编写/etc/postfix/sender_access文件,内容如下
abc@beijing.com  reject
163.com        reject
这代表诸如用户名像“abc@163.com” 这样以“163.com”结尾的用户都不能使用该服务器发信。
此时一定要记得使用“postmap”命令将sender_access生成hash数据库。命令如下:
#cd  /etc/postfix
#postmap  sender_access
3).  smtpd_recipient_restrictions
针对recipient进行限制,编辑/etc/postfix/main.cf,添加以下参数
smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/recipient_access,permit_sasl_authenticated,reject_unauth_destination,注意规则的顺序,先检查收件人是否拒绝,如果不拒绝则再向后检查下一个规则是否为合法用户。
4)  针对mail的”header” 与 “body” 进行检查
针对邮件内容进行限制,编辑/etc/postfix/main.cf,添加以下参数
header_checks = regexp:/etc/postfix/header_checks
这条语句的意思是要我们针对mail的“主题”进行检查,如果“主题”中包含了“/etc/postfix/header_checks”文中按照正则表达式规定的关键字,将会按照” /etc/postfix/header_checks”文中的动作进行处理。   
编写/etc/postfix/header_checks文件,内容如下:
/hello/  reject  go out
“/ /”正则表达式内的匹配关键字要写在里面,本例中,如果主题包括hello则拒绝该邮件,同时显示“go out”警告。不需要生成数据库文件。
重新启动postfix ,进行测试会看到以下警告信息。
body_checks = regexp:/etc/postfix/body_checks
这条语句的意思是我们要针对mail的“body”进行检查,如果“body”中包含了“/etc/postfix/body_checks”文中按照正则表达式规定的关键字,将会按照” /etc/postfix/body_checks”文中的动作进行处理。
编写/etc/postfix/body_checks文件,内容如下:
/sex/  reject  go out
“/ /”正则表达式内的匹配关键字要写在里面,本例中,如果mail内容出现包括sex的关键字则拒绝该邮件,同时显示“go out”警告。使用telnet方法发信能看出效果。
正则表示式的功能非常强大,建议读者自行去学习研究,然后定制出自己的mail检查方法。
以上只是邮件的初步过滤,对于网上发垃圾、病毒邮件的高手总能绕过我们的策略,我们使用流行的反垃圾防病毒。
===========================================
10. 反垃圾病毒邮件软件
安装amavisd-new
yum install amavisd-new
中文过滤规则
cp Chinese_rules.cf /usr/share/spamassassin/
service amavisd start
lsof -i:10024
安装ClamAV
yum install clamd
vim /etc/clamd.conf
去掉 ‘LocalSocket /var/run/clamav/clamd.sock’的注释,并注释掉 ‘TCPSocket 3310’,我们将使用unix socket而不是TCP,两者不可并存
设置相关目录权限:
将clamav加到amavis运行组里,并调整目录权限,否则clamav将无法扫描amavisd-new产生的临时文件
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
启动ClamAV及更新病毒库
service clamd start
配置amavisd.con文件
vim /etc/amavisd/amavisd.conf
21  $mydomain = 'lx.com';
153 $myhostname = 'mail.lx.com';
54  @local_domains_maps = qw(.);   //对所有的域检查
修改投递/拦截的方法:
158 $final_virus_destiny      = D_REJECT;
160 $final_spam_destiny       = D_REJECT;  //邮件不会被投递给收件人,但会通知发件人邮件被拒绝
99  $sa_tag2_level_deflt = 19.2;          超过这个分数,允许在邮件标题加入[SPAM] 标记
100 $sa_kill_level_deflt = 19.9;          超过这个分数,直接將信件备份后删除
配置Amavisd与Clamav结合

“); 在配置项上面添加
@av_scanners_backup = (”
716 ['ClamAV-clamd',
717   &ask_daemon, ["CONTSCAN {}n", "/var/run/clamav/clamd.sock"],
718   qr/bOK$/, qr/bFOUND$/,
719   qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
720 );
724 @av_scanners_backup = (
725
726   ### http://www.clamav.net/   - backs up clamd or Mail::ClamAV
727 #  ['ClamAV-clamscan', 'clamscan',
728 #    "--stdout --no-summary -r --tempdir=$TEMPBASE {}",
729 #    [0], qr/:.*sFOUND$/m, qr/^.*?: (?!Infected Archive)(.*) FOUND$/m ],
730 ['ClamAV-clamscan', 'clamscan',
731     "--stdout --no-summary -r --tempdir=$TEMPBASE {}",
732     [0], qr/:.*sFOUND$/, qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
配置Amavisd与spam结合
14  @bypass_spam_checks_maps  = (%bypass_spam_checks,@bypass_spam_checks_acl,$bypass_spam_checks_re);
配置Postfix 集成amavisd-new
修改/etc/postfix/master.cf添加如下:
smtp-amavis   unix  -       -        n      -        2      smtp   
-o  lmtp_data_done_timeout=1200    
-o  lmtp_send_xforward_command=yes 
-o  disable_dns_lookups=yes
127.0.0.1:10025 inet n  -        n      -        -      smtpd  
-o content_filter=     
-o smtpd_client_restrictions=permit_mynetworks,reject  
-o smtpd_helo_restrictions=    
-o smtpd_sender_restrictions=  
-o smtpd_recipient_restrictions=permit_mynetworks,reject   
-o smtpd_data_restrictions=reject_unauth_pipelining    
-o mynetworks=127.0.0.0/8
修改 vim /etc/postfix/main.cf文件
content_filter=smtp-amavis:[127.0.0.1]:10024
重启postfix:
service postfix restart
重新启动amavisd:
service amavisd restart
使用thunderbird发送正常邮件测试,
发送垃圾邮件测试,代码:XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X
病毒代码:X5O!P%@AP[4PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
被拒绝的邮件保存在/var/spool/vscan/tmp目录下
日志文件/var/log/maillog
11. 安装FCGI
rpm -ivh httpd-devel-2.2.3-31.el5.i386.rpm
ln -s /usr/lib/httpd/build /etc/httpd
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
除了Apache需要FCGI的支持外,extmail也需要相应的perl-FCGI模块
yum install perl-FCGI-0.67-1.2.el5.rf.i386.rpm
vim /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>
<VirtualHost *:80>
ServerName mail.lx.com
DocumentRoot /var/www/extsuite/extmail/html/
#ScriptAlias /extmail/cgi/ /var/www/extsuite/extmail/cgi/
Alias /extmail/cgi/ /usr/bin/dispatch.fcgi/
Alias /extmail /var/www/extsuite/extmail/html/
<Location "/extmail/cgi">
SetHandler fastcgi-script
</Location>
ScriptAlias /extman/cgi/ /var/www/extsuite/extman/cgi/
Alias /extman /var/www/extsuite/extman/html/
重启Apache和fastcgi server开机自启动:
shell
# service httpd restart
# /var/www/extsuite/extmail/dispatch-init start
# echo “/var/www/extsuite/extmail/dispatch-init start” &gt;&gt; /etc/rc.d/rc.local
或者
------------------------------------------------------------------------------------
httpd.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>
Alias /extmail/cgi/ /usr/bin/dispatch.fcgi/
Alias /extmail /var/www/extsuite/extmail/html
Alias /extman/cgi/ /usr/bin/dispatch.fcgi/
Alias /extman /var/www/extsuite/extman/html
<Location "/extmail/cgi">
  SetHandler fastcgi-script
</Location>
<Location "/extman/cgi">
  SetHandler fastcgi-script
</Location>
-----------------------------------------------------------------------------------
要注意,上面的/usr/bin/dispatch.fcgi并不存在,但是必须按上面的写。有些用户自作聪明指向真实的dispatch.fcgi程序,反而用不了,这里大家一定要注意,按上面的配置写好。
另外,extmail和extman最好在同一个目录下,可以最少避免问题。
然后启动dispatch.fcgi:
/var/www/extsuite/extmail/dispatch-init start
并重新启动apache。

声明: 此文观点不代表本站立场;转载须要保留原文链接;版权疑问请联系我们。