找回密码
 注册
搜索
热搜: 回贴
微赢网络技术论坛 门户 服务器 Linux/BSD 查看内容

debian etch 4.0r3 邮件解决方案 extmail postfix

2009-12-20 13:19| 发布者: admin| 查看: 81| 评论: 0|原作者: 江海



Normal
0

7.8 磅
0
2

false
false
false














MicrosoftInternetExplorer4



/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
Debian etch 邮件解决方案
前言:由于之前做过postfix sasl webmail pop3 的邮件系统,这次相对比较轻松,但是还是有惨痛的教训,由于升级软件不当,导致整个系统崩溃,还好在最短的时间内得到恢复,感谢这次教训,感谢CU的战友们,感谢extmail
系统:debian etch 4.0r3
内核:2.6.18-6-amd64
Apt源:
deb
http://debian.cn99.com/debian/ stable main contrib non-free
deb-src
http://debian.cn99.com/debian/ stable main contrib non-free
注:intel 64位其实采用的是amd64的架构,apt源尽量用稳定版 我在这方面吃了不少亏

1.postfix的logic frame (了解本质后,才能事半功倍)
Smtp stream :用户从MUA发送邮件到邮件服务器这个地方牵扯到smtp验证的问题,顾名思义就是验证用户的合法性。
Smtp验证的实施:
1)
用户发请求到postfix
2)
Potsfix
调用saslauthd
3)
Saslauthd调用其他的验证模块(pam authdaemond .etc)
4)
Pam 调用 libmysql-pam 来连接后台数据库
mysql 一般都是这样的
题外话:很多人对SMTP验证很熟悉,其实也有POP验证,只是很少有人提起
Pop验证实施:
1)
用户连接到pop服务器
2)
Pop调用authdaemon
3)
Authdaemon
连接后台数据库,达到验证目的
以上过程我没找资料佐证,只是我觉得应该是这个流程,如有误请大家指出
关于virtual:为什么要virtual,其实大家有目共睹,就是为了安全,virtual的概念就是能用邮件服务器收发邮件,不需要登入系统
闲话少说开始动工
首先确定自己的mx记录
#nslookup
#set type=mx
#you.domain.com
显示结果应该是象这样 mail.test.com internet address = 1.1.1.1
安装软件:
apt-get install
postfix postfix-mysql postfix-doc mysql-client mysql-server courier-authdaemon
courier-authlib-mysql courier-pop courier-pop-ssl courier-imap courier-imap-ssl
postfix-tls libsasl2 libsasl2-modules libsasl2-modules-sql sasl2-bin
libpam-mysql openssl phpmyadmin apache2 libapache2-mod-php5 php5 php5-mysql
可能出现这个情况:Create directories for
web-based administration ?
General type of configuration?
Mail name?
SSL certificate required
打上quota补丁:
安装软件:
apt-get install
build-essential dpkg-dev fakeroot debhelper libgdbm-dev libldap2-dev
libpcre3-dev libssl-dev libsasl2-dev postgresql-dev po-debconf dpatch
libdb4.3-dev libmysqlclient15-dev lsb-release libcdb-dev
注意观察安装的软件信息,有些包可能没有了,因为源一直在更新,不用理会所缺的包,大部分都是有的
#cd /usr/src
#apt-get source postfix
postconf -d | grep
mail_version 查看postfix version
象这样:
server1:~#
postconf -d | grep mail_version
mail_version = 2.3.8
milter_macro_v = $mail_name $mail_version下载相应的补丁包
做如下操作:
wget
http://vda.sourceforge.net/VDA/postfix-2.3.8-vda.patch.gz
gunzip postfix-2.3.8-vda.patch.gz
cd postfix-2.3.8
patch -p1 如果出现error 信息 请加上-d 参数
祈祷吧,可能出现其他的问题,之前我用测试版的时候 要更改debian/ruls
所以还是尽量用stable 版
最后的warning 信息可以忽略
最后会剩下这个包postfix_2.3.8-2_amd64.deb 64位的 32的为应该是postfix_2.3.8-2_i386.deb
#dpkg –i postfix_2.3.8-2_amd64.deb
安装extmail
废话:以前我装的是postfixadmin squirrel webmail 我很难受,postfixadmin 一点都好用,特别是添加alias的时候,这次改extmail
下载extmail
www.extmail.org

我用的是:extmail-1.0.4.tar.gz extman-0.2.4.tar.gz
先安装apache2:
apt-get install apache2 libapache2-mod-fastcgi libfcgi-perl
apt-get install
build-essential libtool libnet-server-perl libnet-cidr-perl libberkeleydb-perl
arc zoo lzop liblzo1 rar libstdc 5 libgd-gd2-perl libfile-tail-perl
libdigest-sha1-perl libdigest-HMAC-perl libnet-ip-perl libnet-dns-perl
libhtml-tagset-perl libhtml-parser-perl libio-stringy-perl libio-multiplex-perl
libio-socket-ssl-perl libio-zlib-perl libnet-ssleay-perl libunix-syslog-perl
libtimedate-perl libmailtools-perl libconvert-binhex-perl libmime-tools-perl
libconvert-tnef-perl libconvert-uulib-perl libcompress-zlib-perl
libarchive-zip-perl libarchive-tar-perl
大概是这些软件 装不上的不用理会,我也参照别人的文档,具体是哪个装不上去我忘了
tar zxvf extmail-1.0.4.tar.gztar zxvf extman-0.2.4.tar.gzmkdir /var/www/extsuite/mv extmail-1.0.4 /var/www/extsuite/extmailmv extman-0.2.4 /var/www/extsuite/extman
将extman/docs下的几个mysql配置文件拷贝到postfix的配置目录下,并设置其权限为属于postfix组,同组人可读,其他用户无权限
同时编辑复制过来的所有文件把“localhost”改为“127.0.0.1”
cp /var/www/extsuite/extman/docs/mysql_*.cf /etc/postfix/chmod o= /etc/postfix/mysql_*.cfchgrp postfix /etc/postfix/mysql_*.cf
数据库初始化
这个要注意:修改/var/www/extsuite/extman/docs/init.sql 第18行INSERT INTO `mailbox` VALUES
('postmaster@extmail.org','postmaster','$1$phz1mRrj$3ok6BjeaoJYWDBsEPZb5C0','','PostMaster','','extmail.org/postmaster/Maildir/','extmail.org/postmaster','104857600S','52428800S','extmail.org',1000,1000,'2007-02-14
15:10:04','2010-11-08',1,0,0,0,0,0,0,0,'',''); 象这样
mysql -uroot -p mysql -uroot -p


mkdir /tmp/extmanchown -R vuser:vuser /tmp/extman debian在装系统的时候会要求你创建一个用户,正好uid是1000 而extmail也正好用的是1000 注意更改/ect/passwd
信息,讲创建用户的shell改成false
编辑rc.local,加入下面内容以实现开机自动建立
if [ ! -d /tmp/extman ]; then mkdir /tmp/extman chown -R vuser:vuser /tmp/extmanfi

cd /var/www/extsuite/extman/tools ./maildirmake.pl /home/vuser/extmail.org/postmaster/Maildir chown -R vuser:vuser /home/domains/extmail.org cd -

编辑webmail.cf与webman.cf
cp /var/www/extsuite/extmail/webmail.cf.default /var/www/extsuite/extmail/webmail.cf
修改/var/www/extsuite/extmail/webmail.cf里的其他参数,主要变动的内容见下:
SYS_USER_LANG = zh_CNSYS_USER_CHARSET = gb2312 SYS_MYSQL_USER = extmailSYS_MYSQL_PASS = extmailSYS_MYSQL_DB = extmailSYS_MYSQL_SOCKET = /var/run/mysqld/mysqld.sockSYS_AUTHLIB_SOCKET = /var/run/courier/authdaemon/socket SYS_G_ABOOK_FILE_CHARSET = gb2312

具体情况看自己的机器上的配置 主要是SYS_MYSQL_SOCKET = /var/run/mysqld/mysqld.sock
标红颜色的字段很重要
编辑vhosts
#cd
/var/apache2/sites-enable/
#vim
001-mail.test.com 象这样
ServerName mail.test.com
DocumentRoot /var/www/extsuite/extmail/html/
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
FastCgiExternalServer
/usr/bin/dispatch.fcgi -host 127.0.0.1:8888 -idle-timeout 240
注意:FastCgiExternalServer
/usr/bin/dispatch.fcgi -host 127.0.0.1:8888 -idle-timeout 240 不能在vhost里面 ,不知道为什么debian跟其他的不一样
更改apache2的启动用户 vuser group vuser

然后编辑/var/www/extsuite/extmail/dispatch-init文件,修改如下:
MAXFORK=10
最后启动fastcgi server:
/var/www/extsuite/extmail/dispatch-init start
如果没有意外将启动10个dispatch.fcgi守护进程,可以通过以下命令将启动命令加到rc.local中,实现自启动:
echo "/var/www/extsuite/extmail/dispatch-init start" >> /etc/rc.local

#ps aux | grep
cgi 能看见10个cgi 进程
http://virtualhost 看看extmail
ok了没有
root@extmail.org
password:extmail*123*
这边会出现 access denied 的错误
解决方案主要是看webmail.cf
和webman.cf的配置文件 主要是用户名 数据库 密码是否正确 如果还是不行 进入数据库执行:flush privileges 还有一点要提的是关于验证码的问题,自己可以去掉 这个自己去找找
SMTP验证:
之前也说了smtp验证的,我用的是mysql作为backend,
1.更还saslauthd
# vim
/etc/default/saslauthd
更改如下几项
START=yes 设置开机自动启动
MECHANISMS="pam" 选择验证框架 我选择pam
OPTIONS="-c
-m /var/spool/postfix/var/run/saslauthd -r" 这一项我没仔细研究好像跟登入名字有关系 注意不要忘记 “–r”
2.之前说了逻辑关系,编辑pam 关于pam是什么东西 大家可以上网找找资料
#vim
/etc/pam.d/smtp
内容如下:
auth required
pam_mysql.so user=extmail passwd=extmail host=127.0.0.1 db=extmail
table=mailbox usercolumn=username passwdcolumn=password crypt=1
account sufficient
pam_mysql.so user=extmail passwd=extmail host=127.0.0.1 db=extmail
table=mailbox usercolumn=username passwdcolumn=password crypt=1
解释一下:其实就是定义一个查询的方式 crypt=1或者0 表示加密或者不加密 注意对照你的数据库 还有用户名 密码 请保持跟自己的一致
3.由于postfix处于chroot
jail 要想调用到saslauthd 必须更改socket文件
#mkdir /var/spool/postfix/var/run/saslauthd
#vim
/etc/postfix/sasl/smtpd.conf 内容如下:
pwcheck_method:saslauthd
mech_list:plain
login
allow_plaintext:
true
auxprop_plugin:
mysql
sql_hostnames:
127.0.0.1
sql_user: extmail
sql_password:
extmail
sql_database:
extmail
log_level:7
sql_select: SELECT
password FROM mailbox WHERE username='%u@%r' and domain='%r'
4.更改main.cf 文件
###########SASL######################
broken_sasl_auth_clients
= yes
smtpd_sasl_auth_enable
= yes
smtpd_sasl_local_domain
= $myhostname
smtpd_sasl_security_options
= noanonymous
加入以上的内容
5.重启postfix
saslauthd /
/etc/init.d/postfix
restart
/etc/init.d/saslauthd restart
telnet localhost
25
ehlo localhost
250-AUTH PLAIN
LOGIN
250-AUTH=PLAIN
LOGIN
出现这两项表示 sasl 配置成功
如何检查SMTP验证是否成功,其实就是检查数据库的连接成功没有
继续上面的操作
先这样操作一下
#perl -e 'use MIME::Base64; print encode_base64("postmaster\@extmail.org")'cG9zdG1hc3RlckBleHRtYWlsLm9yZw==#perl -e 'use MIME::Base64; print encode_base64("extmail")'如果出错的话:请用如下脚本#vim encode.pl#!/usr/bin/perlUse strict;Use MIME::Base64;If ($#ARGV !=1) { Die “Usage:encode.pl \n;”}Print encode_base64(“$ARGV[0]\0$ARGV[0]\$ARGV[1]”);Exit 0; ZXh0bWFpbA==telnet localhost 25Trying 127.0.0.1...Connected to localhost.localdomain (127.0.0.1).Escape character is '^]'.220 mail.extmail.org ESMTP Postfix - by extmail.orgehlo demo.domain.tld250-mail.extmail.org250-PIPELINING250-SIZE 10240000250-VRFY250-ETRN250-AUTH LOGIN PLAIN250-AUTH=LOGIN PLAIN250-ENHANCEDSTATUSCODES250-8BITMIME250 DSNauth login334 VXNlcm5hbWU6cG9zdG1hc3RlckBleHRtYWlsLm9yZw==334 UGFzc3dvcmQ6ZXh0bWFpbA==235 2.0.0 Authentication successfulquit221 2.0.0 Bye
如果出现
Authentication
successful 表示没有问题了
6.pop3验证
之前也说过了pop3的验证 其实是靠authdaemon 工作,软件都安装好了吧?再插点题外话,
pwcheck_method: authdaemon
这一项大家看好咯,说明smtp 和 pop3 可以用同一个“中间人”之前smtp验证是用pam.
这方面的资料大家自己去整理,事实上可以的

# vim
/etc/courier/authdaemonrc更改如下一项
authmodulelist="authmysql"
# cp
/etc/courier/authmysqlrc /etc/courier/authmysqlrc_orig
#cat /dev/null > /etc/courier/authmysqlrc
#vim /etc/courier/authmysqlrc
内容如下:
MYSQL_SERVER 127.0.0.1MYSQL_USERNAME extmailMYSQL_PASSWORD extmailMYSQL_SOCKET /var/lib/mysql/mysql.sockMYSQL_PORT 3306MYSQL_OPT 0MYSQL_DATABASE extmailMYSQL_USER_TABLE mailboxMYSQL_CRYPT_PWFIELD passwordMYSQL_UID_FIELD uidnumberMYSQL_GID_FIELD gidnumberMYSQL_LOGIN_FIELD usernameMYSQL_HOME_FIELD homedirMYSQL_NAME_FIELD nameMYSQL_MAILDIR_FIELD maildirMYSQL_QUOTA_FIELD quotaMYSQL_SELECT_CLAUSE SELECT username,password,"",uidnumber,gidnumber,\ CONCAT('/home/vuser/',homedir), \ CONCAT('/home/vuser/',maildir), \ quota, \ name, \ CONCAT("disablesmtpd=",disablesmtpd, \ ",disablesmtp=",disablesmtp, \ ",disablewebmail=",disablewebmail, \ ",disablenetdisk=",disablenetdisk, \ ",disableimap=",disableimap, \ ",disablepop3=",disablepop3, \ ",netdiskquota=",netdiskquota) \ FROM mailbox \ WHERE username = '$(local_part)@$(domain)'
注意红色部分
7.重启daemon
配置Courier-POP3
编辑/etc/courier/pop3d修改下面参数
MAILDIRPATH=/home/vuser/
配置Courier-IMAP
编辑/etc/courier/imapd修改下面参数
MAILDIRPATH=/home/vuser/

/etc/init.d/courier-authdaemon restart
测试Courier-Authlib是否能成功连接mysql
authtest -s login postmaster@extmail.org extmail
如果成功应该有如下显示
Authentication
succeeded.

Authenticated: postmaster@extmail.org (uid 1000, gid 1000)
Home Directory:
/home/vuser/extmail.org/postmaster
Maildir:
/home/vuser/extmail.org/postmaster/Maildir/
Quota: 104857600S
Encrypted
Password: $1$phz1mRrj$3ok6BjeaoJYWDBsEPZb5C0
Cleartext
Password: extmail

Options:
disablesmtpd=0,disablesmtp=0,disablewebmail=0,disablenetdisk=0,disableimap=0,disablepop3=0,netdiskquota=52428800S
如果出现error
请检查数据库连接 分析mail.log 一般都是input/output
Tips: chown daemon:vuser /var/run/courier/authdaemon 可能避免错误
还有
MYSQL_SERVER 127.0.0.1
这一项比较重要,主要是tcp连接跟socket连接的区别 我猜测如果采用localhost 是socket连接
因为postfix是chroot环境,也就是对这个socket文件没有操作权限而影响数据库连接最好还是用tcp连接 关于tcp和socket 的区别 问了N多人没有搞懂,或者说找到我要的答案
测试pop3
telnet localhost 110Trying 127.0.0.1...Connected to localhost.localdomain (127.0.0.1).Escape character is '^]'. OK Hello there.user postmaster@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.
出现问题请仔细分析日志
至此,验证方面的东西都搞定了,如有问题。请仔细分析日志一般都是权限问题
第二部分:MDA配置
概念:MDA mail deliver agent其实就是邮件投递代理,postfix本身有很多邮件投递代理,由于我们的环境 虚拟域
所以可以使用postfix自己的virtual 这个代理,但是它必须创建一个用户来执行投递操作,main.cf中有记录 象这样:
virtual_uid_maps =
static:5000
virtual_gid_maps =
static:5000
virtual_transport
= virtual
下面介绍另一种MDA maildrop maildrop 关于他的性能我没怎么看,因为这次用的extmail 不想冒险 呵呵。。。对了,用postfixadmin的朋友 请用virtual 否则会出现创建目录不成功的情况,据说是有bug的
安装Maildrop
首先运行 debfoster,保留上面已经安装的所有软件。因为下面安装的软件,在使用完之后就马上卸掉了,因为它们只是一些编译工具,对我们的服务器没有用处,仅仅在编译时使用一次而已。
apt-get install debfosterdebfoster
现在开始安装编译工具,首先安装 mysql 开发库,之所以先安装它,是因为它有多个版本,否则,后面需要选择。
apt-get install libmysqlclient15-dev apt-get build-dep maildropapt-get install fakeroot
现在进入 /usr/src 目录,下载 maildrop 源码包
cd /usr/srcapt-get source maildropcd maildrop-2.0.3


#vim debian/rules
修改DEB_CONFIGURE_EXTRA_FLAGS的参数
DEB_CONFIGURE_EXTRA_FLAGS := --enable-use-dotlock=1 --enable-use-flock=1 \--enable-sendmail=/usr/sbin/sendmail --enable-maildirquota \--enable-authlib-tempreject=0 --enable-syslog=1 --enable-maildropmysql \--with-mysqlconfig=/etc/maildropmysql.config --without-db \--enable-maildrop-uid=1000 --enable-maildrop-gid=1000 \--enable-trusted-users="root postfix vuser"

dpkg-buildpackage -rfakeroot -uc -bcd ..ls

应该会出现maildrop_2.0.2-11_amd64.deb 或者32位的maildrop_2.0.3-1_i386.deb

dpkg -i maildrop_2.0.3-1_i386.deb

创建 /etc/maildropmysql.config内容如下
hostname 127.0.0.1port 3306database extmaildbuser extmaildbpw extmaildbtable mailboxdefault_uidnumber 1000default_gidnumber 1000uidnumber_field uidnumbergidnumber_field gidnumberuid_field usernamehomedirectory_field concat('/home/vuser/',homedir,'/')maildir_field concat('/home/vuser/',maildir)quota_field quotamailstatus_field active

修改 /etc/maildroprc,添加如下:
logfile "/var/log/maildrop.log"
手动创建日志
vi /var/log/maildrop.logchown vuser:vuser /var/log/maildrop.logchmod 766 /var/log/maildrop.log
创建 /etc/logrotate.d/maildrop
/var/log/maildrop.log { daily notifempty missingok rotate 5 compress create 766 vuser vgroup sharedscripts }



编辑/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}
由于maildrop不支持一次接收多个收件人,因此必须在/etc/postfix/main.cf增加如下参数:
maildrop_destination_recipient_limit = 1

创建 /etc/quotawarnmsg,里面为邮箱空间超过配额时的警告邮件内容

重新启动postfix
9.图形日志extmail
cp -r /var/www/extsuite/extman/addon/mailgraph_ext/ /usr/local/mailgraph_ext

修改/usr/local/mailgraph_ext/mailgraph-init为:
MAIL_LOG=/var/log/mail.log



启动mailgraph_ext及qmonitor:
这时你有可能要装rddtools
Apt-get install rrdtools
如果出现Can't
locate File/Tail.pm in @INC (@INC contains: /etc/perl /usr/local/lib/p。。。。。)等错误需要安装 perl File::tail
perl -MCPAN -e shell 如果第一次安装 一路回车就好了
cpan>install File::Tail
cpan>quit
/usr/local/mailgraph_ext/mailgraph-init start /usr/local/mailgraph_ext/qmonitor-init start

反病毒/内容过滤配置
这个东西主要看自己的应用,请参考这篇文档
http://www.ohsc.cn/docs/


没有什么大的问题
FAQ
这些都是我摘录的一部分希望对大家有帮助
Random thoughtsQ.:
Can Postfix query the MySQL db directly?
A.: No.
Q.: Why do you use libpam-mysql? saslauthd natively supports SQL.
A.: Because saslauthd only supports unencrypted password if you use a sql db as
an authentication backend. That's the reason for interfacing saslauthd with
PAM. PAM, in turn, can use just anything.
Q.: My friend told me that /etc/postfix/sasl/smtpd.conf should contain
"pwcheck_method: pam"
A.: That was true for SASL


全篇完










最新评论

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-29 23:36 , Processed in 0.219190 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

返回顶部