操作系统(OS)CentOS5.5邮件传输代理(MTA)Postfix使用最新版本2.6.x数据库/目录服务MySQL5.0可选openLDAP或NetScapeLDAP,本文以MySQL为蓝本邮件投递代理(MDA)maildrop2.0.x支持过滤和强大功能Web帐户管理后台ExtMan0.2.5支持无限域名
操作系统(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
# mysql -u root -p
测试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
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
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”
>> /etc/rc.d/rc.local
# echo “/var/www/extsuite/extman/daemon/cmdserver -v -d”
>> /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;
超过这个分数,直接?⑿偶?阜莺笊境?br />
配置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[4\PZX54(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
FastCgiExternalServer /usr/bin/dispatch.fcgi -host 127.0.0.1:8888
-idle-timeout 240
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/
SetHandler fastcgi-script
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”
>> /etc/rc.d/rc.local
或者
------------------------------------------------------------------------------------
httpd.conf里增加:
LoadModule fastcgi_module modules/mod_fastcgi.so
FastCgiExternalServer /usr/bin/dispatch.fcgi -host 127.0.0.1:8888
-idle-timeout 240
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
SetHandler fastcgi-script
SetHandler fastcgi-script
-----------------------------------------------------------------------------------
要注意,上面的/usr/bin/dispatch.fcgi并不存在,但是必须按上面的写。有些用户自作聪明指向真实的dispatch.fcgi程序,反而用不了,这里大家一定要注意,按上面的配置写好。
另外,extmail和extman最好在同一个目录下,可以最少避免问题。
然后启动dispatch.fcgi:
/var/www/extsuite/extmail/dispatch-init start
并重新启动apache。