构建Postfix邮件服务器

构建Postfix邮件服务器(一)

电子邮件系统概述

邮件系统角色

在Internet中,电子邮件系统并不是一个孤立的体系,除了需要DNS服务提供邮件域名的解析,可以使用Web服务提供用户界面以外,邮件系统的内部也是由不同的软件程序组成的。

  • MTA 邮件传输代理

  • 负责接受客户端邮件,并将其传输给其他的MTA。MTA是电子邮件系统的核心部分。例如Sendmail,Postfix和Exchange。

  • MDA 邮件分发代理

  • 负责在服务器中将邮件分发到用户邮箱。有些MTA集成MDA功能。例如Exchange。

  • MUA 邮件用户代理

  • 负责提供邮件阅读,撰写,发送,接收等管理界面。例如Mutt,Pine等。

邮件系统协议

  • RFC822

  • 电子邮件报文格式,规定了电子邮件由邮件头和邮件内容两个部分组成。

  • SMTP

  • 发送和传输电子邮件。MUA使用SMTP协议将邮件发送给MTA,MTA使用SMTP协议将邮件传输给其他的MTA。SMTP协议使用端口TCP 25,发信认证部分被称为ESMTP。

  • POP3

  • 从邮件服务器获取邮件,然后在离线处理邮件。POP3协议使用端口TCP 110。

  • IMAP4

  • 以联机的方式处理邮件,可以选择性下载邮件。IMAP4协议使用端口TCP 143。

  • MIME

  • 现代邮件传输格式,让电子邮件具备传输二进制文件的能力。

邮件服务器软件

  • Exchange

  • 微软的企业电子邮件方案,多用于企业环境。

  • Notes/Domino

  • 由Lotus公司开发的电子邮件产品,后被IBM收购,多用于政府机构,银行等大型机构。

  • Sendmail

  • 最早的Unix/Linux电子邮件系统。配置相对复杂,安全性欠佳。

  • Qmail

  • 易于二次开发的Unix/Linux电子邮件系统。企业按照自己的需求,修改Qmail的源代码实现特定的功能。

  • Postfix

  • Sendmail的替代品。

Postfix基础

Postfix 采用模块化设计,由不同的程序实现不同的功能。Postfix的主进程名为 master ,由主进程根据需求启动其他程序协同处理邮件。

Postfix可以直接使用本地系统用户作为邮件用户,也可以使用虚拟用户。虚拟用户帐号信息通常存储在MySQL数据库中。

 wget http://www.postfix.cn/source/official/postfix-2.7.3.tar.gz
 wget http://vda.sourceforge.net/VDA/postfix-vda-2.7.2.patch

编译安装Postfix

  • 预处理 

    service sendmail stop
    rpm -qa | grep sendmail | xargs rpm -e --nodeps
  • 创建服务用户和组 

    groupadd -g 1200 postdrop
    groupadd -g 1000 postfix
    useradd -M -u 1000 -g postfix -G postdrop -s /sbin/nologin postfix
  • 解压源码包 

    tar zxvf postfix-2.7.3.tar.gz
    cd postfix-2.7.3
    patch -Np1 < ../postfix-vda-2.7.2.patch
  • 配置源码包 

    yum install db4-devel
    yum install cyrus-sasl-devel

    rpm -ivh /media/cdrom/Server/db4-devel-4.3.29-9.fc6.i386.rpm
    rpm -ivh /media/cdrom/Server/cyrus-sasl-devel-2.1.22-4.i386.rpm
    make makefiles 'CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include/ -DUSE_CYRUS_SASL -DUSE_SASL_AUTH -I/usr/include/sasl' 'AUXLIBS=-L/usr/local/mysql/lib/ -lmysqlclient -lm -lz -L/usr/lib/sasl2 -lsasl2'
  • 编译并安装 

    vim /etc/ld.so.conf
    /usr/local/mysql/lib/
    ldconfig -v
    make && make install

Postfix目录

  • /etc/postfix/

  • 主配置目录,包含主配置文件,各类脚本,查询表等。

    • /etc/postfix/main.cf

    • 主配置文件

    • /etc/postfix/master.cf

    • master程序配置文件

  • /usr/libexec/postfix/

  • 服务器程序目录

  • /var/spool/postfix/

  • 邮件队列相关目录

    • /var/spool/postfix/incoming/

    • 传入队列

    • /var/spool/postfix/active/

    • 活动队列

    • /var/spool/postfix/deferred/

    • 推迟队列

    • /var/spool/postfix/hold/

    • 约束队列

    • /var/spool/postfix/corrupt/

    • 错误队列

  • /usr/sbin/

  • 服务管理程序目录

    • /usr/sbin/postalais

    • 用于构造,修改和查询别名表

    • /usr/sbin/postconf

    • 用于显示和编辑主配置文件

    • /usr/sbin/postfix

    • 用于启动和停止postfix服务

    • /usr/sbin/postmap

    • 用于构造,修改或查询查询表

    • /usr/sbin/postqueue

    • 用于一般用户管理邮件队列

    • /usr/sbin/postsuper

    • 用于超级用户管理邮件对列

Postfix配置文件

Postfix系统最主要的配置文件包括: /etc/postfix/main.cf 和 /etc/postfix/master.cf 。

/etc/postfix/main.cf 是Postfix服务的主配置文件。 /etc/postfix/main.cf 是master程序配置文件。

/etc/postfix/main.cf 配置项有300多个,大部分配置都设置了默认值。大多数时候只需要配置少数几个参数,就可以满足一般邮件服务器的要求。

Postfix系统提供了 postconf 工具用来辅助配置,不带任何选项的postconf命令将显示当前Postfix服务所使用的配置参数, -n 选项则显示不同于默认配置的参数。

postconf
postconf -n

邮件管理员经常使用postconf命令简化 /etc/postfix/main.cf 文件,只保留与默认配置不同的参数,提高主配置文件的易读性。

cd /etc/postfix/
postconf -n > new.cf
cp main.cf main.cf.bak
mv new.cf main.cf
cat main.cf

Postfix日志文件

Postfix系统的日志文件位于 /var/log/maillog 文件中,该文件记录了Postfix服务器运行状态信息。在安装调试Postfix邮件系统及日常维护过程中,经常会使用 tail 命令带 -f 选项实时观察日志内容变化。

tail -f /var/log/maillog

如果日志内容较多,还可以使用 egrep 命令进行过滤,只关注包含 reject warning error fatalpanic 等比较重要的事件记录。

egrep '(reject|warning|error|fatal|panic):' /var/log/maillog

Postfix启动控制

Postfix服务的启动控制主要通过 /usr/sbin/postfix 命令来完成。

postfix (start|stop|check|reload)
postfix start
netstat -antpl | grep :25

基于Postfix构建简单电子邮件系统

构建基本发信,收信服务器的配置和测试。

构建Postfix邮件服务器_第1张图片

  • IP地址

  • 192.168.1.n

  • 邮件域

  • benet99.com

  • 主机名

  • mail.benet99.com

  • 邮件账号

  • test

  • POP3/IMAP4服务

  • dovecot

  • LAMP平台

  • /usr/local/apache2/ /usr/local/mysql/ /usr/local/php5

  • 域名服务器

  • 192.168.1.100

配置并测试Postfix服务器

Postfix主要提供基于SMTP协议的发信服务,其最基本的功能就是存储和发送邮件。

  • 修改主配置文件 
    Postfix主配置文件内不能使用 单引号 或 双引号 。

    vim /etc/postfix/main.cf

    内容为:

    command_directory = /usr/sbin
    config_directory = /etc/postfix
    daemon_directory = /usr/libexec/postfix
    data_directory = /var/lib/postfix
    debug_peer_level = 2
    home_mailbox = Maildir/                 //指定邮件存储目录
    html_directory = no
    mail_owner = postfix
    mailq_path = /usr/bin/mailq
    manpage_directory = /usr/local/man
    mydestination = $mydomain, $myhostname  //指定接收邮件域名
    mydomain = benet.com                    //指定邮件域名
    myhostname = mail.benet.com             //指定邮件主机名
    myorigin = $mydomain                    //指定发送邮件域名
    newaliases_path = /usr/bin/newaliases
    queue_directory = /var/spool/postfix
    readme_directory = no
    sample_directory = /etc/postfix
    sendmail_path = /usr/sbin/sendmail
    setgid_group = postdrop
    unknown_local_recipient_reject_code = 550

    用户的邮箱空间用于保存各自的电子邮件内容。在Postfix服务器中,支持两种邮箱存储方式。

    postfix reload
    netstat -antpl | grep :25
    • Mailbox

    • 所有邮件存储在同一个文件内,默认是 /var/spool/mail/username ,每个邮件之间以特定的标记分割。

    • Maildir/

    • 使用目录结构来存储,每一封邮件保存成一个文件,每个文件名称一般有一定的规律,例如会包含时间戳、pid及inode节点号等每一封邮件作为一个独立的文件保存。

  • 添加邮件用户账号 
    使用Linux系统账号发送邮件。

构建Dovecot服务器

Dovecot是一个安全性较好的POP3/IMAP服务器软件,响应速度快且扩展性好。Dovecot默认使用Linux系统用户,通过PAM方式进行身份验证。

  • 下载软件 

    wget http://www.dovecot.org/releases/2.0/dovecot-2.0.11.tar.gz
  • 预处理 

    useradd -M -s /sbin/nologin dovecot
    useradd -M -s /sbin/nologin dovenull
  • 解压源码包 

    tar zxvf dovecot-2.0.11.tar.gz
    cd dovecot-2.0.11
  • 安装PAM开发包 

    yum install pam-devel

    rpm -ivh /media/cdrom/Server/pam-devel-0.99.6.2-3.27.el5.i386.rpm
  • 配置编译安装 

    ./configure --sysconfdir=/etc --with-mysql --with-pam
    make && make install
  • 修改配置文件 

    vim /etc/dovecot/dovecot.conf

    内容为:

    ssl = no
    protocols = pop3 imap
    disable_plaintext_auth = no
    mail_location = maildir:~/Maildir
    passdb {
      driver = pam
    }
    userdb {
      driver = passwd
    }
  • 检查配置文件 

    doveconf -n
  • 编辑PAM文件 

    cp ~/dovecot.pam /etc/pam.d/dovecot

    vim /etc/pam.d/dovecot

    内容为:

    #%PAM-1.0
    auth       include      system-auth
    account    include      system-auth
    password   include      system-auth
    session    include      system-auth
  • 添加为系统服务 

    cp ~/dovecot.server /etc/init.d/dovecot
    chmod a+x /etc/init.d/dovecot
    chkconfig --add dovecot
    chkconfig dovecot on
  • 启动服务 

    service dovecot start
    netstat -antpl | grep dovecot
  • POP3接收邮件测试 

    telnet localhost 110
    user leiyue
    pass pwd@123
    list
    retr 1
    quit

使用Outlook Express邮件客户端

此处省略xxxx字。

扩展Postfix邮件系统的功能

WEBMAIL邮件界面

Webmail是指提供给邮件用户发信收信的Web界面。通过访问邮件系统提供的Web界面,可以和邮件客户端软件实现相同的邮件管理功能。使用Webmail简单,便捷,在Internet邮件服务中得到了广泛的应用。

Postfix邮件系统支持多种Webmail,例如:OpenWebmail,Extmail,SquirreMail等。

构建Postfix邮件服务器_第2张图片

  • 下载软件包 

    wget http://downloads.sourceforge.net/project/squirrelmail/stable/1.4.21/squirrelmail-1.4.21.tar.bz2
    wget http://downloads.sourceforge.net/project/squirrelmail/locales/1.4.18-20090526/zh_CN-1.4.18-20090526.tar.gz
  • 解压软件包 

    tar jxvf squirrelmail-1.4.21.tar.bz2 -C /usr/local/apache2/htdocs/
    mv /usr/local/apache2/htdocs/squirrelmail-1.4.21 /usr/local/apache2/htdocs/webmail
    cd /usr/local/apache2/htdocs/webmail
    tar zxvf ~/zh_CN-1.4.18-20090526.tar.gz
  • 调整权限设置 

    mkdir -p attach data
    chown -R daemon:daemon attach/ data/
    chmod 730 attach/
  • 修改配置文件 

    cp config/config_default.php config/config.php
    vim config/config.php

    修改以下内容:

    $domain = 'benet.com';
    $smtpServerAddress = 'localhost';
    $smtpPort = 25;
    ……    
    $imapServerAddress = 'localhost';
    $imapPort = 143;
    $imap_server_type = 'dovecot';
    ……
    $data_dir = '/usr/local/apache2/htdocs/webmail/data/';
    $attachment_dir = '/usr/local/apache2/htdocs/webmail/attach/';
    ……
    $squirrelmail_default_language = 'zh_CN';
    $default_charset = 'zh_CN.UTF-8';
  • 启动Web服务访问Webmail 
    访问 http://www.benet.com/webmail/ 。

设置SMTP的用户认证

SMTP发信认证是避免被人当作垃圾发送邮件服务器的必要措施。当用户通过SMTP协议向外部邮件域发送邮件时,服务器要求用户提供用户名和密码进行身份烟长。只有通过身份验证的用户才被允许发送外部邮件,否则将拒绝发信。

在Postfix邮件系统中,可以使用Cyrus SASL软件来实现基本的SMTP认证机制。

rpm -qa | grep cyrus
cyrus-sasl-2.1.22-4
cyrus-sasl-lib-2.1.22-4
cyrus-sasl-devel-2.1.22-4
cyrus-sasl-plain-2.1.22-4
  • 设置Cyrus SASL函数库 

    vim /usr/lib/sasl2/smtpd.conf

    内容为:

    pwcheck_method:saslauthd
  • 启动saslauthd服务 

    service saslauthd start
    chkconfig saslauthd on
  • 修改主配置文件 

    vim /etc/postfix/main.cf

    内容为:

    command_directory = /usr/sbin
    config_directory = /etc/postfix
    daemon_directory = /usr/libexec/postfix
    data_directory = /var/lib/postfix
    debug_peer_level = 2
    home_mailbox = Maildir/
    html_directory = no
    mail_owner = postfix
    mailq_path = /usr/bin/mailq
    manpage_directory = /usr/local/man
    mydestination = $mydomain, $myhostname
    mydomain = benet.com
    myhostname = mail.benet.com
    myorigin = $mydomain
    newaliases_path = /usr/bin/newaliases
    queue_directory = /var/spool/postfix
    readme_directory = no
    sample_directory = /etc/postfix
    sendmail_path = /usr/sbin/sendmail
    setgid_group = postdrop
    smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination //指定smtpd允许和拒绝条件
    smtpd_sasl_auth_enable = yes               //指定smtpd认证方式
    smtpd_sasl_security_options = noanonymous  //拒绝匿名用户访问
    unknown_local_recipient_reject_code = 550
  • 测试SMTP发信认证 
    添加了SMTP发信认证就不能作为发信服务器发送邮件。

    • 使用密文测试SMTP发信认证 

      telnet localhost 25
      Trying 127.0.0.1...
      Connected to localhost.localdomain (127.0.0.1).
      Escape character is '^]'.
      220 mail.benet.com ESMTP Postfix
      helo localhost
      250 mail.benet.com
      mail from: [email protected]
      250 2.1.0 Ok
      rcpt to: [email protected]
      554 5.7.1 <[email protected]>: Relay access denied
      quit
      221 2.0.0 Bye
      Connection closed by foreign host.
      telnet localhost 25
      Trying 127.0.0.1...
      Connected to localhost.localdomain (127.0.0.1).
      Escape character is '^]'.
      220 mail.benet.com ESMTP Postfix
      helo localhost
      250 mail.benet.com      
      auth login
      334 VXNlcm5hbWU6
      bGVpeXVl
      334 UGFzc3dvcmQ6
      cHdkQDEyMw==
      235 2.7.0 Authentication successful
      mail from: [email protected]
      250 2.1.0 Ok
      rcpt to: [email protected]
      250 2.1.5 Ok
      data
      354 End data with <CR><LF>.<CR><LF>
      subject: test mail
      from: [email protected]
      to: [email protected]
      
      this is a test mail for [email protected]
      .
      250 2.0.0 Ok: queued as 869682F408
      quit
      221 2.0.0 Bye
      Connection closed by foreign host.
    • 获得用户名和密码的加密密文 

      printf "leiyue" | openssl base64

      命令结果为:

      bGVpeXVl
      printf "pwd@123" | openssl base64

      命令结果为:

      cHdkQDEyMw==

设置用户别名与邮件群组

邮件别名是邮件系统的重要功能,主要来实现邮件的群发。邮件别名依赖于 aliases 机制,需要用到查询表。

  • Postfix查询表 
    Postfix服务器在处理邮件的过程中经常需要做各种转换和查询,需要使用查询表/etc/aliases 来完成。

    postconf | grep aliases
    alias_database = hash:/etc/aliases
    alias_maps = hash:/etc/aliases, nis:mail.aliases
  • 设置邮件别名实现群发 
    修改别名表。

    vim /etc/aliases

    添加以下内容:

    root:    leiyue
    hr:      leiyue

    使用 newaliases 命令生成 /etc/aliases.db 数据库文件。Postfix系统将识别并使用/etc/aliases.db 文件中的设置。

    newaliases

设置邮件大小,邮箱空间限制

  • 限制用户发送邮件大小 
    Postfix系统默认支持10MB大小的邮件,需要注意的是这里的大小是经过Base64函数编码后的邮件大小。

    postconf | grep message_size_limit
    message_size_limit = 10240000

    修改发送邮件的默认大小为20MB。

    vim /etc/postfix/main.cf

    添加以下内容:

    message_size_limit = 20480000
    postfix reload
  • 限制用户邮箱空间大小 
    在Postfix邮件系统中,根据邮件用户的类型,邮件存储的方式不同,可以采取不同的方法来限制用户邮箱空间大小。

    • 使用 quota 磁盘配额 
      主要针对使用系统用户的情况,可以直接使用Linux的磁盘配额功能。对使用Mailbox和Maildir存储方式的用户都生效。

    • 使用 virtualmailboxlimit 配置项 
      主要针对使用虚拟用户的情况,默认限制50MB。安装VDA补丁后,该参数对使用Mailbox或Maildir存储方式的用户都生效。

      postconf | grep virtual_mailbox_limit
      virtual_mailbox_limit = 51200000
      virtual_mailbox_limit_inbox = no
      virtual_mailbox_limit_maps = 
      virtual_mailbox_limit_override = no
    • 使用 mailboxsizelimit 配置项 
      主要针对使用系统用户的情况,默认限制是50MB。该参数对使用Mailbox邮件存储方式的用户生效。

      postconf | grep mailbox_size_limit
      mailbox_size_limit = 51200000

构建Postfix邮件服务器(二)

配置Postfix支持虚拟用户

当邮件用户达到一定数量时,邮件系统将在用户安全,系统管理以及数据维护等方面遇到巨大的挑战。为了提供更好的性能,效率和安全性,使用虚拟邮件用户将是一个更好的选择。

建立虚拟用户数据库

ExtMail是由国内开源组织使用Perl语言开发的一套功能强大的中文Webmail平台,主要包括ExtMail和Extman两个部分的程序套件。

  • ExtMail

  • 提供给邮件用户使用邮件系统的Web界面

  • Extman

  • 提供给邮件系统管理员管理邮件系统的Web界面

访问站点 http://www.extmail.org/cgi-bin/download.cgi 下载软件包ExtMail和Extman最新版。

使用 Extman 虚拟邮件管理系统在MySQL数据库中建立初始化数据库和表,用于保存虚拟邮件域,虚拟邮件用户相关信息。

service mysqld restart
tar zxvf extman-1.1.tar.gz 
cd extman-1.1/docs
mysql -u root -p < extmail.sql

由于数据库版本不同,导入 extmail.sql 数据库时报错:

ERROR 1064 (42000) at line 50: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TYPE=MyISAM COMMENT='Ext/Webman - Admin Accounts'' at line 15

用文本编辑器打开extmail.sql,将数据库文件内的所有 TYPE=MyISAM 替换为 ENGINE=MyISAM ,保存退出。

丢弃导入到一半出错的数据库 extmail 。

mysql -u root -p
mysql> drop database extmail;

重新导入数据库。

mysql -u root -p < extmail.sql
mysql -u root -p < init.sql

脚本 extmail.sql 完成的主要数据库操作:

  1. 创建名为 extmail 的数据库,初始化一些表。

  2. 创建数据库用户 extmail@localhost ,密码为 extmail ,对数据库extmail的表有select,update权限。

  3. 创建数据库用户 webman@localhost ,密码为 extman ,对数据库extmail表有select,insert,delete,update权限。

脚本 init.sql 完成的主要数据库操作:

  1. 初始化数据库 extmail

  2. 建立名为 extmail.org 的虚拟邮件域

  3. 建立数据库用户 [email protected] ,密码为 extman*123* ,作为邮件域的管理账号。

  4. 建立数据库用户 [email protected] ,密码为 extmail ,作为基本邮件用户。

修改Postfix配置

使用虚拟邮件域时,其中邮件域名,邮件用户名,密码及邮件别名等信息都存储在MySQL数据库中。当Postfix接收到一封新邮件时,首先检查是不是发往本地域的邮件,如果不是则转向数据库查询是不是发往虚拟域的邮件,确认收件人是否存在、用户邮箱路径等信息。

了解当前的Postfix系统是否支持MySQL数据库。

postconf -m | grep mysql

修改Postfix的主配置文件,添加虚拟邮件用户配置项。

vim /etc/postfix/main.cf

修改以下内容:

……
# mydestination = $mydomain, $myhostname
……
virtual_mailbox_base = /var/mailbox
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_uid_maps = static:1000
virtual_gid_maps = static:1000

各配置项具体作用如下:

  • virtual_mailbox_base

  • 指定虚拟邮箱存储目录

  • virtual_alias_maps

  • 指定虚拟邮件用户对应别名

  • virtual_mailbox_maps

  • 指定记录虚拟邮箱和存储位置的对应关系

  • virtual_mailbox_domains

  • 设置Postfix服务器可以接收的虚拟邮件域域名

  • virtual_uid_maps

  • 设置所有虚拟邮件用户映射用户的UID号

  • virtual_gid_maps

  • 设置所有虚拟邮件用户映射组的GID号

将extman提供的虚拟用户映射表文件复制到Postfix的配置目录中。

cp *.cf /etc/postfix/

为虚拟用户设置SMTP发信认证

由于虚拟邮件用户的账号信息保存在MySQL数据库中,仅仅使用Cyrus SASL已经无法完成SMTP发信认证,这时需要结合Courier-authlib的 authdaemond 服务才能提供基于MySQL数据库虚拟用户的SMTP发信认证。

构建Postfix邮件服务器_第3张图片

  • 下载源码包 

    wget http://downloads.sourceforge.net/project/courier/authlib/0.63.0/courier-authlib-0.63.0.tar.bz2
  • 解压源码包 

    tar jxvf courier-authlib-0.63.0.tar.bz2
    cd courier-authlib-0.63.0
  • 安装expat软件包 

    yum install expect

    rpm -ivh /media/cdrom/Server/expat-1.95.8-8.2.1.i386.rpm
  • 卸载MySQL的rpm包 

    rpm -e mysql
  • 配置软件包 

    ./configure --prefix=/usr/local/courier-authlib --sysconfdir=/etc --without-stdheaderdir --with-authmysql --with-redhat --with-mysql-libs=/usr/local/mysql/lib --with-mysql-includes=/usr/local/mysql/include
  • 编译安装 

    make && make install
  • 生成配置文件 

    make install-configure
  • 修改SMTP发信认证配置 

    • 修改SMTP发信认证配置 

      vim /usr/lib/sasl2/smtpd.conf

      内容为:

      pwcheck_method:authdaemond
      authdaemond_path:/usr/local/courier-authlib/var/spool/authdaemon/socket
    • 启动authdaemond服务 

      service authdaemond start
      chkconfig --add authdaemond
      chkconfig authdaemond on
    • 添加authdaemond为系统服务 

      cp ~/courier-authlib-0.63.0/courier-authlib.sysvinit /etc/init.d/authdaemond
      chmod a+x /etc/init.d/authdaemond
    • 设置authdaemond数据库配置 

      cp authmysqlrc authmysqlrc.bak
      grep -v "^#" authmysqlrc | grep -v "^$" > newauthmysqlrc
      mv newauthmysqlrc authmysqlrc
      vim authmysqlrc

      内容为:

      MYSQL_SERVER        localhost
      MYSQL_USERNAME      extmail
      MYSQL_PASSWORD      extmail
      MYSQL_SOCKET        /tmp/mysql.sock
      MYSQL_PORT          0
      MYSQL_OPT           0
      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_NAME_FIELD    name
      MYSQL_MAILDIR_FIELD concat('/var/mailbox/', maildir)
    • 设置authdaemon服务目录权限 

      chmod 755 /usr/local/courier-authlib/var/spool/authdaemon
    • 修改authdaemond主配置文件 

      cd /etc/authlib/
      cp authdaemonrc authdaemonrc.bak
      grep -v "^#" authdaemonrc | grep -v "^$" > newauthdaemonrc
      mv newauthdaemonrc authdaemonrc
      vim authdaemonrc

      内容为:

      authmodulelist="authmysql"
      authmodulelistorig="authmysql"
      daemons=5
      authdaemonvar=/usr/local/courier-authlib/var/spool/authdaemon
      DEBUG_LOGIN=0
      DEFAULTOPTIONS=""
      LOGGEROPTS=""
    • 验证库文件路径 

      ldconfig -v | grep -A 9 courier-authlib

      命令结果为:

      /usr/local/courier-authlib/lib/courier-authlib:
          libcourierauthsasl.so -> libcourierauthsasl.so.0
          libauthuserdb.so -> libauthuserdb.so.0
          libcourierauth.so -> libcourierauth.so.0
          libauthcustom.so -> libauthcustom.so.0
          libauthmysql.so -> libauthmysql.so.0
          libauthpipe.so -> libauthpipe.so.0
          libcourierauthcommon.so -> libcourierauthcommon.so.0
          libauthpam.so -> libauthpam.so.0
          libcourierauthsaslclient.so -> libcourierauthsaslclient.so.0
    • 添加库文件路径 

      echo "/usr/local/courier-authlib/lib/courier-authlib" >> /etc/ld.so.conf

修改Dovecot的配置

  • 启用Dovecot的数据库认证 

    vim /etc/dovecot/dovecot.conf

    内容为:

    ssl = no
    protocols = pop3 imap
    disable_plaintext_auth = no
    mail_location = maildir:~/Maildir
    passdb {
      args = /etc/dovecot/dovecot-mysql.conf.ext
      driver = sql
    }
    userdb {
      args = /etc/dovecot/dovecot-mysql.conf.ext
      driver = sql
    }
  • 建立数据库查询配置文件 

    vim /etc/dovecot/dovecot-mysql.conf.ext

    内容为:

    driver = mysql
    connect = host=localhost dbname=extmail user=extmail password=extmail
    default_pass_scheme = CPYPT
    password_query = select username as user, password from mailbox where username = '%u'
    user_query = select maildir, uidnumber as uid, gidnumber as gid from mailbox where username = '%u'
  • 调整默认邮件存储目录权限 

    mkdir -p /var/mailbox/extmail.org/postmaster/Maildir/
    chown -R postfix:postfix /var/mailbox

测试虚拟用户

  • 测试authdaemond服务 

    /usr/local/courier-authlib/sbin/authtest -s login [email protected] extmail

    命令结果为:

    Authentication succeeded.
    
         Authenticated: [email protected]  (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)
  • 测试虚拟用户的发信认证 

    printf "[email protected]" | openssl base64

    命令结果为:

    cG9zdG1hc3RlckBleHRtYWlsLm9yZw==
    printf "extmail" | openssl base64

    命令结果为:

    ZXh0bWFpbA==
    telnet localhost 25
    Trying 127.0.0.1...
    Connected to localhost.localdomain (127.0.0.1).
    Escape character is '^]'.
    220 mail.benet.com ESMTP Postfix
    auth login
    334 VXNlcm5hbWU6
    cG9zdG1hc3RlckBleHRtYWlsLm9yZw==
    334 UGFzc3dvcmQ6
    ZXh0bWFpbA==
    235 2.7.0 Authentication successful

ExMail邮件使用及管理平台

部署ExtMail邮件使用界面

  • 安装Perl支持包 

    cpan
    cpan> install Unix::Syslog
    cpan> install DBI
    cpan> install DBD::mysql
  • 安装并配置ExtMail套件 

    • 登录并使用ExtMail邮件系统 
      访问 http://mail.benet.com 。

    • 重启httpd服务 

      /usr/local/apache2/bin/apachectl restart
    • 编译安装httpd服务的 mod_suexec 模块 

      cd /usr/src/httpd-2.2.17/
      ./configure --enable-suexec -with-suexec-caller=daemon
      make suexec
      make install-suexec
      cd modules/generators/
      /usr/local/apache2/bin/apxs -c mod_suexec.c
      /usr/local/apache2/bin/apxs -i -a -n suexec ./.libs/mod_suexec.so
    • 调整httpd服务配置 

      vim /usr/local/apache2/conf/httpd.conf

      修改以下内容:

      ……
      LoadModule suexec_module    modules/mod_suexec.so
      
      NameVirtualHost     192.168.1.103
      <VirtualHost 192.168.1.103>
          ServerName  mail.benet.com
          DocumentRoot    /usr/local/apache2/htdocs/extmail/html
          ScriptAlias /extmail/cgi /usr/local/apache2/htdocs/extmail/cgi
          Alias       /extmail /usr/local/apache2/htdocs/extmail/html
          SuexecUserGroup postfix postfix
      </VirtualHost>
    • 建立ExtMail配置文件 

      cp webmail.cf.default webmail.cf
      vim /usr/local/apache2/htdocs/extmail/webmail.cf

      修改以下内容:

      SYS_CONFIG = /usr/local/apache2/htdocs/extmail/
      SYS_LANGDIR = /usr/local/apache2/htdocs/extmail/lang
      SYS_TEMPLDIR = /usr/local/apache2/htdocs/extmail/html
      ……
      SYS_MAILDIR_BASE = /var/mailbox
      SYS_AUTH_SCHEMA = virtual
      SYS_CRYPT_TYPE = md5crypt
      SYS_MYSQL_USER = extmail
      SYS_MYSQL_PASS = extmail
      SYS_MYSQL_DB = extmail
      SYS_MYSQL_HOST = localhost
      SYS_MYSQL_SOCKET = /tmp/mysql.sock
      ……
      SYS_AUTHLIB_SOCKET = /usr/local/courier-authlib/var/spool/authdaemon/socket
      ……
    • 调整cgi目录权限 

      chown -R postfix:postfix cgi
    • 解压源码包 

      tar zxvf extmail-1.2.tar.gz -C /usr/local/apache2/htdocs/
      mv /usr/local/apache2/htdocs/extmail-1.2 /usr/local/apache2/htdocs/extmail
      cd /usr/local/apache2/htdocs/extmail

部署ExtMail Web管理界面

部署好ExtMail程序套件后,电子邮件用户可以通过Web界面登录和使用邮件服务。但邮件域名为extmail.org,还需要安装Extman程序套件,通过Web界面对ExtMail邮件系统进行管理。

  • 安装gd-devel软件包 

    • 使用YUM安装gd-devel软件包 

      yum install gd-devel -y
    • 配置YUM支持DVD源 

      cp ~/cdrom.repo /etc/yum.repos.d/
      yum update
  • 安装Perl支持包 
    如果不安装 gd-devel 软件包,安装Perl支持包的过程中会出现找不到 gdlib-config 命令的错误。

    cpan
    cpan> install GD
    cpan> install File::Tail
    cpan> exit
  • 安装rrdtool绘图引擎 

    wget ftp://ftp.pbone.net/mirror/ftp.pramberger.at/systems/linux/contrib/rhel5/i386/rrdtool-1.4.5-1.el5.pp.i386.rpm
    wget ftp://ftp.pbone.net/mirror/ftp.pramberger.at/systems/linux/contrib/rhel5/i386/perl-rrdtool-1.4.5-1.el5.pp.i386.rpm
    yum install libdbi
    rpm -ivh rrdtool-1.4.5-1.el5.pp.i386.rpm
    rpm -ivh perl-rrdtool-1.4.5-1.el5.pp.i386.rpm
  • 安装并配置Extman套件 

    • 调整临时会话目录的权限 

      chown -R postfix:postfix /tmp/extman
    • 创建临时会话目录 

      mkdir /tmp/extman
    • 修改配置文件 

      cp webman.cf.default webman.cf
      vim webman.cf

      修改以下内容:

      SYS_CONFIG = /usr/local/apache2/htdocs/extman/
      SYS_LANGDIR = /usr/local/apache2/htdocs/extman/lang
      SYS_TEMPLDIR = /usr/local/apache2/htdocs/extman/html
      SYS_MAILDIR_BASE = /var/mailbox
      ……
      SYS_SESS_DIR = /tmp/extman/
      ……
      SYS_BACKEND_TYPE = mysql
      SYS_CRYPT_TYPE = md5crypt
      SYS_MYSQL_USER = webman
      SYS_MYSQL_PASS = webman
      SYS_MYSQL_DB = extmail
      SYS_MYSQL_HOST = localhost
      SYS_MYSQL_SOCKET = /tmp/mysql.sock
      ……
    • 调整cgi目录权限 

      chown -R postfix:postfix cgi
    • 解压源码包 

      tar zxvf extman-1.1.tar.gz -C /usr/local/apache2/htdocs/
      mv /usr/local/apache2/htdocs/extman-1.1 /usr/local/apache2/htdocs/extman
      cd /usr/local/apache2/htdocs/extman
  • 调整httpd服务配置 

    vim /usr/local/apache2/conf/httpd.conf

    修改以下内容:

    ……
    LoadModule suexec_module        modules/mod_suexec.so
    
    NameVirtualHost         192.168.1.103
    <VirtualHost 192.168.1.103>
            ServerName      mail.benet.com
            DocumentRoot    /usr/local/apache2/htdocs/extmail/html
            ScriptAlias     /extmail/cgi /usr/local/apache2/htdocs/extmail/cgi
            Alias           /extmail /usr/local/apache2/htdocs/extmail/html
            ScriptAlias     /extman/cgi /usr/local/apache2/htdocs/extman/cgi
            Alias           /extman /usr/local/apache2/htdocs/extman/html
            SuexecUserGroup postfix postfix
    </VirtualHost>
  • 重启httpd服务 

    /usr/local/apache2/bin/apachectl restart

    service httpd restart
  • 登录并管理ExtMail邮件系统 
    访问 http://mail.benet.com/extman/ 。

    • 设置邮件别名或群组 

    • 添加邮件域的管理用户 

    • 添加虚拟邮件用户,设置用户密码,可使用的邮件服务等 

    • 添加虚拟邮件域,设置虚拟域用户容量,邮箱大小等 

  • 查看邮件系统的图形化信息 

    cp -r /usr/local/apache2/htdocs/extman/addon/mailgraph_ext /usr/local/
    cd /usr/local/mailgraph_ext/
    ./mailgraph-init start
    echo "/usr/local/mailgraph_ext/mailgraph-init start" >> /etc/rc.d/rc.local

邮件邮件过滤和防病毒

对于运行在Internet环境中的企业电子邮件系统来说,如何有效的防范垃圾邮件和病毒邮件是一个必须解决的问题。

基于邮件地址的过滤

在SMTP会话过程中,客户端程序在每个阶段分别向服务器提供不同的地址信息,Postfix系统可以针对这些信息进行检查,并通过主配置文件的配置项决定如何处理邮件。

检查配置参数和检查对象如下:

  • smtpd_client_restrictions

  • 检查客户端的主机名/地址

  • smtpd_helo_restrictions

  • 检查客户端HELO信息中的主机名

  • smtpd_sender_restrictions

  • 检查发件人地址

  • smtpd_recipient_restrictions

  • 检查收件人地址

构建Postfix邮件服务器_第4张图片

  • 根据客户端主机名/地址过滤 
    通过设置限制条件 check_client_access 检查邮件客户端是否满足访问策略要求。

    vim /etc/postfix/main.cf
    smtpd_client_restrictions = check_client_access hash:/etc/postfix/access

    建立 /etc/postfix/access 文本文件,根据需要设置访问策略。客户端地址可以使用ip地址,网络地址,主机名或域名等形式。常见的过滤工作有:

    vim /etc/postfix/access

    添加以下内容:

    127.0.0.1     OK
    192.168.1     OK
    192.168.1.100 REJECT

    设置完毕后,使用 postmap 命令将 /etc/postfix/access 文件转换为hash数据库/etc/postfix/access.db 。

    postmap /etc/postfix/access
    • REJECT

    • 拒绝

    • OK

    • 允许

    • DISCARD

    • 丢弃

  • 根据客户端HELO主机名过滤 

    vim /etc/postfix/main.cf

    添加以下内容:

    smtpd_helo_required = yes
    smtpd_helo_restrictions = reject_invalid_hostname
  • 根据发件人地址过滤 

    vim /etc/postfix/main.cf

    添加以下内容:

    smtpd_sender_login_maps = mysql:/etc/postfix/mysql_virtual_sender_maps.cf, mysql:/etc/postfix/mysql_virtual_alias_maps.cf
    smtpd_sender_restrictions = reject_sender_login_mismatch, reject_non_fqdn_sender, reject_unknown_sender_domain, check_sender_access hash:/etc/postfix/sender_access
    vim /etc/postfix/sender_access

    添加以下内容:

    [email protected] REJECT
    cracker@         REJECT
    163.com          REJECT
    portmap /etc/postfix/sender_accessF
  • 根据收件人地址过滤 

    vim /etc/postfix/main.cf

    添加以下内容:

    smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination, reject_non_fqdn_recipient, reject_unknown_recipient_domain

基于邮件内容的过滤

在Postfix邮件系统中,针对邮件内容的过滤及反病毒邮件功能,可以由 MailScanner 调度SpamAssassin 和 F-Prot 软件来实现。

  • MailScanner

  • 协调调度邮件过滤软件俺

  • SpamAssassin

  • 根据邮件内容过滤垃圾邮件

  • F-Prot

  • 提供病毒邮件查杀功能

构建Postfix邮件服务器_第5张图片

其主要工作流程:

  • 由Postfix将接收的邮件全部放到 hold 队列中

  • MailScanner对 hold 队列的邮件进行处理

    • 调用SpamAssassin对邮件内容进行检查

    • 调用F-Prot对邮件内容进行扫描

  • 检查完毕的邮件转入 incoming 队列中交给Postfix投递

  • 安装并配置MailScanner 

    • 启动MailScanner服务 

      service MailScanner start
      chkconfig MailScanner on
    • 调整邮件过滤队列的目录的属主,属组 

      chown -R postfix:postfix /var/spool/MailScanner/incoming
      chown -R postfix:postfix /var/spool/MailScanner/quarantine
    • 配置Postfix支持Mailscanner 

      vim /etc/postfix/main.cf

      添加以下内容:

      header_checks = regexp:/etc/postfix/header_checks
      vim /etc/postfix/header_checks

      添加以下内容:

      /^Received:/    HOLD
    • 配置软件包 

      vim /etc/MailScanner/MailScanner.conf

      修改以下内容:

      ……
      Run As User = postfix
      Run As Group = postfix
      Queue Scan Interval = 6
      Incoming Queue Dir = /var/spool/postfix/hold
      Outgoing Queue Dir = /var/spool/postfix/incoming
      Incoming Work Dir = /var/spool/MailScanner/incoming
      Quarantine Dir = /var/spool/MailScanner/quarantine
      PID file = /var/run/MailScanner.pid
      Restart Every = 7200
      MTA = postfix
      Sendmail = /usr/sbin/sendmail
      Sendmail2 = /usr/sbin/sendmail
      ……
      Use SpamAssassin = yes
      Max SpamAssassin Size = 200k
      Required SpamAssassin Score = 6
      High SpamAssassin Score = 10
      SpamAssassin Auto Whitelist = yes
      SpamAssassin Timeout = 75
      Max SpamAssassin Timeouts = 10
      SpamAssassin Timeouts History = 30
      Check SpamAssassin If On Spam List = yes
      Include Binary Attachments In SpamAssassin = no
      Spam Score = yes
      Cache SpamAssassin Results = yes
      SpamAssassin Cache Database File = /var/spool/MailScanner/incoming/SpamAssassin.cache.db
      Rebuild Bayes Every = 0
      Wait During Bayes Rebuild = no
      Use Custom Spam Scanner = no
      Max Custom Spam Scanner Size = 20k
      Custom Spam Scanner Timeout = 20
      Max Custom Spam Scanner Timeouts = 10
      Custom Spam Scanner Timeout History = 20
      Spam Actions = deliver header "X-Spam-Status: Yes"
      High Scoring Spam Actions = delete forward [email protected]
      Non Spam Actions = deliver header "X-Spam-Status: No"
      ……
      Debug = no
      Debug SpamAssassin = no
      ……
      include /etc/MailScanner/conf.d/*
    • 安装软件包 

      tar zxvf MailScanner-4.83.4-1.rpm.tar.gz
      cd MailScanner-4.83.4-1
      yum install rpm-build
      ./install.sh nodeps
      The important ones are HTML-Parser and MIME-tools.
    • 下载软件包 

      wget http://www.mailscanner.info/files/4/rpm/MailScanner-4.83.4-1.rpm.tar.gz
  • 安装并配置SpamAssassin 

    yum install spamassassin
    service spamassassin start
    chkconfig spamassassin on
  • 安装并配置F-Prot 

    wget http://files.f-prot.com/files/unix-trial/fp-Linux-i686-ws.tar.gz
    tar zxvf fp-Linux-i686-ws.tar.gz -C /opt/
    cd /opt/f-prot/
    ./install-f-prot.pl
    /opt/f-prot/fpupdate
    crontab -e

    添加以下内容:

    38 * * * * root /opt/f-prot/fpupdate > /dev/null
    crontab -l
    service crond start
    chkconfig crond on

邮件内容过滤与防病毒测试

  • 测试邮件内容过滤 
    发送测试邮件的文本内容如下:

    XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X
    tail /var/log/maillog
  • 测试反病毒邮件 
    发送测试邮件的文本内容如下:

    X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
    tail /var/log/maillog


http://leiyue.typepad.com/blog/2011/07/emacs-cheet-sheet.html


你可能感兴趣的:(构建PostFix邮件服务器)