积累经验
2014年(55)
分类: 系统运维
2014-01-22 23:25:47
基于postfix邮件解决方案Postfix2
项目
我们接下来架设一个完整的邮件系统,要求支持mysql认证,支持pop3,imap,支持sasl,拥有web界面的操作,拥有垃圾邮件过滤功能。确认了需要后我们开始选择不同的程序来完成
我们的需求,本案例使用的是在RHEL6U2 64位环境下的postfix+courier-imap+maildrop+courierauthlib+extmail+extman+
spamassassin的组合,我们先来了解一下每个部件的作用。Postfix
是一种电子邮件服务器,它是由任职于IBM华生研究中心(T.J. WatsonResearch Center)的荷兰籍研究员Wietse Venema为了改良sendmail邮件服务器而产生的。最早在1990年代晚期出现
,是一个开放源代码的软件。courier-authlib 其他数据认证库authlib是maildrop, courier-imap等服务的关键部件courier-imapPOP3
服务器
支持pop3/pop3s/imap/imaps,功能强大,可以方便
与courier-authlib联合使用,配置简单,稳定性好。maildrop 邮件投递代理(MDA)支持过滤和强大功能extmail
extmail是一个webmail程序,webmail是一种收发邮件的方式,也就是通过网站
来进行收发邮件,通过该webmail程序,我们可以通过网站来收发邮件 ,像平时我们登录mail.163.com 来收发网易的邮件一样extman是一个管理邮件用户数据的软件 ,管理以下数据:某个
域的邮箱个数与该域的总容量大小域管理员还可以通过extman群发邮件给该域下的所有用户邮箱用户的帐号密码,容量大小,建立日期,到期时间,是否激活,邮件的邮件存储位置(目录)
,用户别名 等等spamassassin是一个非常优秀的垃圾邮件过滤软件。在配置此安全之前,你应该已经有一套完整的DNS系统,保证所有需要的资源记录都配置正确。
Apache通过perl脚本运行Extman与Extmail,当用户登录时通过Authlib从mysql进行认证,当认证通过后则从用户MailDir中取出邮件。POP与IMAP则由courier-imap负责,同样通过authlib
从mysql进行认证。Postfix的发信认证同样是通过mysql,MDA则使用MailDrop,他可以方便的帮我们调用spamassassin。虽然Postfix也可以自己调用spamassassin,但是使用MailDrop的优点在
于速度快。
需建DNS.然后发送邮件测试是否成功。再结合下面装的环境,在网页中测试收发邮件。
打开 浏 览 器,输 入
用户 为 :root@extmail.org 密码 为 :extmail*123* //打开网页报权限问题, setenforce=0
建个域 发个信 测试
打开 浏 览 器,输 入
流程
1.装包
光盘自带,光盘以外。
2.Mysql
建库、建表、授权。通过sql脚本完成
3.安装一个认证用的中间件,courierauthlib,统一由此中间键来访问mysql。
rpm -ivh courier-authlib-mysql courier-authlib
1)authdaemonrc:指定使用mysql验证
2)authmysqlrc:详细的mysql连接参数。(host/user/password/db/table/select) 以下sql语句为一行。
SELECT username,password,"",uidnumber,gidnumber,CONCAT('/home/data/domains/',homedir),CONCAT('/home/data/domains/',maildir),quota,name FROM mailbox WHERE username = '$(local_part)@$(domain)'
4.rpm -ivh courier-imap-4.12.20130220-1.x86_64.rpm
service courier-imap start
chkconfig courier-imap on
5.sasl认证 安装src.rpm
rpm -ivh cyrus-sasl-2.1.23-13.el6.src.rpm
1) 修改cyrus-sasl.spec文件
2) 构建rpm包
rpmbuild -ba
cyrus-sasl.spec //rpm-build需安装此包
3) 卸载原有的cyrus-sasl,安装新cyrus-sasl //一定要构建成功再操作此步骤
for i in $(rpm -qa | grep sasl | awk -F"-2.1.23" '{ print $1 }') ; do rpm -e $i --nodeps >/dev/null ; done //可以手工操作
4)创建配置文件
6. 配置postfix
a) 装包
b)修改配置文件-----/虚拟域的定义/sasl认证的启用/maildrop指定
7.安装maildrop(MDA)
a) rpm -ivh maildrop*.rpm
b)指定邮件投递用户
groupadd -g 1000 vgroup
useradd -g
1000 -u 1000 -s /sbin/nologin -d /dev/null vuser
c) 配置 /etc/postfix/master.cf 文件 ,让postfix可以调用maildrop
8.启动postfix/couurier-authlib/mysql,测试authlib,maildrop
9.Webmail安装
a)修改/etc/httpd/conf/httpd.conf
b)apache配置完后安装extmail和extman
c)启动日志分析工具
d)重启一下服务,测试一下
10.垃圾邮件过滤
a)yum install spamassassin
cat > /etc/maildroprc << ENDF
to "$HOME/$DEFAULT/.Spam/" 文件或地址需修改
项目(6-postfix1, 6-postfix2)
192.168.0.60 desktop60.example.com
192.168.0.61 desktop61.example.com
60域:postfix.com
61域:post.com
1.装包
装光盘自带的包
yum install gd pam-devel httpd-devel mysql-devel mysql-server php-xml php-pdo openldap-servers pcre-devel apr-devel apr-util-devel perl-DBD-MySQL libtool-ltdl expect php-gd postgresql postgresql-devel libdbi ruby ruby-libs ruby-devel php-common php php-cli xorg-x11-fonts-Type1 febootstrap febootstrap-supermin-helper perl-CGI–y
装光盘以外的包用rpm方式一个个装
gdbm-devel
libmcrypt
libmcrypt-devel
perl-GD
perl-rrdtool ////单独装会报错,需要2个包一起装rpm -ivh perl-rrdtool-1.4.7-1.el6.rfx.x86_64.rpm rrdtool-1.4.7-1.el6.rfx.x86_64.rpm
rrdtool
perl-Unix-Syslog
php-mcrypt
ruby-rrdtool
libtool-ltdl-devel
共享目录下有安装包,直接装包(跳过以下src rpm方式)
rpm -ivh perl-File-Tail-0.99.3-1.2.el6.noarch.rpm libmhash-0.9.1-1.dag.x86_64.rpm
还有几个包没有现在的rpm包,所以使用src rpm的方式来安装。
rpm -ivh libmhash-0.9.1-1.dag.src.rpm perl-File-Tail-0.99.3-1.2.src.rpm
cd ~/rpmbuild/SPECS/
rpmbuild -ba libmhash-0.9.1-dag.spec // yum install rpm-build -y
rpmbuild -ba perl-File-Tail.spec
cd ../RPMS/
rpm -ivh noarch/perl-File-Tail-0.99.3-1.2.el6.noarch.rpm x86_64/libmhash-*
安装完后我们将http服务和mysql服务启动看看是否安装正确
service mysqld start
service httpd start
2.认证数据库mysql
环境准备好了,接下来我们可以开始安装我们的postfix了,以安装之前,我们先生成
认证需要使用的mysql库。同时不要忘了给你的mysql加个密码。extmail.sql脚本会生成
一个mysql库,而init.sql脚本会初始化此库。
cp extman-1.1.tar.gz /tmp/rpms
tar zxf extman-1.1.tar.gz
cd extman-1.1/docs
mysqladmin -uroot password "uplooking"
mysql -puplooking < extmail.sql
mysql -puplooking < init.sql
3. 安装一个认证用的中间件,courierauthlib,统一由此中间键来访问mysql。
要让MTA,MAA来访问mysql,我们可以安装一个认证用的中间件,courierauthlib,
统一由此中间键来访问mysql。
rpm -ivh courier-authlib-mysql-0.65.0.20130314-1.el6.x86_64.rpm courier-authlib-0.65.0.20130314-1.el6.x86_64.rpm
安装完后创建并修改其配置文件 ,配置文件中我们需要告诉他认证使用mysql,并且
将连接mysql所需要的一些参数写入配置文件。
cd /etc/authlib/
vi authdaemonrc
修改如下两个选项
authmodulelist="authmysql"
authmodulelistorig="authmysql"
修改authmysqlrc 的配置文件
vi authmysqlrc
MYSQL_SERVER localhost
MYSQL_USERNAME extmail
MYSQL_PASSWORD extmail
MYSQL_SOCKET /var/lib/mysql/mysql.sock
MYSQL_DATABASE extmail
MYSQL_SELECT_CLAUSE SELECT username,password,"",uidnumber,gidnumber,CONCAT('/home/data/domains/',homedir),CONCAT('/home/data/domains/',maildir),quota,name FROM mailbox WHERE username = '$(local_part)@$(domain)'
[root@desktop60 authlib]# service courier-authlib start
Starting Courier authentication services: authdaemond //启动成功
chkconfig courier-authlib on
chmod 755 /var/spool/authdaemon
4.接着我们来安装courier-imap 以提供pop3的支持和imap 支持。
rpm -ivh courier-imap-4.12.20130220-1.x86_64.rpm
service courier-imap start
chkconfig courier-imap on
5.sasl认证 安装 src.rpm
当需要发信认证时,我们会用到sasl包,可惜的是自带的rpm包不支持mysql或者是
authlib,那么我们就卸载原来所有sasl有关的包,自己重新编译安装一个新的。
rpm -ivh cyrus-sasl-2.1.23-13.el6.src.rpm
cd ~/rpmbuild/SPECS/
修改cyrus-sasl.spec文件
vi cyrus-sasl.spec
在234行的地方加入如下语句
--with-authdaemond=/var/spool/authdaemon/socket \
修改完成后执行后续操作
rpmbuild -ba cyrus-sasl.spec //rpmbulid命令yum install rpm-bulid -y
for i in $(rpm -qa | grep sasl | awk -F"-2.1.23" '{ print $1 }') ; do rpm -e $i --nodeps > /dev/null ; done
生成sasl 的相关配置文件 ,Postfix会调用smtp.conf配置文件,所以你应该手工将此
文件生成,并且在此文件中声名使用authlib来认证。
cat > /usr/lib64/sasl2/smtpd.conf << ENDF
pwcheck_method:authdaemond
log_level:3
mech_list:PLAIN LOGIN
authdaemond_path:/var/spool/authdaemon/socket
ENDF
6. 配置postfix
为了让postfix支持虚拟域,我们在配置文件后面加入虚拟域支持。
message_size_limit = 14680064
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_mailbox_base = /home/data/domains
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_limit_maps.cf
virtual_transport = maildrop
maildrop_destination_recipient_limit = 1
smtpd_sasl_auth_enable = yes
smtpd_sasl2_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_path = smtpd
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
reject_unauth_pipelining,
reject_invalid_hostname
(格式缩进)
为了让postfix可以和extman 联用 所以将extman目录下mysql_virtual开头的配置
文件拷到postfix 目录下
cp /tmp/rpms/extman-1.1/docs/mysql_virtual_* /etc/postfix
7.安装maildrop(MDA)
安装maildrop 以扩展邮件投递功能 ,maildrop是一个优秀的MDA,我们让postfix
在投递邮件时使用maildrop。
rpm -ivh maildrop*.rpm
我们并不希望maildrop在投递邮件是以root身份投递,所以建个普通用户。
groupadd -g 1000 vgroup
useradd -g 1000 -u 1000 -s /sbin/nologin -d /dev/null vuser
配置 /etc/postfix/master.cf 文件 ,让postfix可以调用maildrop。
vi /etc/postfix/master.cf
在最后面加入下面内容:
maildrop unix - n n - - pipe
flags=DRhu user=vuser argv=/usr/bin/maildrop -d ${user}@${nexthop} ${recipient} ${user} ${extension} ${nexthop}
(注意缩进)不然web收发邮件将找不到vuser用户,缩进表示是一行参数?
创建邮件存储目录 并建个测试域
mkdir -p /home/data/domains/extmail.org/postmaster
maildirmake /home/data/domains/extmail.org/postmaster/Maildir
chown -R vuser:vgroup /home/data/domains/
service postfix restart
测试 maildrop
root@localhost ~]# echo "test" | maildrop -V 10 -d postmaster@extmail.org
maildrop: authlib: groupid=1000
maildrop: authlib: userid=1000
maildrop: authlib: logname=postmaster@extmail.org,
home=/home/data/domains/extmail.org/postmaster,
mail=/home/data/domains/extmail.org/postmaster/Maildir/
maildrop: Changing to /home/data/domains/extmail.org/postmaster
Message start at 0 bytes, envelope sender=postmaster@extmail.org
maildrop: Attempting .mailfilter
maildrop: Delivery complete.
出现上以信息说明 authlib,maildrop 工作正常(如果报错,查main.cf select语句是否正确 | 查日志)
8.Webmail安装
项目中我们还需要通过web方式进行收发邮件,所以需要修改apache 配置
修改/etc/httpd/conf/httpd.conf,因为投递邮件时maildrop 是以 vuser:group用户身
份投递,所以 修改apache所有者,生成extman和extmail所需要的配置信息。
vi /etc/httpd/conf/httpd.conf
User vuser
Group vgroup
[root@localhost ~]# cd /etc/httpd/conf.d/
[root@localhost conf.d]# vim extmail.conf
Alias /extman/cgi/ /var/www/extsuite/extman/cgi/
Alias /extman /var/www/extsuite/extman/html/
SetHandler cgi-script
Options +ExecCGI
# config for ExtMail
Alias /extmail/cgi/ /var/www/extsuite/extmail/cgi/
Alias /extmail /var/www/extsuite/extmail/html/
SetHandler cgi-script
Options +ExecCGI
apache配置完后安装extmail和extman
mkdir /var/www/extsuite
解压extman和extmail 并cp到apache 目录下
cp -r extmail-1.2 /var/www/extsuite/extmail
cp -r extman-1.1 /var/www/extsuite/extman
切换到/var/www/extsuite/extmail 目录下 ,配置extman和extmail。首先生成主配
置文件,并在主配置文件中修改相应选项。
cp webmail.cf.default webmail.cf
修改 webmail.cf 下面的选项
SYS_SESS_DIR = /tmp/extmail
SYS_MAILDIR_BASE = /home/data/domains
SYS_MYSQL_USER = extmail
SYS_MYSQL_PASS = extmail
切换到/var/www/extsuite/extman 目录下
cp webman.cf.default webman.cf
修改 webman.cf 下面的选项为邮件目录:
SYS_MAILDIR_BASE = /home/data/domains
修改完成之后创建相应session目录
mkdir /tmp/{extman,extmail}
chown vuser:vgroup /tmp/ext*
另外extman为我们提供了一个友好的图形化日志工具,可以配置并启用这个后台日志
分析工具。
cd /var/www/extsuite/extman/addon/
cp -r mailgraph_ext /usr/local/
启动日志分析工具
/usr/local/mailgraph_ext/mailgraph-init start
echo '/usr/local/mailgraph_ext/mailgraph-init start' >> /etc/rc.local
重启一下服务,测试一下
service httpd restart
service postfix restart
chown -R vuser:vgroup /var/lib/php/session/
打开 浏 览 器,输 入
用户 为 :root@extmail.org 密码 为 :extmail*123* //打开网页报权限问题, setenforce=0
建个域 建个用户。
登录
用该用户登录, 发个信 测试(postfix.com DNS需建立),2台机器互发信件,还需反向解析。
打开 浏 览 器,输 入
9. 垃圾邮件过滤
最后我们加入垃圾邮件的过滤,安装spamassassin,并生成/etc/maildroprc文件,以
便让maildrop在投递过程中调用spamassassin。
yum install spamassassin
vim /etc/maildroprc
if ( $SIZE < 26144 )
{
exception {
xfilter "/usr/bin/spamassassin --prefspath=$HOME/$DEFAULT/.spamassassin/user_prefs"
}
}
if (/^X-Spam-Flag: *YES/)
{
exception {
to "$HOME/$DEFAULT/.Spam/"
}
}
else
{
exception {
to "$HOME/$DEFAULT"
}
}
spamassassin的过滤模板在/etc/mail/spamassassin/local.cf,修改为:
required_score 5.0
rewrite_header Subject ********SPAM********
report_safe 1
use_bayes 1
skip_rbl_checks 0
ok_languages zh en
ok_locales en ko
score HEAD_ILLEGAL_CHARS 0
score SUBJ_ILLEGAL_CHARS 0
score DATE_IN_PAST_03_06 0
score UPPERCASE_25_50 0
score UPPERCASE_50_75 0
score UPPERCASE_75_100 0
score X_MSMAIL_PRIORITY_HIGH 0
score X_PRIORITY_HIGH 0
score TO_TXT100
score RATWARE_HASH_2 100
score RATWARE_HASH_2_V2 100
score BAYES_99 0.1
score BAYES_80 0.1
score BAYES_60 0.1
score FROM_ILLEGAL_CHARS 0.1
score MIME_BASE64_TEXT 0.1
score NO_RDNS_DOTCOM_HELO 0.1
scoreCHINA_HEADER 0.1
score NO_REAL_NAME 0.2
score HTML_MESSAGE 0.2
score MIME_HTML_ONLY 0.2
score MIME_HTML_ONLY_MULTI 0.2
score FORGED_MUA_OUTLOOK 0.2
score FORGED_HOTMAIL_RCVD 0.2
score FORGED_OUTLOOK_TAGS0.2
score MAILTO_TO_SPAM_ADDR 0.2
## 黑白名单
whitelist_from *@test.com
blacklist_from
## 使用中国反垃圾邮件联盟的CBL/CDL
## URL:
header RCVD_IN_CBLeval:check_rbl('cbl', 'cbl.anti-spam.org.cn.')
# describe RCVD_IN_CBLReceived via a relay in cbl.anti-spam.org.cn
tflags RCVD_IN_CBLnet
header RCVD_IN_CDL eval:check_rbl('cdl-notfirsthop', 'cdl.anti-spam.org.cn.')
describe RCVD_IN_CDL CDL: dialup sender did non-local SMTP
tflags RCVD_IN_CDL net
score RCVD_IN_CBL4.0
score RCVD_IN_CDL 3.0
将spamassassin设定的为开机运行
chkconfig spamassassin on
# 使用CCERT 中文垃圾邮件过滤规则集Chinese_rules.cf //以下实验未操作
wget -N -P /usr/share/spamassassin //需网上下载
service spamassassin start
定期自动更新中文反垃圾邮件规则
crontab –e
# 加入
0 0 1 * * wget -N -P /usr/share/spamassassin ; /etc/init.d/spamassassin restart //需要联外网,没验证过格式是否正确
建立SpamAssassin的学习系统
sa-learn --sync -D -p user_prefs
查看自学习的数据信息
sa-learn --dump all
# 查看调试信息
spamassassin --lint –D
再次打开浏览器测试。
分离mysql服务器
如果你的mysql不在本地,在一台单独的服务器之上,那你需要修改如下几个配置文件中的mysql主机地址
/etc/authlib/authmysqlrc
/etc/postfix/mysql_virtual_domains_maps.cf
/etc/postfix/mysql_virtual_domains_maps.cf
/etc/postfix/mysql_virtual_mailbox_maps.cf
/etc/postfix/mysql_virtual_limit_maps.cf
/var/www/extsuite/extmail/webmail.cf
/var/www/extsuite/extman/webman.cf
不要忘了mysql的授权,有关extmail用户的权限。