HD

1. Qmail

1.1. 前言

这个文章其实我很早前就应该写了,因为以前做过的Qmail的东东非常的多了,但是一直很懒惰, 导致的最大的问题就是每次做FreeBSD下的Qmail系统都是重新看文章来过。今天终于决定边装边写了。

2004-2-26 进行了第一次大面积的更新,主要是改正一些大家提出的问题,以及加入SMTP认证部分的内容。

2004-2-29 加入了病毒扫描功能的更新,每天我最少可以少删除几百封邮件了。

1.2. 安装Qmail

安装Qmail很简单的,使用ports中的qmail来安装就好了,不过在正式的编译前我们要取得smtp认证的补丁:

cd /usr/ports/mail/qmail
make extract
cd /usr/ports/mail/qmail/work/qmail-1.03
fetch http://www.nimh.org/dl/qmail-smtpd.c
cd /usr/ports/mail/qmail
make -DWITH_BIG_TODO_PATCH install
make disable-sendmail
make enable-qmail
make clean

这里第三步和第四步是将sendmail的缺省mail变更成为Qmail。

需要注意的是这样设置必须要在/etc/rc.conf中加入:

sendmail_enable="NONE"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"

这些将彻底在系统启动时禁止sendmail的任何动做。

一般的情况下我们会使用Qmail的MailDir方式来启动Qmail,所以我们需要将maildir启动脚本激活,但是我们为后面的svscan要做一些准备,所以将以下脚本:

env env - PATH="/var/qmail/bin:/usr/local/bin" \
qmail-start ./Maildir/

放入/var/qmail中的rc文件中。并使用chmod +x /var/qmail/rc命令给rc加上执行权限。

注意:如果你在安装qmail时如果发现它不能正确找到你的域名解析时安装的配置文件不会安装全,这里你需要自己手工进行一次配置:

cd /var/qmail/configure
./config-fast $HOSTNAME

请使用你这台机器的主机名代替$HOSTNAME。这样操作后,Qmail的缺省配置文件都会自动生成。

1.3. 安装和设置MySQL

安装MySQL需要的是时间而不是技巧:

cd /usr/ports/databases/mysql40-server
make -DWITH_CHARSET=gbk install
make clean

我们要为vpopmail提前准备好MySQL的库和用户:

mysqladmin create vpopmail
mysql -u root -p
mysql>use mysql
mysql>GRANT SELECT , INSERT , UPDATE , DELETE , CREATE , \
                DROP , FILE , INDEX , ALTER , SHOW DATABASES , \
                CREATE TEMPORARY TABLES , LOCK TABLES ON * . * TO "vpopmail"@ "localhost"IDENTIFIED BY "vpopmail"WITH \
                MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 ;
mysql>FLUSH PRIVILEGES;

这里创建了一个用户名为vpopmail,同时设置其密码为vpopmail。

1.4. 安装vpopmail

安装vpopmail更多的是参数要注意,其它的都会很简单:

cd /usr/ports/mail/vpopmail
make WITH_MYSQL=yes WITH_MYSQL_SERVER=localhost \
     WITH_MYSQL_USER=vpopmail WITH_MYSQL_PASSWD=vpopmail \
     WITH_MYSQL_DB=vpopmail WITH_MYSQL_LIMITS=yes \
     WITHOUT_ROAMING=yes
make install
make clean

vpopmail支持对用户认证数据库的读写分离,这样的读写分离的好处在于可以使用不同的服务器来异步处理用户的增加和查询操作。 在安装完vpopmail后,你可以在/usr/local/vpopmail/etc中找到vpopmail.mysql文件,它的内容与你在上面的配置项中可以一一找到对应。 这个文件有两行内容,以将对mysql数据库的读和写方法信息告诉vpopmail,它的格式如下:

read_server|read port|read_user|read_password|database_name
update_server|update port|update_user|update_password|database_name

第一行的内容是读取数据库的访问信息,第二行是更新数据库的访问信息。请你一一确认数据列是否正确。

安装好和vpopmail后我们当然需要测试一下它是否能正常的运行,包括连接MySQL数据库和正常的操作Qmail的数据文件:

cd /usr/local/vpopmail/bin
./vadddomain test.com
./vadduser [email protected]

第二步是向系统加入一个域名,第三步是向该域名中加入一个用户。在输入命令后它都会提示你输入密码,域名的密码是用来维护该域中用户的mast用户的密码。 如果没有任何的错误提示,哪么恭喜你,你走过了大多数的艰苦步骤,已经走上了光明大道了。有不少人向我质问不在数据库建立表结构,其实大家要知道你如果做到了以下工作:

在安装之前已经更新了ports 数据库的用户和库已经正确安装 在vpopmail.mysql中设置正确了数据库访问信息 哪么你的vpopmail会自动的在mysql的库中建立相应的表的。

为了给Qmail的smtpd提供认证支持,而用户使用同一个密码来使用服务,我们需要将vpopmail的密码检查复制一份给smtpd使用:

        cd /usr/loca/vpopmail/bin
        cp vchkpw vchkpw-smtpd
        chown vpopmail:vchkpw vchkpw-smtpd
        chmod 4755 vchkpw-smtp

最后一步的作用是为了让vchkpw有su uid的能力,这也是为什么要有两份vchkpw的原因。一份给原有的服务用,一份给smtp用。

1.5. 安装QmailAdmin

我很痛苦每次增加一个用户就ssh到服务器上,su成vpopmail,再输入命令。也许这只是痛苦的开始,你还要面对改密码、增加邮箱转发等等'高级'或是'额外'的用户要求。 于是,一个可爱的管理系统前来将大家于水火中解救出来:QmailAdmin。上面所有的一切,它都能帮你做到。我们来使用万能的ports罢:

cd /usr/ports/mail/qmailadmin
make -DWITH_MODIFY_QUOTA
make install clean

它将qmailadmin的cgi-bin安装到了/usr/local/www/cgi-bin.default的qmailadmin目录中。将这个目录用ln -s命令连接到你的cgi-bin目录中去。启动你的浏览器试试罢,一个域的管理帐号是postmaster,用域的密码登录进去好了。

1.6. 安装和配置daemontools

1.6.1. 安装

我很讨厌daemontools的配置,而且非常烦它哪种启动和监视daemon的目录结构,但是好象Qmail的作者很是推崇自己的这个小作品。 再加上谁都担心Qmail哪一小撮进程有一个完蛋后没有人能知道而重新启动,所以我们还是来配置一下这个丑陋的小东西罢。先安装它:

cd /usr/ports/sysutils/daemontools
make install clean

这个工具最大的特点就在于安装容易到了极限,而配置复杂到了极限!先来建立Qmail的服务日志目录,并给Qmail加上权限:

mkdir -p /var/log/qmail/qmail-smtpd
mkdir -p /var/log/qmail/qmail-pop3d
mkdir -p /var/log/qmail/qmail-send

chmod -R 755 /var/log/qmail
chown -R qmaill:wheel /var/log/qmail

1.6.2. 配置svscan

最好建立以下内容的一个脚本,执行它:

#!/bin/sh
mkdir /service
chmod 755 /service
mkdir /var/qmail/supervise
chmod 755 /var/qmail/supervise

mkdir /var/qmail/supervise/qmail-smtpd
mkdir /var/qmail/supervise/qmail-smtpd/log
chmod +t /var/qmail/supervise/qmail-smtpd

mkdir /var/qmail/supervise/qmail-send
mkdir /var/qmail/supervise/qmail-send/log
chmod +t /var/qmail/supervise/qmail-send

mkdir /var/qmail/supervise/qmail-pop3d
mkdir /var/qmail/supervise/qmail-pop3d/log
chmod +t /var/qmail/supervise/qmail-pop3d

ln -s /var/qmail/supervise/* /service/

下面是pop3d的启动脚本:

#!/bin/sh
exec /usr/local/bin/tcpserver -H -R -v -c100 0 110 \
        /var/qmail/bin/qmail-popup host.domain.de \
        /usr/local/vpopmail/bin/vchkpw \
        /var/qmail/bin/qmail-pop3d Maildir 2>&1

将这个脚本放入/var/qmail/supervise/qmail-pop3d/的run文件中,然后: 再将pop3d的log启动脚本:

#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t s100000 n20 \
        /var/log/qmail/qmail-pop3d 2>&1

放入/var/qmail/supervise/qmail-pop3d/log中的run文件中,之后执行:

chmod 755 /var/qmail/supervise/qmail-pop3d/run
chmod 755 /var/qmail/supervise/qmail-pop3d/log
chmod 755 /var/qmail/supervise/qmail-pop3d/log/run

将smtpd的启动脚本:

#!/bin/sh
QMAILDUID=`/usr/bin/id -u qmaild` 
NOFILESGID=`/usr/bin/id -g qmaild`
exec /usr/local/bin/tcpserver -p -R -x \
        /usr/local/vpopmail/etc/tcp.smtp.cdb -u"$QMAILDUID" \
        -g"$NOFILESGID" -v -c100 0 smtp \
        /var/qmail/bin/qmail-smtpd /usr/local/vpopmail/bin/vchkpw /usr/bin/true 2>&1

放入/var/qmail/supervise/qmail-smtpd的run文件中。另外我们还是附上以前的不带有SMTP认证的脚本:

#!/bin/sh
QMAILDUID=`/usr/bin/id -u qmaild` 
NOFILESGID=`/usr/bin/id -g qmaild`
exec /usr/local/bin/tcpserver -p -R -x \
        /usr/local/vpopmail/etc/tcp.smtp.cdb -u"$QMAILDUID" \
        -g"$NOFILESGID" -v -c100 0 smtp rblsmtpd \
        /var/qmail/bin/qmail-smtpd 2>&1

配对的还有smtpd的log启动脚本:

#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t s100000 n20 \
        /var/log/qmail/qmail-smtpd 2>&1

放入/var/qmail/supervise/qmail-smtpd/log/中的run文件中。之后执行:

chmod 755 /var/qmail/supervise/qmail-smtpd/run
chmod 755 /var/qmail/supervise/qmail-smtpd/log
chmod 755 /var/qmail/supervise/qmail-smtpd/log/run

无尽的长夜呀,还有一个qmail send要搞!将这个脚本:

#!/bin/sh
exec /var/qmail/rc

放入/var/qmail/supervise/qmail-send/中的run文件里。并将以下配对的log启动脚本:

#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t s100000 n20 \
        /var/log/qmail/qmail-send 2>&1

放入/var/qmail/supervise/qmail-send/log中的run文件,最终曙光来到了,我们执行以下命令:

chmod 755 /var/qmail/supervise/qmail-send/run
chmod 755 /var/qmail/supervise/qmail-send/log
chmod 755 /var/qmail/supervise/qmail-send/log/run

不知你的指头是不是酸了呢?总之,这时候去唱个卡拉OK罢,让你的指头休息一下罢,无聊的svscan就像是我们要去唱的哪英的歌一样,被我们“征服”了!

1.6.3. 设置系统启动脚本

在系统安装时/usr/local/etc/rc.d中的qmail.sh文件是连接到了/var/qmail/rc文件上的,但是我们需要用svscan来启动,所以我们先要将原有的启动脚本删除,再vi一个新的启动脚本:

cd /usr/local/etc/rc.d
rm qmail.sh
vi qmail.sh

脚本的内容HD已经辛苦的帮大家抄来了:

#!/bin/sh
case "$1" in
start)
        echo -n "Starting qmail: svscan"
        if cd /var/qmail/supervise; then
                env - PATH="/var/qmail/bin:/usr/local/bin:/usr/bin:/bin" svscan &
                echo $! > /var/run/svscan.pid
        fi
        echo "."
        ;;
stop)
        echo -n "Stopping qmail: svscan"
        kill `cat /var/run/svscan.pid`
        echo -n " qmail"
        svc -dx /var/qmail/supervise/*
        echo -n " logging"
        svc -dx /var/qmail/supervise/*/log
        echo "."
        ;;
stat)
        cd /var/qmail/supervise
        svstat * */log
        ;;
doqueue|alrm)
        echo "Sending ALRM signal to qmail-send."
        svc -a /var/qmail/supervise/qmail-send
        ;;
queue)
        /var/qmail/bin/qmail-qstat
        /var/qmail/bin/qmail-qread
        ;;
reload|hup)
        echo "Sending HUP signal to qmail-send."
        svc -h /var/qmail/supervise/qmail-send
        echo "Sending HUP signal to qmail-pop3d."
        svc -h /var/qmail/supervise/qmail-pop3d
        ;;
pause)
        echo "Pausing qmail-send"
        svc -p /var/qmail/supervise/qmail-send
        echo "Pausing qmail-smtpd"
        svc -p /var/qmail/supervise/qmail-smtpd
        echo "Pausing qmail-pop3d"
        svc -p /var/qmail/supervise/qmail-pop3d
        ;;
cont)
        echo "Continuing qmail-send"
        svc -c /var/qmail/supervise/qmail-send
        echo "Continuing qmail-smtpd"
        svc -c /var/qmail/supervise/qmail-smtpd
        echo "Continuing qmail-pop3d"
        svc -c /var/qmail/supervise/qmail-pop3d
        ;;
restart)
        echo "Restarting qmail:"
        echo "* Stopping qmail-smtpd."
        svc -d /var/qmail/supervise/qmail-smtpd
        echo "* Sending qmail-send SIGTERM and restarting."
        svc -t /var/qmail/supervise/qmail-send
        echo "* Restarting qmail-smtpd."
        svc -u /var/qmail/supervise/qmail-smtpd
        echo "* Sending qmail-pop3d SIGTERM and restarting."
        svc -t /var/qmail/supervise/qmail-pop3d
        ;;
cdb)
        tcprules /usr/local/vpopmail/etc/tcp.smtp.cdb /usr/local/vpopmail/etc/tcp.smtp.tmp < /usr/local/vpopmail/etc/tcp.smtp
        chmod 644 /usr/local/vpopmail/etc/tcp.smtp*
        echo "Reloaded /usr/local/vpopmail/etc/tcp.smtp."
        ;;
*)
        echo "Usage: $0 {start|stop|restart|doqueue|reload|stat|pause|cont|cdb|queue}"
        exit 1
        ;;
esac
exit 0

在你快乐之余不要忘记要给启动脚本执行权限:

chmod +x /usr/local/etc/rc.d/qmail.sh

如果你现在还在清醒状态,哪么请启动我们伟大的Qmail罢。它已经在我们的系统中安静的存在到了你同意它站立起来了:

/usr/local/etc/rc.d/qmail.sh start

如果启动后发现了问题请首先查看系统中的sendmail是否还能通过ps -ax命令看到,如果还能看到,建议你确定已经向上面所说更新过/etc/rc.conf中的配置后,输入让世界重见光明的命令:reboot罢!要知道轮回是必然的,皇帝明天就能到我家!

1.7. 邮件病毒扫描

如果你永远不会收到带有病毒的邮件,哪么请跳过本节,因为本节所安装的内容不但会让你的系统负载加大,而且还有可能需要你去购买防病毒软件。 这样不但要升级机器,还会要在软件上花费金钱。当然了,病毒软件也有免费的,最后我会简单介绍一下相关资源的。

1.7.1. 安装杀毒软件

没有人想到要为FreeBSD安装杀毒软件,因为到现在为止还没有见到过FreeBSD中出现过难以抵挡的病毒。 但是如果你要架设一个邮件服务器,哪么这就很重要了,因为,客户端收邮件的系统可能是一台Windows,收信的人可能是一个见了所有的附件都会点一下的菜鸟。 你应该为哪可怜的Windows和无知的菜鸟着想。另一方面,在Windows上的邮件病毒已经越来越多了,而且对于我来讲有时一天能收到数百封带着zip或是scr的附件的邮件, 它们需要我用大量的空间收下来,并将它们删除。所以,我们的FreeBSD要为Windows架设起一个防病毒长城来了!

FreeBSD下的杀病毒软件很少,但是McAfee却一直为FreeBSD的stable版本(包括3.x和4.x)提供了McAfee VirusScan Command Line版本进行病毒防护。 安装也非常的简单:

cd /usr/ports/security/vscan
make install clean

装好之后我们还需要为它写一个shell脚本,使得每天它都可以去下载最新的病毒库,

vi /usr/local/uvscan/update.sh: 

#!/bin/sh
install_directory=`dirname $0`
mkdir /tmp/dat-updates
cd /tmp/dat-updates
current_version=`$install_directory/uvscan --version | grep "Virus data file" | awk '{ print substr($4,2,4) }'`
ftp "ftp://ftp.nai.com/pub/datfiles/english/dat-*.tar"
new_version=`echo dat-*.tar | awk '{ print substr($1,5,4) }'`
if [ "$current_version" -ge "$new_version" ]
    then
        echo "No new .DATs available at this time"
        echo "Currently installed version: $current_version"
        echo "Version on FTP site:         $new_version"
    else
        tar -xf dat-*.tar
        for file in `tar -tf dat-*.tar`
          do
            newfile=`echo $file | tr [A-Z] [a-z]`
            mv -f ./$file "$install_directory/$newfile"
          done
        current_version=`$install_directory/uvscan --version | grep "Virus data file" | awk '{ print substr($4,2,4) }'`
        if [ ! "$current_version" -eq "$new_version" ]
            then
                echo "DAT file updates did not work correctly."
                echo "Please try manually."
            else
                echo "DAT file updates successful"
                echo "Currently installed version: $current_version"
        fi
fi
cd /
rm -rf /tmp/dat-updates

记得写完后要用chmod +x update.sh来给它执行的权限。 为了让升级自动进行,我们设置每6小时从服务器上进行一次更新,在/etc/crontab文件最后加上以下内容:

# uvsacan updata   
0       */6     *       *       *       root    /usr/local/uvscan/update.sh

好了,病毒扫描程序已经安装完成了。建议你在第一时间就去更新一下病毒库。 比较让我苦恼的是,现在这样更新每次都需要下一个同样大小的文件,而不是增量的下载,所以大家需要视自己的网络环境来设置更新的间隔时间。

1.8. 小技巧

请记住:所有的问题出现时都请到/var/local/maillog文件中先查看日志罢。 === 有关SMTP的安全问题 == = 有许多朋友都问题了我这个问题,我个人来说认为SMTP认证是一个不错的主意,不过qmail给了我们一个更好玩的防止SMTP滥用的办法。

装好系统后,先别着急收邮件,你先使用系统的smtp服务来发一个邮件试试,如果邮件的发送目的不是本域之内的邮箱,你就会从服务器得到一个错误:

 553 sorry, that domain isn't in my list of allowed rcpthosts (#5.7.1)

这里是说本smtp服务器没有将你的目标地址域放入允许投递的列表中。如果你现在收一下邮件,再发送时就会发现,一切正常了!呵呵,是不是很好玩哟。 这里使用了一个技术,就是当你通过pop3收一回邮件,你的IP地址就会记录在案,你的IP再使用SMTP时就可以向其它的域发送邮件了,而这个IP可使用的时间是30分钟。 如果你想改变这个时间,在编译vpopmail时,修改Makefile中的RELAYCLEAR变量的值。

1.8.1. 病毒扫描软件

除了uvscan,其实你还有其它的选择。

在/usr/ports/security/clamav中你可以找到开源的ClamAV的病毒扫描软件。

更多的病毒扫描软件在我测试后会加入这里的。

2. 相关参考与感谢

有关ports中编译参数可以见我的blog中的文章:FreeBSD ports中make可带有的参数。

有关qmail SMTP认证方面更多些的内容可见我blog中的文章:qmail的SMTP认证。

感谢网友tiger给我提出的文章中的几点bug。我已经修正了。 感谢CCF的hunreal为我们提供了uvscan的升级脚本,它让我们哪么简单的让uvscan升级工作起来。


© 2003-2004, 技术天空