更新时间:2024-04-17 17:24
qmail是一个因特网邮件传送代理(简写为MTA),它运行在linux/Unix兼容系统下,是一个直接代替UNIX下Sendmail软件的邮件传送程序。qmail使用SMTP协议与其它系统上的MTA交换邮件。
作为Linux下面主流的邮件系统内核,大量著名的商业邮件系统都是在Qmail内核下开发,比如Hotmail等。Qmail具有安装方便、安全性高、邮件结构合理、支持SMTP服务、队列管理、邮件反弹、基于域名的邮件路由、SMTP传输、转发和邮件列表、本地(邮件)传送、POP3 服务等强大的功能。它已经逐渐替代传统的Sendmail成为linux下邮件系统内核的主流选择。qmail是面向安全而设计的,作者曾经悬赏500美元来找出qmail的安全漏洞,但是直到2006年,还是没有人能领取这笔奖金。
qmail的主要竞争对手是Exim以及Postfix。与它的竞争对手不同的是,Qmail已经许多年没有更新了,用户已经习惯于通过第三方的插件及补丁来使qmail增加新的功能。
qmail 的源代码现已开放为公有领域。
在深入探索qmail的配置和调节之前,了解一些qmail的基础架构是重要的。Qmail经常被仅仅归类为一个邮件服务器软件包。这可能只在某一点上是正确的,将qmail考虑为一个邮件分发体系会更加准确,这个体系结构的构建者为这个体系的所有组件深入的提供了一些基础接口。
Qmail是非常模块化的——它包含了一系列通过特定且受限的接口来互相沟通的简单程序。每个简单的程序都有一个特定且受限的任务需要完成。这个体系结构允许每个组件都被容易的替代或让新的程序插入到基础组件之中。
另外,这个体系限制了所有组件的安全影响。任何一个程序都与另外的程序隔离开来,在任何可能的情况,给每个程序一个不同的UNIX用户和特定权限来确保它不会做任何它不应该做的事。因为通讯接口被限制了,因此显然更难去攻击软件或更多别的——攻击一个没有足够权限来做任何它不应该做的事的组件对攻击者来说是很没有用处的。
最简单的例子是从网络上收邮件。一个基础的qmail实验如下:tcpserver到qmail-smtpd到qmail-queue。tcpserver程序有两个任务:打开一个端口来监听网络,并对每个连接以正确的用户来启动qmail-smtpd。因为监听低端口(如SMTP的端口:25)要求root权限,所以tcpserver通常以root用户运行。然而,因为tcpserver并不试图理解通讯,所以很难被攻击。qmail-smtpd程序也只有两个任务需要运行:充分使用SMTP协议来接收消息,并发送这些邮件消息到qmail-queue。就这个而言,qmail-smtpd本身并不需要对磁盘上的队列或网络做任何事情。这允许qmail-smtpd能被一个权限非常受限的用户来运行,而且允许qmail-smtpd成为一个非常简单,而且容易被验证和排错的程序,即使它需要与用户(或攻击者)输入直接沟通。qmail-queue程序则只有一个任务——将消息写到已经有了接收头的磁盘队列上。它无需和网络沟通,或者了解它写到磁盘上的消息的内容,使得程序简单并容易被验证,从而使得攻击者更难破坏它。要注意的是这个体系结构很容易被扩展。tcpserver程序可以执行轮流执行所需的qmail-smtpd的任何程序。这可能很有帮助,例如,决定在qmail-smtpd被运行前是否允许一个连接到达qmail-smtpd或设置或取消一个环境变量。它甚至可以用来对数据在到达qmail-smtpd前进行安全过滤。类似的,当qmail-smtpd正常的运行qmail-queue时,它可以调用任何程序。这个程序可以执行所需的qmail-queue,这可能会有用,来过滤哪些包含病毒的邮件消息。
又如另一个例子,qmail-start程序执行一些程序:qmail-send,qmail-lspawn,qmail-rspawn和qmail-clean。以上每个程序都有一个特定的任务。qmail-send必须监控磁盘上的邮件队列,并且分别根据是要将邮件投递给本地用户还是远程用户来执行qmail-lspawn或qmail-rspaw来正确的按路由发送。一旦邮件被发送,它就会运行qmail-clean来清除队列中的消息。qmail-lspawn和qmail-rspawn都会收到发送命令并产生运行qmail-local和qmail-remote的实例所需的数字,这些程序实例会真正开始发送邮件。qmail-remote程序是一个简单的程序,它从标准输入读取邮件,然后将它发送给由它的参数指定的主机和收件人。它没有足够的权限来读取队列本身之外的任何东西,因此必须亲手发送邮件。
qmail-local程序也很简单,它的任务是读取来自标准输入的邮件并将之发送给指定的本地用户,依据这个用户的.qmail文件所描述的具体步骤。和qmail-remote一样,它也没有足够的权限去读取或修改。
这些程序都相互独立,并且只依赖于提供给它的接口。通过限制每个组件的权限,使得攻击系统或通过攻击一个组件来获取更多都变得极其困难。这就是被qmail使用的在其基础概念之后的权限分离安全技术。
qmail 安装部署 1
一、 准备工作 1
二、 LAMP残留(执行即可) 1
三、上传所需安装包 2
四、 检查DNS配置 2
五、 设置或关闭防火墙 2
六、卸载已有的邮件系统 3
七、 解压缩netqmail-1.05.tar.gz 3
八、 安装daemontools 3
九、 安装ucspi-tcp 3
十、 创建所需的用户 4
十一、 准备安装qmail 4
十二、 qmail编译安装 5
十三、 设置管理员的邮箱地址 5
十四、 开启SPF设置 5
十五、 添加qmail的帮助手册 5
十六、 为qmail服务建立监控目录和日志文件 5
十七、 检查服务 6
十八、 安装vpopmail 7
十九、 检查服务 9
二十一、安装qmailadmin 14
过程一:Qmail的安装。
1. 获得Qmail程序。
Qmail是自由软件,在Internet上可以获得它的源代码(C源代码)及基于各种平台和操作系统的二进制文件。二进制文件可以不须编译直接使用,但要注意选择与您的平台和操作系统版本一致的文件,否则可能不能使用。源代码可以在您的任何环境下工作(UNIX)但需要自己进行编译安装。这里我们选择源代码。从Internet上下载的源代码通常是以tar程序打的包然后再用压缩软件进行压缩。如:qmail-1.03.tar.gz 这里使用的是gzip进行压缩的(假设你的机器上已安装了gzip)。使用 gzip -d qmail-1.03.tar.gz 解压缩成qmail-1.03.tar 然后再用tar -xvf qmail-1.03.tar解包成qmail-1.03目录。那么源代码文件均在此目录中了。
2. 编译安装Qmail。
Qmail源代码文件中有几个配置文件可以修改以适合您的环境。
conf-qmail :此文件包含Qmail的安装目录,默认值是 /var/qmail/
conf-users:此文件包含Qmail需要使用的用户,默认用户是 root,alias,(这两个用户在unix下应该已经由系统建立好了,下面的用户应该自己创)qmails,qmaild,qmaill, qmailr,qmailq,qma-ilp。
conf-groups:此文件包含Qmail 需要使用的组,默认的组为qmail(qmails,qmaild,qmaill,qmailr,qmailq,qmailp要属于此组)。
conf-cc:此文件包含Qmail使用的编译器,默认使用cc编译器,如须使用其它C编译器,应该将其替换为此编译器如 gcc.
conf-ld:此文件包含Qmail使用的编译器,默认使用cc编译器,如须使用其它C编译器,应该将其替换为此编译器如 gcc
在进行安装前系统应该已经安装了make命令。
定制好这些文件后,在/var/qmail/下使用命令:make。make命令将编译源代码、连接.obj 文件。如果此过程中断或出错,应参考上面配置文件正确与否。用户和组建立的正确与否。如果此过程没有问题使用命令:make check setup。此命令将安装所有文件到/var/qmail/(在执行此命令前先用 makedir /var/qmail 创建该目录)下。
另外需要安装checkpasswd,它的获得和安装和Qmail一样。此程序用于用户使用POP3协议收取邮件时对用户的密码验证。
过程二:Qmail的初级配置
Qmail安装好了以后将在/var/qmail/下生成若干文件和目录。
1.用vi编辑器打开文件 /etc/inetd.conf,并在文件尾添加如下行:
smtp stream tcp nowait qmaild /var/qmail/bin/tcp-env
tcp-env /var/qmail/bin/qmail-smtpd (和上面一行同在一行)
pop3 stream tcp nowait root /var/qmail/bin/qmail-popup
qmail-popup yourname /bin/checkpassword
/var/qmail/bin/qmail-pop3d Maildir(和上面两行同在一行)
其中yourname是您的完整的Internet主机名,Maildir 是采用的邮箱格式(这里我们使用较流行的Maildir格式)
2.检查/etc/services文件中是否有如下两行,如没有则添加进去:
smtp 25/tcp mail
pop3 110/tcp # Post Office
3. DNS中有关Qmail的设置.
如果Qmail的邮件是与Internet上的其它邮件服务器交互的话(否则只能此服务器的邮件用户相互收发邮件了),还需要在DNS服务器中设置有关 Qmail的条目(如果使用别人的DNS服务器,应向DNS管理员申请添加条目)即添加一条关于邮件交换的条目(具体的设置请向DNS管理员咨询)
4.控制文件的创建
Qmail的控制文件放在/var/qmail/control/下,如果不与Internet上的邮件服务器互传邮件的话,需要配置很多的文件。否则最简单的只需配置一个文件:me
它的内容是此邮件服务器的完整Internet主机名即:yourname
过程三:邮件用户的创建
邮件用户就是系统用户,所以您应该向系统添加用户,为了安全和管理的需要,最好创建一个E-mail用户组,将E-mail用户归属于此组,创建用户目录时最好在同一个文件系统下创建在同一个目录下(当然此文件系统不够大时可以创建在其它文件系统的某个目录下)
然后,在每个用户的初始目录下用命令:/var/qmail/bin/maildirmake创建邮箱目录并赋予适当的权限,您可以使用Shell脚本来完成每个用户邮箱的创建,下面是此脚本的一个简单的例子:
if test $1
then
useradd -d /usr/email-users/$1 -g emusers -s /bin/passwd $1
cd /usr/email-users/
mkdir $1
chown $1 $1
cd $1
/var/qmail/bin/maildirmake Maildir
echo ./Maildir/ > .qmail
chown $1 Maildir
chown $1 Maildir/*
chown $1 .qmail
passwd $1
else
fi
系统管理员可以使用emuadd email_user_name (此脚本的文件名,并将此文件存放在/bin下)来传建email_user_name的邮箱
过程四:Qmail系统的使用
当上述过程结束后重新启动计算机。
在邮件客户端程序中设置如下:(假如E-mail服务器的主机名为your,name,DNS中设置的邮件交换管理的域为mail.domain,注意:通常mail.domain与.name相同,以E-mail用户user为例)
电子邮件地址:user@mail.domain
SMTP服务器地址:yourname
POP3服务器地址:yourname
POP3账号:user
POP3账号密码:(由管理员给你,可以自己修改)
Qmail 运行有两种方式。tcpserver,xinet。 当域名解析有问题的时候,tcpserver运行会有问题。
qmail1.0.8,ucspi-tcp-0.88
(1) tcpserver方式
# pop3 设置
/usr/local/bin/tcpserver -P -H -R 0 pop-3 /var/qmail/bin/qmail-popup /home/vpopmail/bin/vchkpw /var/qmail/bin/qmail-pop3d Maildir 2>&1 | /var/qmail/bin/splogger &
# smtpd 设置
/usr/local/bin/tcpserver -H -R -t 1 -v -P -x/etc/qmail/tcp.smtp.cdb -u 511 -g 506 smtp /var/qmail/bin/qmail-smtpd /home/vpopmail/bin/vchkpw /bin/true | /var/qmail/bin/splogger &
(2) xinetd方式
/etc/xinetd.d/pop3-3
service pop-3
{
disable = no
socket_type = stream
wait = no
user = root
server = /var/qmail/bin/qmail-popup
nice = 10
server_args = home/vpopmail/bin/vchkpw /var/qmail/bin/qmail-pop3d Maildir &
}
/etc/xinetd.d/smtp
service smtp
{
disable = no
socket_type = stream
wait = no
user = vpopmail
server = /var/qmail/bin/qmail-smtpd
nice = 10
server_args = /home/vpopmail/bin/vchkpw /bin/true
}
qmail是一个模块化设计的邮件系统,每一个子功能都是由一个运行程序来实现的,而每个程序的属性以及运行方式由一个或多个配置文件和环境变量来控制的。在qmail安装成功和启动以后,qmail的相关进程一直在内存中驻留,qmail会不断扫描邮件队列,并且把邮件投递到正确的目的地址。
运行ps命令可以查看到qmail的相关进程:
#ps –ax | grep qmail
0:00.00 grep qmail
23282 con- I 0:00.77 qmail-send
23289 con- I 0:00.21 splogger qmail
23290 con- I 0:00.13 qmail-lspawn ./Mialdir/
23291 con- I 0:00.03 qmail-rspawn
23292 con- I 0:00.05 qmail-clean
qmail所有的运行程序都安装在/var/qmail/bin目录下。比较重要的运行程序如下:
1.qmail-smtpd
它的作用是接收远端主机投递的邮件,然后将邮件传递给qmail-queue进行处理。qmail-smtpd是通过SMTP协议和远端主机惊醒通讯的。qmail-smtpd并不是常驻内存的,他需要一个外部程序来激活,本文所做的系统是使用tcpserver来激活的。Tcpserver监视着系统的IP连接请求,如果检测到有SMTP的连接请求,tcpserver就会自动的激活qmail-smtpd,然后将IP连接的控制权交给qmail-smtpd,一旦qmail-smtpd和远端主机建立起SMTP连接后,远端主机就可以将邮件投递到本地的邮件服务器了。
2.qmail-inject
它的作用是接收本地生成并投递的邮件,并把邮件传递给qmail-queue来处理。在邮件传递给qmail-queue之前,qmail-inject先扫面邮件的邮件头,来查看邮件头是否符合RFC822标准,如果不符合它将会自动的更改和修正这个邮件的邮件头。
3.qmail-send
当一个邮件被放入邮件队列之后,qmail-send就开始对该邮件进行处理,。它会检查邮件队列中的每一个邮件的状态,对于没有投递过的和投递暂时失败的邮件,对于没有投递过和投递暂时失败的邮件,qmail-send会将目标地址是本地主机的传递给qmail-lspawn,目标地址是远端主机的传递给qmail-rspawn,对于投递永久失败的邮件,qmail-send将会把该邮件传递给qmail-clear,让这个程序永久删除这个邮件。qmail-send是一个常驻内存进程程序,如果qmail-send中止,qmail的其他进程将会自动中止。
4.qmail-clean
它的作用是从邮件队列中删除投递永久失败的邮件。qmail使用多种状态标示来标记邮件,每个邮件在每一次被处理后它的状态表示都会被改变。如果系统当机,系统重新启动以后,qmail-send仍然可以找到邮件队列中上次最后一次成功处理过的邮件的位置,并且从这里重新开始处理邮件队列。如果由于其他原因造成qmail-send不能处理的邮件队列,qmail-send会调用qmail-clean从邮件队列中删除邮件。qmail-clean也是常驻内存的进程。
5.qmail-rspawn
当qmail-send判明邮件目标地址是远端邮件服务器时,qmail-send就会将邮件交给qmail-rspawn,qmail-rspawn的作用是调度邮件的投递时间和顺序,然后激活qmail-remote来进行投递。qmail-rspawn还有一个作用是决定每一个邮件的目标邮件服务器,每次和远端邮件服务器的连接都会调用qmail-remote一次。qmail-rspawn也是常驻内存的进程。
6.qmail-lspawn
功能和qmail-rspawn类似,qmail-lspawn也是被qmail-send调度来投递邮件的,不过qmail-lspawn是负责目标地址是为本地邮件服务器的邮件。
7.qmail-remote
它的作用是通过SMTP协议将邮件投递到远端的用户。邮件是通过qmail-rspawn传递过来的,qmail-remote每次只可以同一个远端主机连接,不过在连接时qmail-remote可以投递这个远端主机上的多个接收者的邮件。投递当中的调度是由qmail-rspamwn来负责的。
8.qmail-local
它的作用是投递本地邮件服务器的邮件。这个程序通常是用来检测因为转发命令使用不当造成的邮件循环故障。
9.qmail-queue
他处理从qmail-inject和qmail-smtpd传递过来的邮件,并把这些邮件传递到邮件队列中,它会扫描每个邮件的发送者和接收者的地址,一般传递给qmail-queue的邮件的标示都是为0,如果为1时,它会认为这个邮件的发送者和接收者的地址要经过特殊格式的处理。