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 fromqp 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 fromqp 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






