Feb 09 2006

Qmail/POP3

Premize

Am instalat de-a lungul timpului mai mutle versiuni de servere de mail, dar pana la urma qmail a ramas si cred ca va ramane preferat. Cum nu am instalat decat o singura data serverul de mail pentru un singur domeniu, nu voi intra in detalii pentru acest tip de instalare. Mi se pare mult mai interesant (pentru ca la urma urmei se poate simplifica :) ) sa descriu intalarea unui server de mail care sa “tina” mai multe domenii virtuale, cu acces prin POP3 (IMAP mi se pare a fi prea slab, si dupa cate exploituri am vazut, este o idee cam depasit)

Si acum sa incepem cu intalarea pas cu pas.

Este nevoie de pachetul qmail de la qmail.org, de preferinta ultimul disponibil. Se mai pot folosi si diverse alte pachete aditionale, fie de la qmail.org, fie din alta parte, dar acestea sunt detalii in care nu voi intra in acest mini how-to.

Instalarea Qmail

Se desface pachetul /qmail-1.03.tar.gz in /usr/local/src/, sau in orice alta parte a sistemului de fisiere (dar ar fi bine acolo:)), si preferabil se urmeaza pas cu pas ce scrie in fisierele de configurare. Eu prefer sa folosesc scriptul urmator, rulat din directorul unde am dezarhivat qmail, face aceiasi pasi, dar ii face singur :) . In primul rand trebuie sa fii root pe masina ca sa fie totul OK.

#!/bin/bash

echo "##############################################################"

# 1. Create the qmail home directory:

mkdir /var/qmail

# 2. Read INSTALL.ids. You must set up the qmail group and the qmail
#    users before compiling the programs.

groupadd nofiles
useradd -g nofiles -d /var/qmail/alias alias
useradd -g nofiles -d /var/qmail qmaild
useradd -g nofiles -d /var/qmail qmaill
useradd -g nofiles -d /var/qmail qmailp
groupadd qmail
useradd -g qmail -d /var/qmail qmailq
useradd -g qmail -d /var/qmail qmailr
useradd -g qmail -d /var/qmail qmails

# 3. Compile the programs and create the qmail directory tree:

make setup check

# ATENTIE ! daca qmail este deja instalat in sistem aici va fi o
# mare eroare, asa ca ar trebui sters dir /var/qmail cu totul
# si rulat din nou acest script

# 4. Read INSTALL.ctl and FAQ. Minimal survival command: 

./config

# In general, daca DNS-ul nu este configurat corect, aici se primeste o mare
# eroare, dar nici o problema, vom rezolva problema ceva mai tarziu :) 

# 5. Read INSTALL.alias. Minimal survival command:

(cd ~alias; touch .qmail-postmaster .qmail-mailer-daemon .qmail-root)
chmod 644 ~alias/.qmail*

# 6. Read INSTALL.mbox and INSTALL.vsm.

# 7. Read INSTALL.maildir.

# 8. Copy /var/qmail/boot/home (or proc) to /var/qmail/rc.

#To test qmail deliveries (won't interfere with sendmail):

# 9. Enable deliveries of messages injected into qmail:
# csh -cf '/var/qmail/rc &'

#10. Read TEST.deliver.

#To upgrade from sendmail to qmail:

#11. Read SENDMAIL. This is what your users will want to know about the
#    switch from sendmail to qmail.

#12. Read REMOVE.sendmail. You must remove sendmail before installing
#    qmail.

killall -9 sendmail
for i in $( find /etc/ -path '/etc/*sendmail'); do rm -rf $i; done

#13. Read REMOVE.binmail.

#14. Add
#            csh -cf '/var/qmail/rc &'
#    to your boot scripts, so that the qmail daemons are restarted
#    whenever your system reboots. Make sure you include the &.

#15. Make qmail's `sendmail'' wrapper available to MUAs:

mv -f /usr/sbin/sendmail /usr/sbin/sendmail.old
ln -sf /var/qmail/bin/sendmail /usr/sbin/sendmail

#    /usr/sbin might not exist on your system.
#
#16. Set up qmail-smtpd in /etc/inetd.conf (all on one line):
#            smtp stream tcp nowait qmaild /var/qmail/bin/tcp-env
#            tcp-env /var/qmail/bin/qmail-smtpd
#
#17. Reboot. (Or kill -HUP your inetd and make sure the qmail daemons
#    are running.)
#
#18. Read TEST.receive.

chmod 600 /var/log/maillog
chown qmaild.qmail /var/log/maillog

echo "############################################################"

Ar fi insa bine si frumos sa se citeasca si documentatia originala :)

In acest moment pe masina Linux sunt realizate premizele pentru functionarea qmail. Urmatorul script trebuie plasat in /etc/init.d/ cu numele de qmaild

#!/bin/bash
# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Source sendmail configureation.

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

# See how we were called.
case "$1" in
  start)
        # Start daemons.
        echo -n "Starting qmail: "
        env - PATH="/var/qmail/bin:$PATH"
        csh -cf 'qmail-start ./Maildir/ splogger qmail &' 2>/dev/null >/dev/null
        daemon echo
        echo
        ;;
  stop)
        # Stop daemons.
        echo -n "Shutting down qmail: "
        killproc qmail-send
        echo
        ;;
  restart)
        $0 stop
        $0 start
        ;;
  status)
        g=$(status qmail-send)
        echo qmail $(echo $g|cut -f2-200 -d" ")
        ;;
  *)
        echo "Usage: qmail {start|stop|restart|status}"
        exit 1
esac

exit 0

si apoi rulam urmatoarele comenzi :

chmod 755 /etc/init.d/qmaild
chown root. /etc/init.d/qmaild
ln -sf /etc/init.d/qmaild /etc/rc.d/rc3.d/S80qmaild
ln -sf /etc/init.d/qmaild /etc/rc.d/rc5.d/S80qmaild

pentru ca, in principiu, la celelalte nivele nu prea mai am nevoie de mail :) . Inca un fisier :

service smtp
{
        socket_type     = stream
#       log_type        = FILE /var/log/smtp.log
        protocol        = tcp
        wait            = no
        user            = qmaild
        server          = /var/qmail/bin/tcp-env
        server_args     = /var/qmail/bin/myrelay
        log_on_success  = HOST
        log_on_failure  = HOST RECORD
        disable         = no
}

cu numele de /etc/xinetd.d/qmail. Si punem si niste drepturi pe el:

chmod 644 /etc/xinetd.d/qmail
chown root. /etc/xinetd.d/qmail

Ca sa nu las jumatate din internet sa faca relay prin mine ca sa dea spam pentru cealalta jumatate de internet, editez si limitarea de relay /var/qmail/bin/myrelay :

#!/usr/bin/perl
if ($ENV{TCPREMOTEIP}=~m/^127.0.0.1$/ or
    $ENV{TCPREMOTEIP}=~m/^192.168.1.d+$/
        ) { $ENV{RELAYCLIENT}=""; }
system ("/var/qmail/bin/qlog 25 \"Start \">>/var/log/maillog 2>/dev/null");
system ("/var/qmail/bin/qmail-smtpd");
system ("var/qmail/bin/qlog 25 \"Stop \">>/var/log/maillog 2>/dev/null");

si mai pun si drepturi pe el :

chmod 755 /var/qmail/bin/myrelay
chown root. /var/qmail/bin/myrelay

Ceea ce este in fisierul acesta se citeste cam asa : permit lui 127.0.0.1 si prietenilor mei din reteaua interna 192.168.1.0/24 sa trimita mail folosind acest server de mail, si voi loga actiunile lor in /var/log/maillog. Bineinteles ca acest fisier se editeaza functie de nevoile firesti ale fiecarei retele :) .

In acest moment, daca nu am primit si mesaje de eroare la instalare, ar trebui doar sa restartez doua servicii si ar merge totul uns … Dar mai bine sa verific:

La instalare, daca DNS-ul e setat corect, in /var/qmail/control ar trebui sa am cam asa :

total 40
drwxr-xr-x    2 root     qmail        4096 Aug 25 10:09 .
drwxr-xr-x   10 root     qmail        4096 Feb 15  2002 ..
-rw-r--r--    1 root     root           90 Aug 25 10:06 badmailfrom
-rw-r--r--    1 root     root           16 Apr  3 19:32 defaultdomain
-rw-r--r--    1 root     root           16 Apr  8 12:15 locals
-rw-r--r--    1 root     root           16 Apr  3 19:32 me
-rw-r--r--    1 root     root           16 Apr  8 12:13 plusdomain
-rw-r--r--    1 root     root            6 Feb 14  2002 queuelifetime
-rw-r--r--    1 root     root           43 May 10 08:54 rcpthosts
-rw-r--r--    1 root     root           54 Apr  8 12:15 virtualdomains

Daca a dat eroare nu am nimic, daca nu am eroare am cate ceva, dar … facem de mana :

DOMENIU=mail.domeniul.meu
cd /var/qmail/control
touch badmailform #aici pun cuvinte de genul porn
echo $DOMENIU > defaultdomain
echo $DOMENIU > locals
echo $DOMENIU > me
echo $DOMENIU > plusdomain
echo 86400 > queuelifetime # desi e recomandat mai mult
echo $DOMENIU > rcpthosts
touch virtualdomains

unde poveste sta cam asa : daca domeniul meu se numeste domeniul.meu, declar in DNS un host pe care sa-l cheme mail.domeniul.meu, si pe acel host il pun in filele de mai sus (asta doar daca vreau sa primesc mail de forma user@domeniul.meu si sa mai am si mail pe alte domenii, tinute tot pe masina asta, daca nu … pot sa inchizi browserul, pentru ca oricum nu te mai intereseaza :) ). In celelalte fisiere editam mai tarziu …

Si acum sa-i dam drumul, sa testam ca merge. In primul si in primul rand repornim servicii :

service xinetd restart
service qmaild restart

si ar trebui sa nu avem nici un [FAILED]. Daca avem reverificam sintaxa din /etc/xinetd.d/qmail si /etc/init.d/qmaild, trebuie sa arate exact cum sunt scrise mai sus.

Acum testam serviciul de mail, daca merge cum trebuie. In primul rand

netstat -atuv | grep smtp

trebuie sa dea o linie de genul :

tcp        0      0 *:smtp                  *:*                     LISTEN

Trimitem un mail la o adresa unde putem sa verificam mailu’ :

ls -la | mail -s "teste" user@adresa_cunoscuta

si verificam in logurile de mail

 tail -20 /var/log/maillog

ultimele linii ar trebui sa arate asa :

linux qmail: 1030281357.107265 new msg 167636
linux qmail: 1030281357.107380 info msg 167636: bytes 882 from  qp 8689 uid 0
linux qmail: 1030281357.134280 starting delivery 1: msg 167636 to remote root@domeniul.meu
linux qmail: 1030281357.134383 status: local 0/10 remote 1/20
linux qmail: 1030281358.128509 delivery 1: success: 192.168.1.1_accepted_message./Remote_host_said:_250_ok_1030299440_qp_14798/
linux qmail: 1030281358.128615 status: local 0/10 remote 0/20
linux qmail: 1030281358.128635 end msg 167636

Trimitem acum un mail de pe o adresa cunoscuta :

ls -la | mail -s "teste" root@domeniul.meu

dar inainte fac urmatoarele :

echo "|/var/qmail/bin/preline cat > /dev/null" > ~alias/.qmail-root
echo "|/var/qmail/bin/preline cat > /dev/null" > ~alias/.qmail-postmaster
echo "|/var/qmail/bin/preline cat > /dev/null" > ~alias/.qmail-mailer-daemon

ca oricum nu-mi trebuie nici un fel de mail pe hostul mail.domeniul.meu, mie imi trebui mail pe domeniul.meu si in logurile de mail trebuie sa am :

linux qmail: 1030282380.161764 new msg 167636
linux qmail: 1030282380.161880 info msg 167636: bytes 2153 from  qp 8787 uid 501
linux qmail: 1030282380.164885 starting delivery 2: msg 167636 to local root@domeniul.meu
linux qmail: 1030282380.165012 status: local 1/10 remote 0/20
linux qmail: 1030282380.176761 delivery 2: success: did_0+0+1/
linux qmail: 1030282380.176873 status: local 0/10 remote 0/20

In momentul acesta serverul de smtp este functional, nu am casute postale, dar vor fi facute virtual mai tarziu…

Instalare POP3 pentru domenii virtuale

Undeva, pe la inceputul acestui mic ghid, aminteam de checkpoppasswd. Acest binar (daca este cazul il recompilezi, cum si ce se afla in sursa c), se copie in /bin/ si

chmod 0755 /bin/checkpoppasswd

Editam /etc/xinetd.d/qpopper

service pop3
{
        socket_type     = stream
        protocol        = tcp
#       log_type        = FILE /var/log/popper.log
        wait            = no
        user            = root
        server          = /var/qmail/bin/qmail-popup
        server_args     = mailserver /bin/checkpoppasswd /var/qmail/bin/qmail-pop3d Maildir
        log_on_success  = HOST
        log_on_failure  = HOST RECORD
        disable         = no
}

Am activat suportul pentru Maildir, asta ca sa creeze un singur fisier pentru fiecare mesaj primit, nu ca sa cumuleze toate mesajele intr-un singur fisier, din experienta am vazut ca se pot pierde toate mesajele :( . Acum

cp /usr/local/src/checkpoppasswd /bin/ # doar daca n-am facut asta !
chmod 755 /bin/checkpoppasswd
service xinetd restart
netstat -atuv | grep pop3

si raspunsul trebuie sa arate

tcp        0      0 *:pop3                  *:*                     LISTEN

Mai putem face testul clasic :

telnet 127.0.0.1 110

si trebuie sa arate cam asa :

Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
+OK <9358.1030284461@mailserver>

Daca nu merge, ma mai uit in /etc/xinetd.d/qpopper !

In acest moment avem cele doua servicii pentru mail active, avem smtp, avem pop3 … hmm, cred ca ar trebui sa ne facem si conturi :)

Conturile de e-mail

in principiu, chestia asta numita mail virtual, asa cum este implementata aici, presupune un singur user de sistem, care tine in directorul propriu toate casutele postale de pe domeniile virtuale, organizate foarte clar pe structura de directoare.

Comanda

groupadd popuser
useradd -g popuser -d /home/vmail -s /bin/false popuser

face un user popuser cu home in /home/vmail. Ar fi frumos sa verific si in /etc/passwd sa am o linie :

popuser:x:507:507::/home/vmail:/bin/false

Daca nu este la fel o editez sa fie asa (securitatea, ea ii de vina !).

Acum ma joc de-a scripturile … Creez in ~popuser/bin tot ce am nevoie pentru administrarea ulterioare a domeniilor/userilor virtuali.

mkdir -m 0700 /home/vmail/domains
chown popuser.popuser /home/vmail/domains
echo "." > /var/qmail/users/assign

Scripta de creat domenii virtuale :

####################################################################
#!/bin/bash

if [ -e $1 ]; then
        echo "1.Sintaxa: newdom domeniu"
        exit 1
fi

if [ $(($(cat /var/qmail/control/virtualdomains | grep $1 | wc -l ))) ];
then
        echo "2. domeniu exista in /home/vmail/domains/"
        exit 1
fi

echo $1 >> /var/qmail/control/rcpthosts
echo $1:$1 >> /var/qmail/control/virtualdomains

mkdir -m 0700 /home/vmail/domains/$1
chown popuser.popuser /home/vmail/domains/$1

service qmaild restart

#####################################################################

Scripta de creat useri pe domeniile virtuale

#######################################################################
#!/bin/bash

if [ -e $1 ]; then
        echo "1.Sintaxa: newuser user_nou parola_user domeniu"
        exit 1
fi

if [ -e $2 ]; then
        echo "2.Sintaxa: newuser user_nou parola_user domeniu"
        exit 1
fi

if [ -e $3 ]; then
        echo "3.Sintaxa: newuser user_nou parola_user domeniu"
        exit 1
fi

exista=$(ls /home/vmail/domains/$3/ | grep $1 | wc -l);
dir="/home/vmail/domains/"$3

if [ $exista -eq 0 ]; then
        dir="/home/vmail/domains/"$3;
        uid=$(cat /etc/passwd | grep popuser | cut -f3 -d":")
        gid=$(cat /etc/passwd | grep popuser | cut -f4 -d":")
        mkdir -m 0700 $dir/$1;
        mkdir -m 0700 $dir/$1/Maildir;
        mkdir -m 0700 $dir/$1/Maildir/new;
        mkdir -m 0700 $dir/$1/Maildir/cur;
        mkdir -m 0700 $dir/$1/Maildir/tmp;
        echo $dir"/"$1"/Maildir/" > $dir/$1/.qmail;
        chmod 0600 $dir/$1/.qmail;
        chown -R popuser.popuser $dir/$1;
        (
        echo "="$3"-"$1":popuser:"$uid":"$gid":/home/vmail/domains/"$3"/"$1"/:::"
        cat /var/qmail/users/assign
        ) > /var/qmail/users/assign.tmp
        cat /var/qmail/users/assign.tmp > /var/qmail/users/assign
#       cat /var/qmail/users/assign

        parola=$(htpasswd -nb $1 $2 | cut -f2 -d":");

        (
        cat /var/qmail/users/poppasswd;
        echo $1":"$parola":popuser:/home/vmail/domains/"$3"/"$1;
        ) >/var/qmail/users/poppasswd.tmp
        cat /var/qmail/users/poppasswd.tmp > /var/qmail/users/poppasswd
#       cat /var/qmail/users/poppasswd

        /var/qmail/bin/qmail-newu || true 2>&1

        echo "Contul << "$1" >> a fost adaugat cu success";
        echo "Contul "$1"( parola "$2" ) a fost adaugat cu succes. Verifica ! "
	echo " ------------------------------------ "
	cat /var/qmail/users/assign
	echo " ------------------------------------ "
	cat /var/qmail/users/poppasswd
else
        echo "Contul  << "$1@$3" >> exista";
fi

	echo " ------------------------------------ "
	cat /var/qmail/users/assign
	echo " ------------------------------------ "
	cat /var/qmail/users/poppasswd

#######################################################################

Scripta ce sterge un user de pe domeniul virtual

####################################################################

#!/bin/bash

if [ -e $1 ]; then
        echo "1.Sintaxa: deluser user domeniu"
        cat /var/qmail/users/assign
        exit 1
fi

if [ -e $2 ]; then
        echo "2.Sintaxa: deluser user domeniu"
        cat /var/qmail/users/assign
        exit 1
fi

exista=$(ls /home/vmail/domains/$2/ | grep $1 | wc -l);
dir="/home/vmail/domains/"$2

if [ $exista -eq 1 ]; then
        rm -rf $dir/$1;

        cat /var/qmail/users/assign | grep -v $1 > /var/qmail/users/assign.tmp
        cat /var/qmail/users/assign.tmp > /var/qmail/users/assign
#       cat /var/qmail/users/assign

        cat /var/qmail/users/poppasswd | grep -v $1 >/var/qmail/users/poppasswd.tmp
        cat /var/qmail/users/poppasswd.tmp > /var/qmail/users/poppasswd
#       cat /var/qmail/users/poppasswd

        /var/qmail/bin/qmail-newu || true 2>&1

        echo "Contul << "$1" >> a fost sters cu success";
        echo "Contul "$1"  a fost sters cu succes. Verifica ! "
else
        echo "Contul  << "$1" >> nu exista";
fi
        cat /var/qmail/users/assign | grep $2 | cut -f2 -d"-" | cut -f1 -d":" | sort -u

####################################################################

Scripta de sters domenii

###################################################################

#!/bin/bash

if [ -e $1 ]; then
        echo "1.Sintaxa: deldom domeniu"
        cat /var/qmail/users/assign
        exit 1
fi

exista=$(ls /home/vmail/domains/ | grep $1 | wc -l);
dir="/home/vmail/domains/"$1

if [ $exista -eq 1 ]; then
        rm -rf $dir;

        cat /var/qmail/users/assign | grep -v $1 > /var/qmail/users/assign.tmp
        cat /var/qmail/users/assign.tmp > /var/qmail/users/assign
#       cat /var/qmail/users/assign

        cat /var/qmail/users/poppasswd | grep -v $1 >/var/qmail/users/poppasswd.tmp
        cat /var/qmail/users/poppasswd.tmp > /var/qmail/users/poppasswd
#       cat /var/qmail/users/poppasswd

        /var/qmail/bin/qmail-newu || true 2>&1

        echo "Domeniul << "$1" >> a fost sters cu success";
        echo "Domeniul "$1"  a fost sters cu succes. Verifica ! "
else
        echo "Domeniul  << "$1" >> nu exista";
fi

####################################################################

GATA !

Si cu asta am terminat … De aici incolo se administreaza userii, domeniile virtuale, samd. Problemele care pot apare (90%) sunt din cauza operatiei copy&paste din pagina in terminal, asa ca trebuie doar atentie ca cele doua versiuni ale scriptului sa fie identice ! In rest nu am avut niciodata probleme :) Documentatia amanuntita se gaseste la qmail.org, este plin siteul si de diverse unelte, aici am facut doar un exemplu de instalare rapida pentru serviciu :)

Comentarii