Tutoriais/sendmail-qmail-postfix/qmail-howto
De UnderLinux Wiki
Qmail How-to
Tabela de conteúdo |
Introdução
Qmail é um servidor de e-mail (MTA - Mail Transfer Agent) muito conhecido pela sua segurança e velocidade em máquinas *UNIX, até a presente data nunca foi encontrado um BUG de segurança no Qmail. Para se ter uma idéia o seu autor (Dan Bernstein) oferece $500 para quem conseguir encontrar uma brecha de segurança no Qmail que possa comprometer o S.O. (quer tentar? :)).
Essa segurança é possível porque ao contrário de outros MTA's (Sendmail, Smail, Exim, etc..) o Qmail não roda os seus processos com privilégios de "root" (somente dois processos tem privilégios de "root" - qmail-start e qmail-rspawn) e sim utiliza usuários especiais (qmaill, qmaild, qmails, etc) que não tem direitos/permissões decomprometer o sistema caso ocorra alguma falha no sistema.
O Qmail também é extremamente rápido, pois pode gerenciar milhões de e-mail's em um sistema moderado. Tem extrema facilidade para gerenciar domínios virtuais. Existe uma ferramenta que torna isso mais fácil ainda, é o Vpopmail.
O Qmail é um MTA totalmente modular, o que facilita a sua utilização. O grande diferencial de se utilizar todos esses softwares comentados nesse how-to, é que todos são de livre distribuição, ou seja, você não precisa pagar nenhum centavo para utilizá-los em seu servidor *UNIX.
Pré-requisitos
Para poder instalar o Qmail no seu servidor você precisa:
- Ter um S.O. *UNIX ou UNIX-like (Linux, FreeBSD, OpenBSD, etc), você encontra uma relação com todos os sistemas suportados no arquivo README do Qmail.
- Ter um compilador C (já está incluído na maioria das distribuições).
- Se você for utilizar SMTP (qmail-smtpd) e/ou POP3 (qmail-pop3d) vai precisar do ucspi-tcp e do checkpassword.
Instalação
Instalação de pré-requisitos
- ucspi-tcp: depois de fazer o download do pacote:
[root@localhost] tar xzvf ucspi-tcp-0.88.tar.gz [root@localhost] cd ucspi-tcp-0.88 [root@localhost] make setup check
- checkpassword : depois de fazer o download do pacote:
[root@localhost] tar xzvf checkpassword-0.90.tar.gz [root@localhost] cd checkpassword-0.90 [root@localhost] make && make setup check
Instalação do Qmail
Faça download do Qmail, depois:
[root@localhost] tar xzvf qmail-1.03.tar.gz [root@localhost] cd qmail-1.03
Caso você queira trocar o diretório $HOME do Qmail deverá editar o arquivo "conf-qmail" e substituir a primeira linha (/var/qmail) pelo diretório que você deseja instalar.
Se quiser trocar os usuários e grupos faça o mesmo com os arquivos "conf-users" e "conf-groups".
Obs.: Nesse how-to nós vamos utilizar os valores padrão para não confundir a cabeça de ninguém.
Obs.: Recomendo a leitura dos arquivos INSTALL.
Crie o diretório $HOME do Qmail:
[root@localhost] mkdir /var/qmail
Agora vamos criar os usuários e grupos para fazer a instalação do Qmail:
[root@localhost] groupadd nofiles [root@localhost] useradd -g nofiles -d /var/qmail/alias -s /bin/false alias [root@localhost] useradd -g nofiles -d /var/qmail -s /bin/false qmaild [root@localhost] useradd -g nofiles -d /var/qmail -s /bin/false qmaill [root@localhost] useradd -g nofiles -d /var/qmail -s /bin/false qmailp [root@localhost] groupadd qmail [root@localhost] useradd -g qmail -d /var/qmail -s /bin/false qmailq [root@localhost] useradd -g qmail -d /var/qmail -s /bin/false qmailr [root@localhost] useradd -g qmail -d /var/qmail -s /bin/false qmails
Com os usuários criados já podemos compilar o Qmail:
[root@localhost] make setup check
Terminada a compilação:
[root@localhost] ./config-fast host.domain.com Your fully qualified host name is host.domain.com Putting host.domain.com into control/me... Putting domain.com into control/defaultdomain... Putting com into control/plusdomain... Putting host.domain.com into control/locals... Putting host.domain.com into control/rcpthosts... Now qmail will refuse to accept SMTP messages except to host.domain.com. Make sure to change rcpthosts if you add hosts to locals or virtualdomains!
- Substitua "host.domain.com" pelo nome completo da sua máquina.
Obs.: Para facilitar, a partir de agora, "host.domain.com" é o nome completo da sua máquina e "domain.com" é o seu domínio padrão.
O último comando (./config-fast) criou a estrutura de controle do Qmail (/var/qmail/control) que contem os seguintes arquivos:
Arquivo Conteúdo Significado defaultdomain domain.com Seu domínio padrão locals host.domain.com Máquinas locais me host.domain.com A própria máquina plusdomain com Extensão do domínio (DPN) rcpthosts host.domain.com Máquinas com relay permitido
Agora crie os aliases:
[root@localhost] cd ~alias [root@localhost] echo "&seuemail@domain.com" > .qmail-postmaster [root@localhost] echo "&emaildoroot@domain.com" > .qmail-root [root@localhost] chmod 644 .qmail*
Substitua "seuemail@domain.com" pelo seu e-mail e "emaildoroot@domain.com" pelo e-mail da pessoa que se refere ao "root" desta máquina. Isso é necessário pois o Qmail não entrega e-mail para o "root" por motivos de segurança.
Para maiores informações sobre aliases consulte o arquivo INSTALL.alias.
Agora você precisa fazer uma escolha entre utilizar "Maildir" ou "Mailbox" (leia README.mbox e README.maildir), por motivos de maior compatilidade com as ferramentas para o Qmail nós vamos utilizar "Maildir", exemplo de ferramentas extremamente úteis para o Qmail que utilizam "Maildir":
- Vpopmail : Gerenciamento de domínios virtuais - Qmailadmin : Gerenciamento de domínios virtuais via WEB - Sqwebmail : Excelente Webmail
Criando o arquivo de inicialização do qmail com suporte a Maildir:
[root@localhost] cd /var/qmail [root@localhost] sed 's/Mailbox/Maildir/g' boot/home > rc [root@localhost] chmod 755 rc
Criando o arquivo de inicialização do qmail com suporte a Mailbox:
[root@localhost] cd /var/qmail [root@localhost] cp -p boot/home rc
Obs.: Utilize apenas um dos dois.
- Sendmail
Caso você tenha o sendmail instalado:
[root@localhost] killall -TERM sendmail [root@localhost] mv /usr/lib/sendmail /usr/lib/sendmail.old [root@localhost] mv /usr/sbin/sendmail /usr/sbin/sendmail.old [root@localhost] mv /usr/sbin/newaliases /usr/sbin/newaliases.old [root@localhost] ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail [root@localhost] ln -s /var/qmail/bin/sendmail /usr/lib/sendmail [root@localhost] ln -s /var/qmail/bin/newaliases /usr/sbin/newaliases
Caso você não tenha o sendmail instalado:
[root@localhost] ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail [root@localhost] ln -s /var/qmail/bin/sendmail /usr/lib/sendmail [root@localhost] ln -s /var/qmail/bin/newaliases /usr/sbin/newaliases
Já podemos startar o Qmail:
[root@localhost] sh -cf '/var/qmail/rc&'
- Veja sessão "Scripts".
Utilização
Existem várias formas de se utilizar o Qmail em uma máquina, eu vou listar e comentar aquí somente as mais utilizadas.
1- Utilizando o Qmail ao modo sendmail:
Este modo permite enviar e-mail's para os usuários ao modo sendmail (utilizando mail, pine, etc) existem muitas formas de se enviar um e-mail de um *UNIX e principalmente com o Qmail.
2- Utilizando o Qmail com um SMTP:
Permite o mesmo que a anterior mais envio de mensagens por SMTP e recebimento de e-mail's externos (internet/intranet).
3- Utilizando o Qmail com POP3:
Permite o mesmo que a anterior mais checagem de e-mail's via POP3.
Obs.: Não vamos configurar domínios virtuais, pois isso é assunto para outro how-to.
Para os nossos testes vamos utilizar um usuário chamado "homer" com a senha "teste1234".
[root@localhost] adduser homer [root@localhost] passwd homer Changing password for user homer New UNIX password: Retype new UNIX password: passwd: all authentication tokens updated successfully
Criando Maildir para "homer".
Para que o usuário "homer" possa receber e-mail's precisamos criar o seu "Maildir" que fica dentro de seu $HOME (/home/homer):
[root@localhost] cd /home/homer [root@localhost] /var/qmail/bin/maildirmake Maildir [root@localhost] echo "./Maildir/" > .qmail [root@localhost] chown homer: * -R
Como você percebeu terá que executar esse procedimento a cada usuário criado.
Para resolver esse incômodo siga as intruções:
[root@localhost] cd /etc/skel/ [root@localhost] /var/qmail/bin/maildirmake Maildir [root@localhost] echo "./Maildir/" > .qmail
Agora todo usuário que for criado já terá o seu Maildir com as devidas permissões. :)
Utilizando o Qmail ao modo sendmail
Mandando e-mail para o usuário "homer" com o comando "mail":
[root@localhost] echo "Isso é um teste."|mail -s "Testando 1" homer
Olha o que ocorreu no LOG:
[root@localhost] tail /var/log/maillog Jan 6 00:42:55 host qmail: 978748975.664907 new msg 325891 Jan 6 00:42:55 host qmail: 978748975.665310 info msg 325891: bytes 270 from qp 1771 uid 0 Jan 6 00:42:55 host qmail: 978748975.678995 starting delivery 1: msg 325891 to local homer@host.domain.com Jan 6 00:42:55 host qmail: 978748975.679283 status: local 1/10 remote 0/20Jan 6 00:42:55 host qmail: 978748975.850977 delivery 1: success: did_1+0+0/
Conforme o LOG (/var/log/maillog) informou, o usuário "homer" acabou de receber um e-mail do usuário "root", esse e-mail pode ser conferido em "/home/homer/Maildir/new"
[root@localhost] cd /home/homer/Maildir/new [root@localhost] more 978798513.1066.host.domain.com Return-Path: Delivered-To: homer@host.domain.com Received: (qmail 1063 invoked by uid 0); 6 Jan 2001 16:28:33 -0000 Date: 6 Jan 2001 16:28:33 -0000 Message-ID: <20010106162833.1062.qmail@host.domain.com> From: root@host.domain.com To: homer@host.domain.com Subject: Testando 1 Isso é um teste.
Você também pode utilizar o "qmail-inject" para enviar e-mail's:
[root@localhost] echo to:homer | /var/qmail/bin/qmail-inject
Isso provocará o mesmo efeito mas sem o campo "Subject", para maiores informações consulte os arquivos TEST.receive e TEST.deliver.
Utilizando um SMTP
Você também pode utilizar um SMTP (qmail-smtpd) para enviar e-mail's. Vamos utilizar agora a ferramenta "tcpserver" que está incluída no pacote "ucspi-tcp" (que já instalamos) para levantar o "qmail-smtpd":
[root@localhost] /usr/local/bin/tcpserver -u $(id -u qmaild) -g $(id -g qmaild) 0 25 /var/qmail/bin/qmail-smtpd 2>/dev/null&
- Veja sessão "Scripts".
- Maiores informações sobre o tcpserver.
- Enviando e-mail por SMTP:
[root@localhost] telnet 0 25 Trying 0.0.0.0... Connected to 0. Escape character is '^]'. 220 host.domain.com ESMTP helo 250 host.domain.com mail from: 250 ok rcpt to: 250 ok data 354 go ahead Subject: Testando 2 Isto é um teste de envio msg. . 250 ok 978804630 qp 1185 quit 221 host.domain.com Connection closed by foreign host.
E-mail enviado com sucesso, para verificar se o e-mail realmente chegou você pode dar uma olhada no LOG (/var/log/maillog) ou no diretório do usuário "homer" (/home/homer/Maildir/new). O LOG do Qmail fornece muitas informações interessantes.
Para enviar mensagens para outro domínio que não seja o seu você deverá adicioná-lo dentro do arquivo "/var/qmail/control/rcpthosts" ou então fazer controle por IP:
[root@localhost] cd /etc [root@localhost] echo "127.0.0.1:allow,RELAYCLIENT=""" >> relay.smtp
Isso faz com que o IP 127.0.0.1 (local) possa enviar e-mail's para qualquer domínio.
[root@localhost] echo "192.168.1:allow,RELAYCLIENT=""" >> relay.smtp
Isso faz com que a rede 192.168.1.0 (interna) possa enviar e-mail's para qualquer domínio.
[root@localhost] echo ":allow" >> relay.smtp
Isso faz com que qualquer IP/Rede possa enviar email's para qualquer domínio (péssima idéia :( ).
Agora precisamos criar um banco de dados com a ferramenta "tcprules" que está inclusa no pacote "ucspi-tcp" para que o Qmail possa utilizar essas informações:
[root@localhost] /usr/local/bin/tcprules relay.smtp.cdb relay.smtp.tmp < relay.smtp
Devemos agora parar o "qmail-smtpd" (se estiver rodando):
[root@localhost] kill -9 $(ps U qmaild|grep "tcpserver"|grep -v "grep"|awk '{print $1}')
Levantar o "qmail-smtpd" com a nova configuração:
[root@localhost] /usr/local/bin/tcpserver -x /etc/relay.smtp.cdb -u $(id -u qmaild) -g $(id -g qmaild) 0 25 /var/qmail/bin/qmail-smtpd 2>/dev/null&
Desta forma o Qmail simplesmente vai ignorar o conteúdo do arquivo "rcpthosts".
- Veja sessão "Scripts".
Com essa configuração você já pode enviar e-mail's para qualquer domínio.
Utilizando o Qmail com POP3
Para utilizar o Qmail com POP3 nós vamos precisar:
- checkpassword : (que nós já instalamos), como o nome já diz ele serve para checar o nome do usuário e sua senha no arquivo "/etc/passwd". - ucspi-tcp : (já instalado) para levantar o serviço de POP3.
[root@localhost] /usr/local/bin/tcpserver 0 110 /var/qmail/bin/qmail-popup domain.com /bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir 2>/dev/null&
- Veja sessão "Scripts".
Já podemos verificar os nossos e-mail's por POP3:
[root@localhost] telnet 0 110 Trying 0.0.0.0... Connected to 0. Escape character is '^]'. +OK <1201.978805768@domain.com> user homer +OK pass teste1234 +OK stat +OK 3 948 list +OK 1 349 2 311 3 288 . top 1 1 +OK Return-Path: Delivered-To: homer@host.domain.com Received: (qmail 1063 invoked by uid 0); 6 Jan 2001 16:28:33 -0000 Date: 6 Jan 2001 16:28:33 -0000 Message-ID: <20010106162833.1062.qmail@host.domain.com> From: root@host.domain.com To: homer@host.domain.com Subject: Testando 1 Isso é um teste. . dele 1 +OK top 2 1 +OK Return-Path: Delivered-To: homer@host.domain.com Received: (qmail 1076 invoked by uid 0); 6 Jan 2001 16:33:52 -0000 Date: 6 Jan 2001 16:33:52 -0000 Message-ID: <20010106163352.1075.qmail@host.domain.com> From: root@host.domain.com to: homer@host.domain.com . dele 2 +OK top 3 1 +OK Return-Path: Delivered-To: homer@host.domain.com Received: (qmail 1185 invoked from network); 6 Jan 2001 18:10:07 -0000 Received: from unknown (HELO ) (127.0.0.1) by 127.0.0.1 with SMTP; 6 Jan 2001 18:10:07 -0000 Subject: Testando 2 Isto é um teste d envio msg. . dele 3 +OK quit +OK Connection closed by foreign host.
Aquí você acompanhou uma sessão POP3 na linha de comando aonde:
- stat : lista o número de msg + tamanho total - list : lista as msg's + tamanho - top 1 1 : mostra a msg 1 com 1 linha depois do cabeçalho - dele 1 : deleta a msg número 1 - quit : finaliza a sessão
Enfim, mais um excelente servidor de e-mail funcionando.
Scripts
Esta sessão mostra alguns scripts shell com suporte a SYSV para controlar start/stop de:
- qmail-start (qmail-send)
- qmail-smtpd
- qmail-pop3d
- Maiores informações sobre scripts SYSV.
qmail-send
#!/bin/bash
#
# chkconfig: 2345 85 40
# description: qmail-send is a MTA.
# description(pt_BR): qmail é um MTA (Mail Agent Transfer).
# processname: qmail-send
# pidfile: /var/run/qmail-send.pid
# config: /var/qmail/rc
# info: Developed by Rodrigo Telles
# source function library
. /etc/rc.d/init.d/functions
PATH=/usr/bin:/bin:/usr/local/bin:/var/qmail/bin
name=qmail-send
chk=$(ps axf|grep "qmail-rspawn"|grep -v "grep"|awk '{print $1}')
alrm=$(ps axf|grep "${name}"|grep -v "grep"|awk '{print $1}')
qmail=/var/qmail/rc
pid=/var/run/$name.pid
case "$1" in
start)
if [ -z "$chk" ] ; then
if [ -f "$pid" ] ; then
printf "$name dead, but pid file exists (pid `cat $pid`).n"
fi
if [ -f "$qmail" ]; then
gprintf "Starting %s services: " "$name"
sh -cf $qmail &
sleep 1
ps axf|grep "qmail-rspawn"|grep -v "grep"
|awk '{print $1}' > $pid
touch /var/lock/subsys/$name
echo
else
printf "File $qmail not found.n"
exit 1
fi
else
gprintf "$name (pid "$chk") alread running...n"
fi
;;
stop)
if [ -z "$chk" ] ; then
printf "$name not running.n"
exit 1
else
gprintf "Stopping %s services: " "$name"
kill -9 $chk
rm -f /var/lock/subsys/$name
rm -f $pid
echo
fi
;;
restart|reload)
$0 stop
$0 start
;;
status)
status $name
;;
alarm)
if [ "$chk" ] ; then
gprintf "Sending ALARM signal for %s: " "$name"
kill -ALRM $alrm
echo
else
printf "$name not running.n"
exit 1
fi
;;
*)
gprintf "Usage: %s {start|stop|status|restart|alarm}n" "$name"
exit 1
esac
exit 0
qmail-smtpd
#!/bin/bash
#
# chkconfig: 2345 86 41
# description: qmail-smtpd is a SMTP Daemon.
# description(pt_BR): qmail-smtpd é um SMTP Server.
# processname: qmail-smtpd
# pidfile: /var/run/qmail-smtpd.pid
# config: /var/qmail/controls/*
# info: Developed by Rodrigo Telles
# source function library
. /etc/rc.d/init.d/functions
PATH=/usr/bin:/bin:/usr/local/bin:/var/qmail/bin
name=qmail-smtpd
QUSER=$(id -u qmaild)
QGROUP=$(id -g qmaild)
pid=/var/run/$name.pid
chk=$(ps U $QUSER|grep "tcpserver"|grep -v "grep"|grep -v "_"|awk '{print $1}')
[ -f "/etc/relay.smtp.cdb" ] && RELAY="-x /etc/relay.smtp.cdb"
case "$1" in
start)
if [ -z "$chk" ] ; then
if [ -f "$pid" ] ; then
printf "$name dead, but pid file exists (pid `cat $pid`).n"
fi
gprintf "Starting %s services: " "$name"
tcpserver $RELAY -u $QUSER -g $QGROUP -c 500 0 smtp $name 2>/dev/null &
sleep 1
ps U $QUSER|grep "0 smtp"|grep -v "_"|awk '{print $1}' >$pid
touch /var/lock/subsys/$name
echo
else
printf "$name (pid "$chk") alread running...n"
exit 1
fi
;;
stop)
if [ -z "$chk" ] ; then
printf "$name not running.n"
exit 1
else
gprintf "Stopping %s services: " "$name"
kill -9 $chk
rm -f /var/lock/subsys/$name
rm -f $pid
echo
fi
;;
restart|reload)
$0 stop
$0 start
;;
status
if [ -z "$chk" ] ; then
if [ -f "$pid" ] ; then
printf "$name dead, but pid file exists (pid `cat $pid`).n"
else
printf "$name not running.n"
exit 1
fi
else
printf "$name (pid $chk) is runnig...n"
exit 1
fi
;;
*)
gprintf "Usage: %s {start|stop|status|restart}n" "$name"
exit 1
esac
exit 0
qmail-pop3d
#!/bin/bash
#
# chkconfig: 2345 87 42
# description: qmail-pop3d is a POP3 Daemon.
# description(pt_BR): qmail-pop3d é um POP3 Server.
# processname: qmail-pop3d
# pidfile: /var/run/qmail-pop3d.pid
# info: Developed by Rodrigo Telles
# source function library
. /etc/rc.d/init.d/functions
PATH=/usr/bin:/bin:/usr/local/bin:/var/qmail/bin
name=qmail-pop3d
chkpwd=checkpassword
pid=/var/run/$name.pid
chk=$(ps -Afw|grep "0 110"|grep -v "grep"|awk '{print $2}')
if [ -f "/etc/resolv.conf" ] ; then
domain=$(grep "search" /etc/resolv.conf|awk '{print $2}')
else
printf "File /etc/resolv.conf not found, aborting...n"
exit 1
fi
case "$1" in
start)
if [ -z "$chk" ] ; then
if [ -f "$pid" ] ; then
printf "$name dead, but pid file exists (pid `cat $pid`).n"
fi
if [ -z "$domain" ] ; then
printf "Unresolved domain, aborting...n"
exit 1
fi
gprintf "Starting %s services: " "$name"
tcpserver -c 500 -H -R 0 110 qmail-popup $domain
$chkpwd $name Maildir 2>/dev/null &
sleep 1
ps -Afw|grep "0 110"|grep -v "grep"|awk '{print $2}' >$pid
touch /var/lock/subsys/$name
echo
else
printf "$name (pid "$chk") alread running...n"
exit 1
fi
;;
stop)
if [ -z "$chk" ] ; then
printf "$name not running.n"
exit 1
else
gprintf "Stopping %s services: " "$name"
kill -9 $chk
rm -f /var/lock/subsys/$name
rm -f $pid
echo
fi
;;
restart|reload)
$0 stop
$0 start
;;
status)
if [ -z "$chk" ] ; then
if [ -f "$pid" ] ; then
printf "$name dead, but pid file exists (pid `cat $pid`).n"
else
printf "$name not running.n"
exit 1
fi
else
printf "$name (pid $chk) is runnig...n"
exit 1
fi
;;
*)
gprintf "Usage: %s {start|stop|status|restart}n" "$name"
exit 1
esac
exit 0
Epílogo
Você também pode utilizar o Qmail no "inetd", para maiores informações consulte o arquivo INSTALL.
Esse não seria um how-to se eu não coloca-se esse link para consulta:
Life with qmail com certeza vale uma visita.
Espero que esse how-to seja de grande utilidade para todos. O how-to acaba aquí, espero que você tenha tido sucesso na sua instalação também, caso você tenha tido problemas seguindo esse how-to fique a vontade para entrar em contato comigo - Rodrigo Telles.
Créditos
Tutorial no underlinux: http://www.underlinux.com.br/content/view/4552/70/
Este tutorial foi desenvolvido por Rodrigo Telles e editado no wiki por Duca.
--Duca 14:54, 12 Janeiro 2006 (BRDT)


