Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1594029
  • 博文数量: 317
  • 博客积分: 10283
  • 博客等级: 上将
  • 技术积分: 3566
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-04 11:38
个人简介

哥使用Linux

文章分类

全部博文(317)

分类: LINUX

2009-04-19 20:34:03

本文讲述完全使用Debian自带软件包架设使用系统用户,支持SMTP AUTH/POP3/IMAP的邮件系统,由于只是在单机上进行测试,所以本机安装了DNS服务器,对邮件域进行了解析,实际配置时DNS对邮件服务器非常重要,为避免不必要的弯路,尽量在配置POSTFIX之前检查一下DNS配置是否正确。

  配置全过程如下:

  1. 为了让系统尽量使用最新的安装包,推荐在进行安装各软件前先apt-get update;apt-get upgrade一下。否则还有可能引起软件安装的兼容性问题,我遇到过几次在安装任何软件时均提示在安装过程中需先卸载e2fsprogs而安装失败的情形,最好只好强行删除该软件再进行下一步,由于该操作会同时删除系统中其它重要软件,应尽量避免。

  2. 卸载Debian自带的exim4及相关软件包。

  3. 安装postfix及相关软件:

apt-get install postfix postfix-doc libsasl2 sasl2-bin courier-imap courier-pop courier-authdaemon


  4. 开启saslauthd服务:

    默认地saslauthd是不开启的,在运行/etc/init.d/saslauthd start后没有任何反应,需要修改/etc/default/saslauthd文件如下:

START=yes
MECHANISMS="shadow"


    然后重新输入命令/etc/init.d/saslauthd start可以看到saslauthd服务开启的提示。

  5. 测试saslauthd服务:

    运行ps ax|grep saslauthd,结果中如包含/usr/sbin/saslauthd -a shadow行则说明saslauthd服务正在运行,否则需要检查配置并启动saslauthd服务。

    sasl2-bin自带了一个测试saslauthd服务的命令testsaslauthd,如果系统中有用户test,密码为testpass,则运行testsaslauthd -u test -p testpass,如回应:

0: OK "Success."


    则说明saslauthd服务工作正常。

  6. 配置smtp auth:

    修改/etc/postfix/main.cf文件如下:

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no

append_dot_mydomain = no

myhostname = vd.vlinux.net
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = $myorigin, localhost.localdomain, localhost
relayhost =
mynetworks = 127.0.0.0/8
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
home_mailbox = Maildir/
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions =
    permit_sasl_authenticated,
    reject_unknown_recipient_domain,
    reject_non_fqdn_recipient
    reject_non_fqdn_hostname,
    reject_non_fqdn_sender,
    reject_non_fqdn_recipient,
    reject_unauth_destination,
    reject_unauth_pipelining,
    reject_invalid_hostname,
    permit


    配置中的home_mailbox = Maildir/是指定postfix在进行邮件投递时使用与Qmail类似的Maildir方式,此方式每封邮件是一个独立的文件,比较易于管理,另外IMAP默认也是在用户目录的Maildir中访问邮箱的,所以我选择了此种方式。在选Maildir方式时,mailbox_command选项应该置空。

    其中vd.vlinux.net是本机的主机名,有两点比较重要:

    1)/etc/hosts文件必须有下面一行:

192.168.5.2   vd.vlinux.net  vd


    2)/etc/mailname文件的内容必须是该域的域名。

    创建/etc/postfix/sasl/smtpd.conf文件如下:

pwcheck_method: saslauthd
saslauthd_path: /var/run/saslauthd/mux
mech_list: PLAIN LOGIN


    很多资料都讲该文件应该在/usr/lib/sasl2目录下,我是经过许多次失败才忽然发现应该放在这里的,可能是Debian的不同吧。现在重启postfix:/etc/init.d/postfix restart,通过telnet 25端口检查smtp auth是否已经开始工作。

vd:~# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
220 vd.vlinux.net ESMTP Postfix (Debian/GNU)
ehlo localhost
250-vd.vlinux.net
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN
250 8BITMIME ]


    出现250-AUTH ……一行就说明smtp auth功能已经添加。

  7. 看起来一切都工作正常了,试一下发信:

vd:~# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
220 vd.vlinux.net ESMTP Postfix (Debian/GNU)
ehlo localhost
250-vd.vlinux.net
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN
250 8BITMIME
auth login
334 VXNlcm5hbWU6
dGVzdA== //用户名test的的Base64编码
334 UGFzc3dvcmQ6
dGVzdHBhc3M= //密码testpass的Base64编码
535 Error: authentication failed


    Base64编码可以perl或任何一种脚本语言获得:

    perl:

perl -MMIME::Base64 -e 'print encode_base64("user")'


    PHP:

php -r 'echo base64_encode("user")."\n";'


    OPENSSL:

echo -n "user" | openssl base64 -a


    提示认证失败,查看/var/log/mail.log文件发现有以下信息:

Feb 26 23:39:47 vd postfix/smtpd[2323]: connect from localhost.localdomain[127.0.0.1]
Feb 26 23:39:57 vd postfix/smtpd[2323]: warning: SASL authentication failure: cannot connect to saslauthd server: No such file or directory
Feb 26 23:39:57 vd postfix/smtpd[2323]: warning: localhost.localdomain[127.0.0.1]: SASL login authentication failed


    事实上,根据smtpd.conf文件/var/run/saslauthd/mux文件是存在的,留作疑问。

    经试验,修改/etc/postfix/master.cf中smtp服务行如下,以取消chroot方式运行:

smtp   inet n    -    n    -    -    smtpd


    重启postfix,重复以上步骤,发现认证仍然失败,但日志中信息提示:

Feb 26 23:47:23 vd postfix/smtpd[2405]: warning: SASL authentication failure: cannot connect to saslauthd server: Permission denied


    修改/var/run/saslauthd目录的权限使postfix用户可以访问,再试试验,发现认证已可通过。但是当saslauthd服务器重启时出现如下提示:

Starting SASL Authentication Daemon: ‘/var/run/saslauthd’ 的权限模式已更改为 0710 (rwx--x---)


    此时smtp认证又失败了,原因是saslauthd服务在启动时要先执行dpkg-statoverride命令将一些指定目录的权限进行恢复,可能是为了某种安全目的,有两种方法可以解决此问题,个人推荐第2种方法:

    1)将文件/var/lib/dpkg/statoverride中“root sasl 710 /var/run/saslauthd”一行删除,或执行dpkg-statoverride --remove /var/run/saslauthd完成相同的操作。

    2)将postfix用户加入sasl组。

  至此,配置工作完全结束了,有些系统上用户目录的Maildir目录要用特定的命令手工创建,Debian下在收到第一封邮件时就会自动创建了。

  下一篇文章,将在此基础上改为使用mysql数据库提供虚拟域虚拟用户,架设一个完备的提供WebMail服务的多域名邮件系统。
 
 
[原创] Debian上PostFix的配置(二)
  很早以前曾经写过Debian下安装Postfix的第一篇,由于时间问题,使用虚拟用户及多域名的配置一直没时间整理,现在终于完成了。

  1. 安装相关软件
apt-get install postfix postfix-mysql
apt-get install courier-pop courier-imap courier-authlib-mysql courier-authdaemon
apt-get install libsasl2-2 sasl2-bin libsasl2-modules
apt-get install libpam-mysql
apt-get install ilohamail


  2. 安装postfixadmin

  由于使用mysql支持postfix需要自己设计数据库的结构,在这里我们使用一个第三方的软件postfixadmin,幸运的是现在postfixadmin有了deb安装包。
wget
dpkg -i postfixadmin_2.2.0_all.deb


  修改/etc/config.inc.php
$CONF['configured'] = 'true';
$CONF['default_language'] = 'cn';
$CONF['domain_path'] = 'YES';
$CONF['domain_in_mailbox'] = 'NO';
$CONF['database_type'] = 'mysql';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfixadmin';
$CONF['database_password'] = 'postfixmaster';
$CONF['database_name'] = 'postfix';


  其它的选项,您可以根据自己的喜好修改。在mysql中创建postfix所用数据库及帐户:

>create database postfix;
>grant all privileges on postfix.* to postfixadmin@localhost identified by 'postfixmaster';
[/td]


  从以下页面访问postfixadmin的管理界面:


在各项检查通过后,即可创建一个管理员帐号(邮箱格式)。成功后删除/usr/share/postfixadmin/setup.php文件。再次登录postfixadmin界面后就可以用创建的管理员帐号进行管理了,如创建域名,创建邮箱,创建对某些域名具有管理权的管理员等。

  3. 配置postfix支持mysql

  修改/etc/postfix/main.cf文件如下:
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
append_dot_mydomain = no
# 这里去掉了tls支持的配置部分
myhostname = mail.home.ddmdd.com
myorigin = /etc/mailname
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
inet_interfaces = all

virtual_gid_maps = static:108 # postfix组的gid
virtual_mailbox_base = /home/postfix
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_limit = 512000000
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 100
virtual_transport = virtual
virtual_uid_maps = static:103 # postfix用户的uid
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later.
virtual_overquota_bounce = yes
relay_domains = proxy:mysql:/etc/postfix/mysql_relay_domains_maps.cf
disable_vrfy_command = yes
smtpd_helo_required = yes

smtpd_recipient_restrictions =
 permit_sasl_authenticated,
 reject_unknown_recipient_domain,
 reject_non_fqdn_recipient
 reject_non_fqdn_hostname,
 reject_non_fqdn_sender,
 reject_non_fqdn_recipient,
 reject_unauth_destination,
 reject_unauth_pipelining,
 reject_invalid_hostname,
 reject_rbl_client cdl.anti-spam.org.cn,
 reject_rbl_client cblplus.anti-spam.org.cn,
 permit

smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes


  并依次创建如下文件:
mysql_virtual_alias_maps.cf:
user = postfixadmin
password = postfixmaster
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
#expansion_limit = 100

mysql_virtual_domains_maps.cf:
user = postfixadmin
password = postfixmaster
hosts = localhost
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%u'
#query = SELECT domain FROM domain WHERE domain='%s'
#expansion_limit = 100

mysql_virtual_mailbox_maps.cf:
user = postfixadmin
password = postfixmaster
hosts = localhost
dbname = postfix
query = SELECT CONCAT(domain,'/',maildir) FROM mailbox WHERE username='%s' AND active = '1'
#expansion_limit = 100


关于详细配置请见/usr/share/doc/postfixadmin/DOCUMENTS/POSTFIX_CONF.txt。

  修改/etc/postfix/master.cf,将smtp的chroot改为n
smtp   inet n    -    n    -    -    smtpd


  4. 配置并验证smtp的sasl认证

  修改/etc/default/saslauthd文件设置 START=yes(注意yes一定要是小写),启用saslauthd服务:/etc/init.d/saslauthd start

  新建sasl认证配置文件smtpd.conf
pwcheck_method: saslauthd
saslauthd_path: /var/run/saslauthd/mux
mech_list: PLAIN LOGIN


  将postfix用户加入sasl组,建立/etc/pam.d/smtp文件如下:

auth required pam_permit.so
auth required pam_mysql.so user=postfixadmin passwd=postfixmaster db=postfix table=mailbox usercolumn=username passwdcolumn=password crypt=1 sqllog=1
account sufficient pam_mysql.so user=postfixadmin passwd=postfixmaster db=postfix table=mailbox usercolumn=username passwdcolumn=password crypt=1 sqllog=1


  修改/etc/default/saslauthd文件中options行
OPTIONS="-c -r -m /var/run/saslauthd" # 增加-r参数,确保在验证用户名密码的时候使用邮箱全名做为用户名。


  重启postfix服务: /etc/init.d/postfix restart
  
  验证:
vmlinux:/etc/postfix# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.home.ddmdd.com ESMTP Postfix (Debian/GNU)
ehlo localhost
250-mail.home.ddmdd.com
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-STARTTLS
250-AUTH LOGIN NTLM CRAM-MD5 DIGEST-MD5 PLAIN # 出现这两行,就说明已支持smtp-auth了
250-AUTH=LOGIN NTLM CRAM-MD5 DIGEST-MD5 PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
auth login
334 VXNlcm5hbWU6
bGl6ZkBob21lLmRkbWRkLmNvbQ== # 可以通过上篇介绍方法进行编码,注意用户名是带域名的邮件地址
334 UGFzc3dvcmQ6
bGl6Zg==
235 2.7.0 Authentication successful # smtp验证通过


  或者用下列方法验证:
# testsaslauthd -u -p test -s smtp
0: OK "Success." ]


  5. 验证邮件接收
  
  在本地使用mail命令向新建用户发送邮件
# mail
Subject: welcome to new mailbox
hello!!!
Cc:

# tail -f /var/log/mail.log
May 14 10:50:16 home postfix/pickup[2872]: 7895F6FB00: uid=0 from=
May 14 10:50:16 home postfix/cleanup[2997]: 7895F6FB00: message-id=<>
May 14 10:50:16 home postfix/qmgr[2873]: 7895F6FB00: from=<>, size=304, nrcpt=1 (queue active)
May 14 10:50:16 home postfix/virtual[3000]: 7895F6FB00: to=<>, relay=virtual, delay=0.3, delays=0.2/0.03/0/0.07, dsn=2.0.0, status=sent (delivered to maildir) # 出现status=sent说明该邮件已投递成功
May 14 10:50:16 home postfix/qmgr[2873]: 7895F6FB00: removed


  如果接收到新邮件,会存放在/home/postfix/domain/user/new目录下.
  
  6. 配置pop3和imap
  
  修改/etc/courier/authdaemonrc文件中下行:
authmodulelist="authmysql"


  修改/etc/courier/authmysqlrc文件如下:
MYSQL_SERVER      localhost
MYSQL_USERNAME     postfixadmin
MYSQL_PASSWORD     postfixmaster
MYSQL_PORT       0
MYSQL_OPT        0
MYSQL_DATABASE     postfix
MYSQL_USER_TABLE    mailbox
MYSQL_CRYPT_PWFIELD   password
MYSQL_UID_FIELD     103
MYSQL_GID_FIELD     108
MYSQL_LOGIN_FIELD    username
MYSQL_HOME_FIELD    CONCAT('/home/postfix/',domain) # 此行一般设为postfix的邮件目录'/home/postfix'就可以,我写这篇文章的时候出了些差错, 没找到原因, 根据auth日志修改成了这个值。
MYSQL_NAME_FIELD    name
MYSQL_MAILDIR_FIELD   maildir


  验证:
重启courier-authdaemon服务: /etc/init.d/courier-authdaemon restart
# authtest pass
Authentication succeeded.

   Authenticated: (uid 103, gid 108)
  Home Directory: /home/postfix/home.ddmdd.com
      Maildir: /
       Quota: (none)
Encrypted Password: $1$240501f1$R5XhZrWAZxAsxXtdmo8cp/
Cleartext Password: pass
      Options: (none)

  出现以上信息说明imap和pop3服务配置成功, 可以使用邮件客户端收发信件了。
  
  7. 安装webmail
  
  debian下的webmail试了许多, 发现ilohamail是配置最方便且界面友好的,最好修改以下几个地方。

  登录界面调整修改文件/etc/IlohaMail/login.php:
$default_host = "127.0.0.1";
$adv_mode = 1;
$default_port = 143; # webmail中许多功能是需要imap协议才能支持的,所以建议选用143
$hide_host = 1;
$hide_protocol = 1;
$hide_rootdir = 1;
$default_lang = "cn/";


  由于中文界面有些地方翻译的不是很好,需要修改/usr/share/IlohaMail/lang/cn目录下的一些文件。下面是已要修改完成的打包文件:


  
  遗憾的是IlohaMail不支持修改密码,您可以修改IlohaMail的相关php文件,将postfixadmin的用户部分链接到常规设置中。

Debian上PostFix的配置(三)

  由于对ilohamail的界面和功能还有一些不满意,在进行邮件服务器迁移的时候换了Tmail 3.0(igenus for postfix)做webmail,在网上搜索好久,似乎Tmail已经失传很久了,所有下载链接均无效,还好以前曾经保留过一个,下面是安装过程中需要说明的地方。

  一. 下载安装Tmail:

  安装步骤基本同《Debian上PostFix的配置(二)》,不安装ilohamail,配置从先webmail开始,因为tmail的数据库生成脚本决定了postfix,courier,pam,sasl如何连接mysql。

  1. 从以下地址下载Tmail:



  解压tmail30.tgz到/home/webmail(与apache中DocumentRoot一致),创建完数据库postifx及相关帐号后,执行SQL目录下Tmail.sql创建相关的数据表及默认管理员:

mysql -p postfix < Tmail.sql

  2. 因为管理后台webadmin登录时需要验证码,所以要安装php5-gd,并修改php.ini文件把extension=gd.so行的注释符去掉。另外Tmail是基于php4开发的,有一些类的操作方法在php5中报错:

Fatal error: Using $this when not in object context...

  上面的tmail包已经做过了修正,可以在php5上正常使用。
  
  3. 修改config/config_inc.php文件,填写正确的数据库连接帐号,根据文件中

$CFG_BASEPATH = "/home/webmail/igenus";
$CFG_NETDISK_PATH = "/home/postfix/netdisk";
$CFG_NETDISK_DEFAULT_QUOTA = 100; //MB

  值创建目录,并在其下创建temp目录。

  4. 修改webadmin/include/config_inc.php,填写正确的数据库连接帐号,并根据文件中

define(DOMAINSDIR,"/home/postfix");

  值创建postfix的主目录。由于tmail(igenus)是直接通过php程序访问Maildir目录的,速度非常快,前提是apache要有权限直接访问,经过几轮测试,很不情愿地用postfix帐号来运行apache了。

  5. 以上操作完成后就可以通过以admin登录创建域名了。再以域名为用户名重新登录,可以对该域进行管理。

  二. 配置postfix

  1. 相关配置文件如下:

mail:/# cat /etc/postfix/main.cf
# Set your hostname
myhostname = mail.test.ddmdd.com
mynetworks = 127.0.0.0/8
smtpd_banner = $myhostname ESMTP ready
alias_maps = hash:/etc/aliases
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_gid_maps = static:108
virtual_mailbox_base = /  # 在数据库是绝对路径,但这里不能为空
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_limit = 512000000
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_transport = virtual
virtual_uid_maps = static:103
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later.
virtual_overquota_bounce = yes
disable_vrfy_command = yes
smtpd_helo_required = yes

smtpd_recipient_restrictions =
 permit_mynetworks,
 permit_sasl_authenticated,
 reject_unknown_recipient_domain,
 reject_non_fqdn_recipient
 reject_non_fqdn_hostname,
 reject_non_fqdn_sender,
 reject_non_fqdn_recipient,
 reject_unauth_destination,
 reject_unauth_pipelining,
 reject_invalid_hostname,
 permit

smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
max_use = 10

mail:/# cat /etc/postfix/mysql_virtual_domains_maps.cf
user = postfix
password = postfix
hosts = 127.0.0.1
dbname = postfix
table = domaininfo
select_field = des
where_field = domain
additional_conditions = and domain != 'admin' and active = '1'

mail:/# cat /etc/postfix/mysql_virtual_mailbox_maps.cf
user = postfix
password = postfix
hosts = 127.0.0.1
dbname = postfix
table = userinfo
select_field = maildir
where_field = userid
additional_conditions = and active = '1'

mail:/# cat /etc/postfix/mysql_virtual_mailbox_limit_maps.cf
user = postfix
password = postfix
hosts = 127.0.0.1
dbname = postfix
table = userinfo
select_field = quota
where_field = address
additional_conditions = and active = '1'


  2. 修改/etc/default/saslauthd中 "START=yes", OPTIONS中加入 "-r"。

  3. 创建文件/etc/postfix/smtpd.conf

pwcheck_method: saslauthd
saslauthd_path: /var/run/saslauthd/mux
mech_list: PLAIN LOGIN


  4. 创建文件/etc/pam.d/smtp

auth required pam_permit.so
auth required pam_mysql.so user=postfix passwd=postfix db=postfix table=userinfo usercolumn=address passwdcolumn=passwd crypt=1 sqllog=1
account sufficient pam_mysql.so user=postfix passwd=postfix db=postfix table=userinfo usercolumn=address passwdcolumn=passwd crypt=1 sqllog=1


  5. 重启postfix,按第二篇的方法验证。

  三. 配置pop3和imap

  1. 修改/etc/courier/authdaemonrc文件中下行:

authmodulelist="authmysql"


  2. 修改/etc/courier/authmysqlrc文件如下:

MYSQL_SERVER      localhost
MYSQL_USERNAME     postfix
MYSQL_PASSWORD     postfix
MYSQL_PORT       0
MYSQL_OPT        0
MYSQL_DATABASE     postfix
MYSQL_USER_TABLE    userinfo
MYSQL_CRYPT_PWFIELD   passwd
MYSQL_UID_FIELD     103
MYSQL_GID_FIELD     108
MYSQL_LOGIN_FIELD    address
MYSQL_HOME_FIELD    homedir
MYSQL_NAME_FIELD    userid
MYSQL_MAILDIR_FIELD   maildir
MYSQL_QUOTA_FIELD    quota


  3. 重启courier各服务,使用第二篇的方法验证。

阅读(7461) | 评论(1) | 转发(0) |
0

上一篇:山寨现象

下一篇:Linux 2 6 30

给主人留下些什么吧!~~

chinaunix网友2009-04-19 20:36:10

不错,有时间拿来练习下,哈哈中!