基于postfix一步一步构建Mailserver,支持虚拟用户,支持WebMail

我们来一步一步来构建MailServer,支持虚拟用户、虚拟域,支持Webmail,支持Mysql。这个实验化了两天的时间完成的,其中各种崎岖,认真的照着做,问题不大。不过新手还是不要做这个了,需要整合的东西太多。

原理见:http://laoguang.blog.51cto.com/6013350/1054674

我用的是redhat5.8,mail主机:IP:172.16.1.10,FQDN:mail.laoguang.me.,域laoguang.me ,SElinux已经关闭(切记这个新手最容易忘记这个,遇到错先查看它),iptables也已经关闭。

o.环境准备

0.1 安装开发库

  
  
  
  
  1. yum -y groupinstall "Development Libraries" "Development Tools" \
  2. "Legacy Software Development"  "X Software Development" 

0.2 安装post编译需要的一些库(rpm安装即可)

  
  
  
  
  1. yum -y install tcl tcl-devel libart_lgpl libart_lgpl-devel libtool-ltdl \
  2. libtool-ltdl-devel expect 

0.3 如果安装sendmail请关闭它,并禁止开机启动,否则会冲突的

  
  
  
  
  1. service sendmail stop 
  2. chkconfig  sendmail off 

一,构建DNS服务器

为什么要构建DNS服务器呢?因为当用户发信的时候,比如发信给[email protected]时,postfix会查询163.com的MX记录,获得MX的A记录,然后把邮件发送给这个主机,同样当我们给自己给自己发送邮件的时候,如果是发送的地址类似 [email protected]时postfix也会去查询MX记录,如果你发送的是[email protected]时,则不需要解析MX记录。

1.1 安装bind (我就yum安装了,很轻松),由于redhat5.8带了两个版本的bind,于是我先卸载了低版本的bind,bind-libs,bind-utils,再安装高版本的bind97.

  
  
  
  
  1. rpm -e bind bind-libs bind-utils 
  2. yum -y install bind97 bind97-libs bind-utils 

1.2 配置bind配置文件 /etc/named.conf(由于不是本文的重点所以简单写一下过程)

  
  
  
  
  1. mv /etvc/named.conf /etc/named.conf.bak 
  2. vim /etc/named.conf  ##内容如下 
  3. options { 
  4.         directory "/var/named"; 
  5. }; 
  6. zone "." IN { 
  7.         type hint; 
  8.         file "named.ca"; 
  9. }; 
  10. zone "laoguang.me" IN { 
  11.         type master; 
  12.         file "laoguang.me.zone"; 
  13. }; 
  14. zone "1.16.172.in-addr.arpa" IN { 
  15.         type master; 
  16.         file "172.16.1.zone"; 
  17. }; 

1.3 建立区域文件 /var/named/laoguang.me  /var/named/172.16.1.zone     

  
  
  
  
  1. vim /var/named/laoguang.me  
  2.  
  3. $TTL 86400 
  4. @                       IN      SOA     ns      admin ( 
  5.                                                 10 
  6.                                                 2H 
  7.                                                 5M 
  8.                                                 7D 
  9.                                                 3H ) 
  10.                         IN      NS      ns 
  11.                         IN      MX  10  mail 
  12. ns                      IN      A       172.16.1.10 
  13. mail                    IN      A       172.16.1.10 
  14.  
  15. vim /var/named/172.16.1.zone 
  16.  
  17. $TTL 86400 
  18. @                       IN      SOA     ns      admin ( 
  19.                                                 10 
  20.                                                 2H 
  21.                                                 5M 
  22.                                                 7D 
  23.                                                 3H ) 
  24.                         IN      NS      ns 
  25. ns                      IN      A       172.16.1.10 
  26. 10                      IN      PTR     ns.laoguang.me. 
  27. 10                      IN      PTR     mail.laoguang.me. 
  28.  
  29. chown :named /etc/named.conf /var/named/laoguang.me.zone /var/named/172.16.1.zone 

 1.4 启动named 并验证是否能正确解析,并更改本机dns记录

  
  
  
  
  1. service named start 
  2. dig -t MX laoguang.me @127.0.0.1 ##如果能看到A记录代表成功了 
  3.  
  4. vim /etc/resolv.conf 
  5. nameserver:172.16.1.10 
二.安装配置Mysql  
 2.1 下载mysql 
   
   
   
   
  1. wget http://cdn.mysql.com/Downloads/MySQL-5.5/mysql-5.5.28-linux2.6-i686.tar.gz 

2.2 解压mysql

  
  
  
  
  1. tar xvf mysql-5.5.28-linux2.6-i686.tar.gz -C /usr/local/ 

2.3 制作软连接

  
  
  
  
  1. cd /usr/local ; 
  2. ln -sv mysql-5.5.28-linux2.6-i686 mysql 

2.4 为mysql准备运行用户与数据目录

  
  
  
  
  1. groupadd –r mysql 
  2. useradd -g mysql -r -s /sbin/nologin -M -d /mydata/data mysql 
  3. mkdir -pv /data/mysql 
  4. chown mysql:mysql /data/mysql 

2.5 初始化mysql

  
  
  
  
  1. cd /usr/local/mysql 
  2. chown -R root:mysql . 
  3. ./scripts/mysql_install_db --datadir=/data/mysql --user=mysql 
  4. ls /data/mysql  查看是否生成了系统数据库 
  5. cp support-files/my-huge.cnf /etc/my.cnf   ##提供配置文件 
  6. ##修改配置文件/etc/my.cnf添加一行 
  7. datadir = /data/mysql 
  8. cp support-files/mysql.server /etc/init.d/mysqld  ##提供mysql脚本 
  9. ##添加开机启动 
  10. chkconfig –add mysqld 
  11. chkconfig mysqld on 
  12. ##启动mysqld 
  13. service mysqld restart 

2.6 把mysql的命令添加到path中,并更新man记录 

  
  
  
  
  1. echo "export PATH=$PATH:/usr/local/mysql/bin" > /etc/profile.d/mysql.sh 
  2. vim /etc/man.config  ##文件MANPATH区位置添加如下 
  3. MANPATH /usr/local/mysql/man 

2.7 把mysql库文件头文件导入到系统

  
  
  
  
  1. echo "/usr/local/mysql/lib"  > /etc/ld.so.conf.d/mysql.conf 
  2. ln -sv /usr/local/mysql/include /usr/include/mysql 
  3. ldconfig -v  ##重新加载库文件到缓存 

  到此mysql整理完毕了!!

三.编译安装配置postfix

3.1为postfix准备用户用户组,并为其MDA准备用户与组

  
  
  
  
  1. groupadd -g 2525 postfix  
  2. useradd -g postfix -u 2525 -s /sbin/nologin -M postfix  
  3. groupadd -g 2526 postdrop  
  4. useradd -g postdrop -u 2526 -s /sbin/nologin -M postdrop 

3.2让postfix支持sasl与ssl需要cyrus 与openssl支持,查看是否安装了

  
  
  
  
  1. rpm -qa | grep sasl 
  2. rpm -q openssl

cyrus-sasl-plain-2.1.22-5.el5_4.3
cyrus-sasl-lib-2.1.22-5.el5_4.3
cyrus-sasl-devel-2.1.22-5.el5_4.3
cyrus-sasl-2.1.22-5.el5_4.3

openssl-0.9.8e-22.el5

如果有以上包就继续,没有的话请安装,版本可以不一致。

3.3 下载安装postfix

  
  
  
  
  1. wget ftp://ftp.porcupine.org/mirrors/postfix-release/official/postfix-2.9.4.tar.gz 
  2. tar xvf postfix-2.9.4.tar.gz 
  3. cd postfix-2.9.4 
  4.  
  5. make makefiles 'CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include -DUSE_SASL_AUTH \
  6. -DUSE_CYRUS_SASL -I/usr/include/sasl  -DUSE_TLS' 'AUXLIBS=-L/usr/local/mysql/lib \
  7. -lmysqlclient -lz -lm -L/usr/lib/sasl2 -lsasl2  -lssl -lcrypto' 
  8. ##前半段指定头文件所在路径 后半段指定库文件所在路径## 
  9. make && make install  
  10. ##把第二个选项[postfix的临时目录]改为如下所示,其它的都默认,回车完毕 
  11. tempdir: [/root/postfix-2.9.1] /tmp/postfix   
  12. ##安装完毕后运行,根据提示运行  
  13. newaliases 

3.4 修改配置文件/etc/postfix/main.cf

  
  
  
  
  1. mv /etc/postfix/main.cf /etc/postfix/main.cf.org 
  2. # vim /etc/postfix/main.cf  
  3. ##修改以下几项为您需要的配置  
  4. myhostname = mail.laoguang.me   ##主机名  
  5. mydomain = laoguang.me   ##域名  
  6. myorigin = $mydomain       ##如果用户发邮件没有指定@域名,postfix发送时自动给补上  
  7. inet_interfaces = localhost,$myhostname   ##postfix监听的端口  
  8. mydestination = $myhostname, localhost, $mydomain ##这个指的是postfix负责接收的区域  
  9. mynetworks = 172.16.0.0/16, 127.0.0.0/8  ##这个表示凡是这么来的客户端postfix才负责中继 

     说明:

1、在postfix的配置文件中,参数行和注释行是不能处在同一行中的;
2、任何一个参数的值都不需要加引号,否则,引号将会被当作参数值的一部分来使用;
3、每修改参数及其值后执行 postfix reload 即可令其生效;但若修改了inet_interfaces,则需重新启动postfix;
4、如果一个参数的值有多个,可以将它们放在不同的行中,只需要在其后的每个行前多置一个空格即可;postfix会把第一个字符为空格或tab的文本行视为上一行的延续;

3.5启动postfix,并测试

  
  
  
  
  1. postfix start    ##启动postfix查看是否报错,相应的关闭则为stop 
  2. netstat -tlnp | grep 25  ##查看是否监听了25端口 
  3.  
  4. tcp     0      0 172.16.1.10:25         0.0.0.0:*         LISTEN     15086/master         
  5. tcp     0      0 127.0.0.1:25           0.0.0.0:*         LISTEN     15086/master  

##这块我得��嗦一下,sendmail把所有功能集合到一个程序中,导致其很复杂,并且不够安全,postfix作者采用模块化的设计思路,把各个功能剥离开来,形成一个个模块化程序,通过一个叫master的程序负责调用控制它们,所以比sendmail更安全,并且稳定。

添加一个用户测试:

  
  
  
  
  1. useradd redhat 
  2. echo "admin" | passwd --stdin redhat 

发信给redhat查看是否能收到,为了验证前面说的理论,我们用telnet来发送邮件

  
  
  
  
  1. telnet 172.16.1.10 25 
  2.  
  3. Trying 172.16.1.10...  
  4. Connected to mail.laoguang.me (172.16.1.10).  
  5. Escape character is '^]'.  
  6. 220 mail.laoguang.me ESMTP Postfix  
  7. helo mail.laoguang.me              ##询问smtpd是否在线  
  8. 250 mail.laoguang.me              ##对方给了相应  
  9. mail from:root                    ##告诉smtpd谁发来的信  
  10. 250 2.1.0 Ok                      ##smtpd给了回复  
  11. rcpt to:redhat              ##告诉smtpd邮件是发给谁的,不加@主机名,smtpd会自动给补加$myorigin  
  12. 250 2.1.5 Ok                      ##给了响应  
  13. data                              ##告诉smtpd下面是内容  
  14. 354 End data with <CR><LF>.<CR><LF> ##服务器提示以 "." 结束内容  
  15. Subject hello linux                 ##指定邮件主题,可以省略  
  16. hello linux ,hell GNU               ##随意写的内容  
  17. .                                   ##结束  
  18. 250 2.0.0 Ok: queued as E28CA167E3B  ##smtpd提示发送序列号 

su到redhat查看邮件是否收到了

  
  
  
  
  1. su – redhat 
  2. [redhat@mail ~]$ mail  
  3. Mail version 8.1 6/6/93.  Type ? for help.  
  4. "/var/spool/mail/redhat": 1 message 1 new  
  5. >N  1 [email protected]  Tue Nov  6 06:09  14/498   
  6. &  

从中看到邮件redhat收到了,但是你不觉得这个很恐怖吗,因为每个连上主机的人都可以冒名的发邮件,这个可不得了,所以认证是非常必要的了,这到后面再说。

3.6 如果一切正常,那么让postfix开机启动,可以找个脚本,也可以直接 把命令写到/etc/rc.d/rc.local ,脚本由于太占版面了,所以还是采用第二种吧,其实第一种效果更不错,还能实现服务重启,如果有需要,就去网上找吧,或者把rpm安装后生成的脚本复制过来即可使用。

  
  
  
  
  1. echo "/usr/sbin/postfix start " >> /etc/rc.d/rc.local 

四.为postfix提供别名支持

4.1 vim /etc/postfix/main.cf

##取消alias_maps的注释

  
  
  
  
  1. alias_maps = hash:/etc/aliases 

##再添加一个账户,测试别名机制是否有效

  
  
  
  
  1. useradd hadoop 
  2. echo "admin" | passwd --stdin hadoop 

##修改/etc/aliases 最后添加

redhat:         hadoop   ##第一个字段为初始目标,第二个地址为最终地址

newaliase ##将刚修改的文件编成hash编码,也可以运行postaliase hash:/etc/aliases

##发信给redhat查看日志是否转发,并su到hadoop用户查看是否收到邮件

  
  
  
  
  1. echo "hi,redhat" | mail -s "redhat"  redhat 
  2. tail /var/log/maillog  ##查看是否转发 
  3. su – hadoop   
  4. mail 

五.postfix实现对客户端访问的基本控制

通过这几个参数来控制:

smtpd_client_restrictions ##这个是限制客户端来源ip
smtpd_data_restrictions   ##这个是限制发送data 来源

smtpd_end_of_data_restrictions ##这个是限制那个 '.' 发送来源的
smtpd_etrn_restrictions   ##这个是限制信件来源的即 mail from:
smtpd_helo_restrictions   ##这个是限制发送helo IP来源
smtpd_recipient_restrictions  ##这个是限制给谁中继的
smtpd_sender_restrictions  ##这个是限制发送者地址的即mail from

自定义访问表的条件通常使用check_client_access, check_helo_access, check_sender_access, check_recipient_access进行,它们后面通常跟上type:mapname格式的访问表类型和名称。

下面我们来实现这个情况:禁止来自 [email protected],和来自 @microsoft域的的邮件发送到本机

5.1 编辑/etc/postfix/sender.deny (这个名字可以自己起)

  
  
  
  
  1. [email protected]  REJECT 
  2. microsoft.com   REJECT 

5.2 编码成hash编码

  
  
  
  
  1. postmap hash:/etc/postfix/sender.deny 

5.3 更改主配置文件,根据此文件限制

在主配置文件中查找smtpd_sender_restrictions如果没有就找合适文件添加

  
  
  
  
  1. smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/sender.deny 

5.4 测试设置是否生效

  
  
  
  
  1. [root@mail ~]# telnet 172.16.1.10 25  
  2. Trying 172.16.1.10...  
  3. Connected to mail.laoguang.me (172.16.1.10).  
  4. Escape character is '^]'.  
  5. 220 mail.laoguang.me ESMTP Postfix  
  6. helo mail.laoguang.me  
  7. 250 mail.laoguang.me  
  8. mail from:[email protected]  
  9. 250 2.1.0 Ok  
  10. rcpt to:[email protected]  
  11. 554 5.7.1 <oracle@163.com>: Sender address rejected: Access denied 

由此可知已经生效了.

六.安装dovecot用测试收信发信

6.1 安装dovecot

为了简便咱们yum安装吧

  
  
  
  
  1. yum -y install dovecot 

6.2 编辑dovecot配置文件 /etc/dovecont.conf

  
  
  
  
  1. protocols = imap pop3    ##取消这个注释,启用对imap pop3的监听 

6.3 启动dovecot

  
  
  
  
  1. service dovecot start 

6.4 验证pop3收信

6.4.1通过telnet验证

  
  
  
  
  1. telnet 172.16.1.10 110 
  2. Trying 172.16.1.10... 
  3. Connected to mail.laoguang.me (172.16.1.10). 
  4. Escape character is '^]'. 
  5. +OK Dovecot ready. 
  6. USER redhat 
  7. +OK 
  8. PASS admin 
  9. +OK Logged in. 
  10. LIST 
  11. +OK 1 messages: 
  12. 1 387 

6.4.2通过OE验证

新建立账户

下一步直到完成。

下面给自己发一封邮件测试能否收到:

接受邮件查看是否收到了  ##由于上面设置别名的时候把发往redhat的信全部转发给了Hadoop,通过日志查看到的,所以取消别名重新测试。##如果收不到请确认你的dns指向你刚才建立的dns服务器地址,这就是我们建立dns服务器的作用。

由此可知,一切正常。

七.为postfix开启Cyrus-sasl认证功能

7.1 查看postfix是否支持sasl认证

  
  
  
  
  1. postconf -a  ##如果显示以下代表支持cyrus
  2. cyrus 
  3. dovecot 

7.2 修改/etc/postfix/main.cf,修改mynetworks,并在配置文件中加入sasl的支持

  
  
  
  
  1. mynetworks = 127.0.0.0/8     
  2. ######################CYRUS-SASL############################ 
  3. broken_sasl_auth_clients = yes 
  4. ######下面这个代表给mynetworks与通过sasl认证的用户中继。其它的拒绝 
  5. smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,
  6. reject_invalid_hostname,reject_non_fqdn_hostname,reject_unknown_sender_domain,
  7. reject_non_fqdn_sender,reject_non_fqdn_recipient,reject_unknown_recipient_domain,
  8. reject_unauth_pipelining,reject_unauth_destination 
  9. smtpd_sasl_auth_enable = yes       ##启用sasl 
  10. smtpd_sasl_local_domain = $myhostname   
  11. smtpd_sasl_security_options = noanonymous  ##不允许匿名 
  12. ######################CYRUS-END########################## 

7.3 修改/etc/sysconfig/saslauthd验证方法

  
  
  
  
  1. MECH=shadow      ##基于pam验证配置比较复杂,我们以shadow为例 

7.4 建立/usr/lib/sasl2/smtpd.conf  添加以下内容

  
  
  
  
  1. pwcheck_method: saslauthd  ##用sasl认证程序检查密码 
  2. mech_list: PLAIN LOGIN  

7.5 重新加载postfix,启动cyrus-sasl

  
  
  
  
  1. postfix reload 
  2. service saslauthd start 

7.6检测认证修改是否成功

7.6.1  命令测试 ##这个只能保证cyrus-sasl可以正常验证了,不能保证与postfix结合正确

  
  
  
  
  1. testsaslauthd -u redhat -p admin  
  2. 0: OK "Success." 

7.6.2 telnet测试cyrus-sasl是否与postfix结合正确

   
   
   
   
  1. [root@mail ~]# telnet 172.16.1.10 25 
  2. Trying 172.16.1.10... 
  3. Connected to mail.laoguang.me (172.16.1.10). 
  4. Escape character is '^]'. 
  5. 220 mail.laoguang.me ESMTP Postfix 
  6. auth login                          ##手动输入,意思是我要验证     
  7. 334 VXNlcm5hbWU6          ##对方的响应,不过是base64编码的 
  8. cmVkaGF0             ##这个是账号redhat通过base64编码的 echo -n "redhat" | openssl base64 
  9. 334 UGFzc3dvcmQ6            ##同样还是响应 
  10. YWRtaW4=                        ##密码 base64编码的见楼上 
  11. 235 2.7.0 Authentication successful   ##这个代表我们验证通过了 
  12.  
  13. ##下面测试通过认证后能否中继邮件 
  14. mail from:[email protected] 
  15. 250 2.1.0 Ok 
  16. rcpt to:[email protected] 
  17. 250 2.1.5 Ok 
  18. data 
  19. 354 End data with <CR><LF>.<CR><LF> 
  20. 250 2.0.0 Ok: queued as D07A1167EBC   
  21.  
  22. 由此看见服务器是给中继的。 
  23. ##下面测试不通过认证能否中继 
  24.  
  25. telnet 172.16.1.10 25 
  26. Trying 172.16.1.10... 
  27. Connected to mail.laoguang.me (172.16.1.10). 
  28. Escape character is '^]'. 
  29. 220 mail.laoguang.me ESMTP Postfix 
  30. mail from:[email protected] 
  31. 250 2.1.0 Ok 
  32. rcpt to:[email protected] 
  33. 554 5.7.1 <jerry@qq.com>: Relay access denied 
  34. ##提示不允许中继,看来设置都是正确的。 

八,Dovecot基于ssl实现pop3s,imaps

由于用户登录验证都是基于明文的,所以对用户来说加密显得非常必要,下面我们来实现dovecot基于ssl实现加密验证与传输,过程是很是简单。

8.1 为mailserver提供私钥与证书,生成过程见http://laoguang.blog.51cto.com/6013350/1035608,我们把生成的密钥证书放到/etc/dovecot目录下分别为dovecot.key,dovecot.cert

8.2 修改dovecot配置文件/etc/dovecot.conf

  
  
  
  
  1. protocols = imaps pop3s 
  2. ssl_cert_file = /etc/dovecot/dovecot.cert 
  3. ssl_key_file = /etc/dovecot/dovecot.key 

8.3 重启dovecot 查看监听端口 

  
  
  
  
  1. service dovecot restart 
  2. netstat –tnlp | grep dovecot ##查看监听的是否为995与993 

8.4 更改oe测试

直接收发信提示连接服务器失败,因为我们关闭了pop3与imap,下面设置OE为pop3s

再收发邮件测试,一切OK,你可以开个抓包工具测试是否能抓到有用的数据。

九.安装Courier authentication library

由于sasl直接调用mysql验证实现起来非常困难,而调用Courier authlib库,让它去调用mysql实现起来很是easy

9.1 下载Courier authlib ,解压

  
  
  
  
  1. wget http://ncu.dl.sourceforge.net/project/courier/authlib/0.64.0/courier-authlib-0.64.0.tar.bz2 
  2. tar xvf courier-authlib-0.64.0.tar.bz2 
  3. cd courier-authlib-0.64.0 

9.2 编译安装Couier-autlib

  
  
  
  
  1. ./configure \ 
  2.     --prefix=/usr/local/courier-authlib \ 
  3.     --sysconfdir=/etc \ 
  4.     --without-authpam \ 
  5.     --without-authshadow \ 
  6.     --without-authvchkpw \ 
  7.     --without-authpgsql \ 
  8.     --with-authmysql \ 
  9.     --with-mysql-libs=/usr/local/mysql/lib \ 
  10.     --with-mysql-includes=/usr/local/mysql/include \ 
  11.     --with-redhat \ 
  12.     --with-authmysqlrc=/etc/authmysqlrc \ 
  13.     --with-authdaemonrc=/etc/authdaemonrc \ 
  14.     --with-mailuser=postfix \ 
  15.     --with-mailgroup=postfix \ 
  16.     --with-ltdl-lib=/usr/lib \ 
  17.     --with-ltdl-include=/usr/include 

#####如果报如此错 --with-authmyql specified bu no mysqlclient.so 先把mysql的rpm卸载掉 rpm -e -nodeps msyql ,courier-authlib安装完毕后在把mysql安装上去##切记Courier-authlib安装成功够把msyql再安装回去,配置文件保留原来的,记得备份

  
  
  
  
  1. make && make install  

9.3 提供配置文件,把生成的实例配置文件改名为配置文件

  
  
  
  
  1. cp /etc/authdaemonrc.dist /etc/authdaemonrc    
  2. cp /etc/authmysqlrc.dist /etc/authmysqlrc 
  3.  
  4. ##修改配置文件/etc/authdaemonrc 
  5. authmodulelist="authmysql"  
  6. authmodulelistorig="authmysql" 
  7. daemons=5   ##修改为合适值 
  8. ##修改配置文件/etc/authmysqlrc下面内容  
  9.  
  10. MYSQL_SERVER localhost 
  11. MYSQL_PORT 3306              ##指定你的mysql监听的端口,这里使用默认的3306 
  12. MYSQL_USERNAME  extmail      ##这时为后文要用的数据库的所有者的用户名 
  13. MYSQL_PASSWORD extmail       ##数据库密码 
  14. MYSQL_SOCKET  /tmp/mysql.sock   ##mysql的套接字,我安装的mysql是/tmp/mysql.sock 
  15. MYSQL_DATABASE  extmail         ##数据库的名字 
  16. MYSQL_USER_TABLE  mailbox       ##记录用户信息的表名 
  17. MYSQL_CRYPT_PWFIELD  password   ##知道指定用户密码的列是psssword列 
  18. MYSQL_UID_FIELD  '2525'         ##填写postfix的uid  
  19. MYSQL_GID_FIELD  '2525' 
  20. MYSQL_LOGIN_FIELD  username     ##用户名在表中的列名 
  21. MYSQL_HOME_FIELD  concat('/var/mailbox/',homedir)  ##虚拟用户家目录列名 
  22. MYSQL_NAME_FIELD  name 
  23. MYSQL_MAILDIR_FIELD  concat('/var/mailbox/',maildir) ##虚拟用户邮箱所在列名 
  24.  
  25. ##一些账号密码等一定与后面建立时的一致,由于建立这些表比较复杂,我们选泽了extmail提供的模板
  26. ## 将来初始化extmail时生成表名,账号密码都与上面填写相同。 
  27.  
  28. 建立/var/mailbox并更改属主数组为postfix  
  29. mkdir /var/mailbox 
  30. chown postfix:postfix 

9.4 提供脚本

  
  
  
  
  1. cp courier-authlib.sysvinit /etc/init.d/authlibd 
  2. chmod +x /etc/init.d/authlibd 
  3. chkconfig --add authlibd 
  4. chkconfig authlibd on 

9.5 启动authlib

  
  
  
  
  1. service authlibd start  

authlib安装完毕

十.整合sasl与courier-authlib,以让postfix调用

10.1 编辑 /usr/lib/sasl2/smtpd.conf ,更改为如下内容

  
  
  
  
  1. pwcheck_method: authdaemond  ##更改sasl验证方式,由authdaemon来验证,而下面的authdaemon套接字指向的就是authlib 
  2. log_level: 3                                ##日志级别,用于排错 
  3. mech_list:PLAIN LOGIN 
  4. authdaemond_path:/usr/local/courier-authlib/var/spool/authdaemon/socket  ##套接字所在路径 
 

十一.让postfix支持虚拟用户与虚拟域

11.1 编辑/etc/postfix/main.cf 添加内容如

  
  
  
  
  1. ########################Virtual Mailbox Settings######################## 
  2.  
  3. virtual_mailbox_base = /var/mailbox                                      ##mailbox所在目录 
  4. virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf    ##虚拟邮箱映射,这些文件extmail中有模板 
  5. virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf   ##虚拟域映射 
  6. virtual_alias_domains = 
  7. virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf        ##别名映射 
  8. virtual_uid_maps = static:2525 
  9. virtual_gid_maps = static:2525 
  10. virtualvirtual_transport = virtual    
  11.  
  12. ########################Virtual Mailbox End######################## 

启用虚拟域后注销中心域中的myhostname, mydestination, mydomain, myorigin 以防与虚拟用户中的域冲突,假设你本机域为laoguang.me,虚拟域也为laoguang.me,那你说到底是哪个域?

11.2 用extmail的模板生成需要的数据库

11.2.1 下载 extmail 与extman

http://pan.baidu.com/share/link?shareid=127912&uk=2501966565

http://pan.baidu.com/share/link?shareid=127915&uk=2501966565

11.2.2  解压 extman 并用启用脚本生成数据库

  
  
  
  
  1. tar xvf extman-1.1.tar.gz  
  2. tar xvf extman-1.1.tar.gz ;cd docs; 
  3. ##由于mysql引擎定义由TYPE改为Engine所以先更改脚本extmail.sql与init.sql 
  4. sed -i 's@TYPE=MyISAM@Engine=MyISAM@g' extmail.sql 
  5. sed -i 's@TYPE=MyISAM@Engine=MyISAM@g' init.sql 

##查看是否更改成功了

----------生成数据库---------

##如果没设置mysql的root密码

  
  
  
  
  1. mysql < extmail.sql 
  2. mysql < init.sql 

###如果你的数据库root设置密码了##

  
  
  
  
  1. mysql -uroot -p  < extmail.sql 
  2. mysql -uroot -p < init.sql 

##可以去mysql中查看是否生成了extmail数据库

刚才postfix主配置文件定义了好几个映射文件也在此目录下,拷贝到/etc/postfix下

  
  
  
  
  1. cp mysql_virtual_* /etc/postfix/     ##此步容易遗忘 

11.3 授权生成的数据库给extmail用户

  
  
  
  
  1. mysql> GRANT all privileges on extmail.* TO 'extmail'@'localhost' IDENTIFIED BY 'extmail'; 
  2. mysql> GRANT all privileges on extmail.* TO 'extmail'@'127.0.0.1' IDENTIFIED BY 'extmail'; 
  3. mysql>flush privileges; 

十二.配置dovecot支持mysql

12.1 修改主配置文件 /etc/dovecot.conf

  
  
  
  
  1. mail_location = maildir:/var/mailbox/%d/%n/Maildir  
  2.  
  3. auth default {                     ##查找它 
  4.     mechanisms = plain 
  5.  
  6. #passdb pam {                  ##注销pam验证密码 
  7.  
  8. #}                                    ##注销 
  9.  
  10. #userdb passwd { 注销用户名在passwd中查询 
  11.  
  12. #}   
  13.     passdb sql {  ##启用sql的验证 
  14.         args = /etc/dovecot-mysql.conf  ##指定参数文件 
  15.     } 
  16.     userdb sql {  ##启用用户信息的sql验证 
  17.         args = /etc/dovecot-mysql.conf  ##指定参数文件 
  18.     } 

12.2 建立dovecot使用msyql的配置文件

  
  
  
  
  1. vim /etc/dovecot-mysql.conf ##内容如下 
  2.  
  3. driver = mysql 
  4. connect = host=localhost=/tmp/mysql.sock dbname=extmail user=extmail password=extmail 
  5. default_pass_scheme = CRYPT 
  6. password_query = SELECT username AS user,password AS password FROM mailbox WHERE username = '%u'                             
  7. user_query = SELECT maildir, uidnumber AS uid, gidnumber AS gid FROM mailbox WHERE username = '%u' 
  8.  
  9. ##斜体部分请更改为你mysql套接字的位置 

12.3 重启dovecot

service dovecot restart

十三.安装extmail提供webmail界面

13.1 在安装extmail之前请先安装apache,如果编译安装请参考http://laoguang.blog.51cto.com/6013350/1039208,我就以rpm安装为例了

  
  
  
  
  1. yum -y install httpd  

13.2 解压exmail并拷贝到适当目录

  
  
  
  
  1. tar zxvf extmail-1.2.tar.gz 
  2. mkdir -pv /var/www/extsuite 
  3. mv extmail-1.2 /var/www/extsuite/extmail   
  4. cp /var/www/extsuite/extmail/webmail.cf.default  /var/www/extsuite/extmail/webmail.cf 
  5.  
  6. ##因为extmail配置文件中设置它的位置在/var/www/extsuite/中, 
  7. 我们直接把它放到这个目录中,省的修改配置文件了 
  8. ##拷贝实例配置文件,建立为配置文件 

13.2 修改extmail配置文件 /var/www/exsuite/extmail/webmail.cf一下内容

  
  
  
  
  1. SYS_USER_LANG = zh_CN                 ##设置字符集中文你懂得 
  2. SYS_MAILDIR_BASE = /var/mailbox    ##邮箱目录 
  3. SYS_MYSQL_USER = extmail             ##连接mysql的用户名 
  4. SYS_MYSQL_PASS = extmail             ##连接mysql的密码 
  5. SYS_MYSQL_DB = extmail              ##数据库名字 
  6. SYS_MYSQL_SOCKET = /tmp/mysql.sock   ## msyql的套接字位置 
  7. SYS_MYSQL_HOST = localhost          ##mysql的地址 
  8. SYS_MYSQL_TABLE = mailbox          ##表名 
  9. SYS_MYSQL_ATTR_USERNAME = username   ##验证时用户名在msyql中的列名 
  10. SYS_MYSQL_ATTR_DOMAIN = domain           ##所在域在msyql中的列名 
  11. SYS_MYSQL_ATTR_PASSWD = password       ##密码在mysql中的列名 
  12. SYS_AUTHLIB_SOCKET = /usr/local/courier-authlib/var/spool/authdaemon/socket  
  13. ##验证时使用的套接字 

13.3 修改apache配置文件/etc/httpd/conf/httpd.conf  如果是编译的请自己根据自己编译的编辑配置文件。

  
  
  
  
  1. vim /etc/httpd/conf/httpd.conf 
  2.  
  3. #DocumentRoot "/var/www/html"  ##注销中心主机 281行左右 
  4. NameVirtualHost *:80         ##启用虚拟主机 基本在最后了 
  5.  
  6. ###添加以下内容#### 
  7. <VirtualHost *:80> 
  8. ServerName mail.laoguang.me 
  9. DocumentRoot /var/www/extsuite/extmail/html/ 
  10. ScriptAlias /extmail/cgi /var/www/extsuite/extmail/cgi 
  11. Alias /extmail /var/www/extsuite/extmail/html 
  12. SuexecUserGroup postfix postfix 
  13. </VirtualHost> 
  14.  
  15. ##修改 cgi执行文件属主为apache运行身份用户: 
  16. chown -R postfix.postfix /var/www/extsuite/extmail/cgi/ 
  17.  
  18. ##启动httpd  
  19. service httpd start 

登陆网页测试,发现缺少一个组件Unix::Syslog,extmail需要依赖它,下面来安装

13.4 安装Unix::Syslog

  
  
  
  
  1. wget http://mirrors.devlib.org/cpan/authors/id/M/MH/MHARNISCH/Unix-Syslog-1.1.tar.gz 
  2.  
  3. ##如果链接哪天失效了请去 http://http://search.cpan.org/ 搜索下载 
  4.  
  5. tar xvf Unix-Syslog-1.1.tar.gz  
  6. cd Unix-Syslog-1.1 
  7. perl Makefile.PL 
  8. make && make install 
  9.  

 ##再次访问网页172.16.1.10发现无码的世界确实不错,不过还不能管理注册管理账户

十四,安装extman,支持邮箱管理

14.1 安装配置extman

前面已经解压并使用过extman了 直接移过去吧

  
  
  
  
  1. mv extman-1.1 /var/www/extsuite/extman 
  2. cp /var/www/extsuite/extman/webman.cf.default  /var/www/extsuite/extman/webman.cf 
  3. ##实例文件拷贝为配置文件 
  4.  
  5. ##编辑配置文件vi /var/www/extsuite/extman/webman.cf 调整以下参数,其它的符合要求 
  6. SYS_MAILDIR_BASE = /var/mailbox    ##邮箱目录 
  7. SYS_CAPTCHA_ON = 0   ##是否使用验证码,暂不使用,需要额外组建支持 
  8. SYS_DEFAULT_UID = 2525               
  9. SYS_DEFAULT_GID = 2525 
  10. SYS_MYSQL_USER = extmail           ##数据库账号 
  11. SYS_MYSQL_PASS = extmail           ##密码 
  12. SYS_MYSQL_SOCKET = /tmp/mysql.sock   ##mysql套接字 

14.2 修改extman中cgi的属组属主并编辑httpd.conf

  
  
  
  
  1. chown -R postfix.postfix /var/www/extsuite/extman/cgi/ 

在apache的主配置文件中Extmail的虚拟主机部分,添加如下两行:

  
  
  
  
  1. ScriptAlias /extman/cgi /var/www/extsuite/extman/cgi 
  2. Alias /extman /var/www/extsuite/extman/html 

根据配置文件创建extman运行时所需的临时目录,并修改其相应的权限:

  
  
  
  
  1. mkdir  -pv  /tmp/extman 
  2. chown postfix.postfix  /tmp/extman 

14.3 登陆管理首页发现缺少一个DBD组件,它是perl-DBD-MySQL,安装它

到此为止你可以登陆并管理这个webmail了,登陆管理页面输入默认管理账号:[email protected] 密码:extmail*123*

新建一个域,如ibm.com

建立完毕后点击那个铅笔按钮,修改可以自由注册,建立时勾选的不生效。

新建两个账户extmail测试收发邮件.

由此可见webmail收发邮件正常,再来测试OE客户端收发邮件,因为他们的验证流程不一样,不记得了看最上面的原理图.

工具--账户--添加--邮件--显示名 linux --pop3 172.16.1.10 smtp 172.16.1.10 --账户名 [email protected] 密码 admin --完成

给自己发送一封邮件测试

看来整个过程是都是正确,下面再来完善一下,以为登陆Extmail管理后台发现状态没有日志,下面来开启日志,但是日志功能却依赖了好几个包。

十五.配置Mailgraph_ext,使用Extman的图形日志

15.1 安装图形日志的运行所需要的软件包Time::HiRes、File::Tail和rrdtool,其中前两个包您可以去http://search.cpan.org搜索并下载获得,后一个包您可以到 http://oss.oetiker.ch/rrdtool/pub/?M=D下载获得; 注意安装顺序不能改换。

15.3 安装Time::HiRes

  
  
  
  
  1. tar zxvf Time-HiRes-1.9707.tar.gz 
  2. cd Time-HiRes-1.9707 
  3. perl Makefile.PL 
  4. make 
  5. make test 
  6. make install 

15.4 安装File::Tail

  
  
  
  
  1. tar zxvf File-Tail-0.99.3.tar.gz 
  2. cd File-Tail-0.99.3 
  3. perl Makefile 
  4. make 
  5. make test 
  6. make install 

15.5 安装rrdtool-1.2.23

  
  
  
  
  1. tar zxvf rrdtool-1.2.23.tar.gz 
  2. cd rrdtool-1.2.23 
  3. ./configure --prefix=/usr/local/rrdtool 
  4. make 
  5. make install 

15.6 创建必要的符号链接(Extman会到这些路径下找相关的库文件)

  
  
  
  
  1. ln -sv /usr/local/rrdtool/lib/perl/5.8.8/i386-linux-thread-multi/auto/RRDs/RRDs.so  \
  2.  /usr/lib/perl5/5.8.8/i386-linux-thread-multi/ 
  3. ln -sv /usr/local/rrdtool/lib/perl/5.8.8/RRDp.pm   /usr/lib/perl5/5.8.8 
  4. ln -sv /usr/local/rrdtool/lib/perl/5.8.8/i386-linux-thread-multi/RRDs.pm  \
  5.  /usr/lib/perl5/5.8.8 

15.7 启动mailgraph图形化

  
  
  
  
  1. ##复制mailgraph_ext到/usr/local,并启动之 
  2. cp -r /var/www/extsuite/extman/addon/mailgraph_ext  /usr/local   
  3. /usr/local/mailgraph_ext/mailgraph-init start  
  4. ##启动cmdserver(在后台显示系统信息)  
  5. /var/www/extsuite/extman/daemon/cmdserver --daemon 

15.8 添加到开机启动

  
  
  
  
  1. echo “/usr/local/mailgraph_ext/mailgraph-init start” >> /etc/rc.d/rc.local 
  2. echo “/var/www/extsuite/extman/daemon/cmdserver -v -d” >> /etc/rc.d/rc.local 

到此图形日志已经可以实现了,发一些邮件,过几分钟查看日志,到此postfix基本配置完毕了,有时间再尝试与与maildrop,与反病毒垃圾软件结合实现过滤功能。

 

后记:理解了邮件收发的整个过程后配置这个邮件系统并不困难,尤其是那幅流程图要深入了解,出现问题后再结合日志基本能确定问题所在,由于整个的软件很多,所以配置时要万般小心,有时候一个空格可能导致不能正常运行,要按着流程慢慢来,细心点配置成功难度不是很高,另外再次郑重说明请把你的SElinux关了,最后感谢马老师。

你可能感兴趣的:(postfix,webmail,mailserver)