Hace ya varios años que tengo funcionando un servidor QMail sobre un Fedora 4 !! y creo que lo he reiniciado solo en un par de ocasiones. Como me propuse modernizarlo un poco, acá dejo mis notas sobre la instalación de un servidor (MTA) de mail QMail del gran Dan Bernstein en un CentOS 5.5. También he realizado esta instalación sobre RHEL 4 y 5 sin problemas.
Esta instalación tiene como base la guía qmailrocks, pero con varias modificaciones de acuerdo a los patch’s creados por el gran jsimpson.
Esto no pretende ser una receta de cocina de instalación de un MTA, son solo notas de instalación con algunos comentarios útiles para saber como encararla.
Entonces manos al a obra:
Necesitamos instalar:
1. Apache Web Server
2. PHP
3. Perl
4. GCC
5. MySQL
6. OpenSSL
7. OpenSSL-dev
8. libssl-dev
9. wget
10. patch & patchutils
NO necesitamos instalar:
1. Postfix
2. Ningún Pop Service
3. Ningún SMTP Service, salvo Sendmail
Modulos Perl a instalar:
Digest::SHA1
Digest::HMAC
Net::DNS
Time::HiRes
HTML::Tagset
HTML::Parser
Puertos Firewall:
Outbound ports (tcp) :
25 – SMTP
110 – POP services
143 – IMAP
783 – Spamassassin
993 – IMAPS
Inbound Ports (tcp) :
25 – SMTP
80 – HTTP
110 – POP services
143 – IMAP
443 – HTTPS
783 – Spamassassin
993 – IMAPS
Descargas:
Creamos un directorio /downloads y descargamos todo este soft en dicho directorio.
#mkdir /downloads
#cd /downloads
QMail:
# wget http://cr.yp.to/software/qmail-1.03.tar.gz
EZMLM
# wget http://www.ezmlm.org/archive/7.0.2/ezmlm-idx-7.0.2-1.x86_64.rpm
AUTORESPONDER
# wget http://www.inter7.com/devel/autorespond-2.0.5.tar.gz
VPOPMAIL
# wget http://ufpr.dl.sourceforge.net/project/vpopmail/vpopmail-stable/5.4.30/vpopmail-5.4.30.tar.gz
VQADMIN
# wget http://softlayer.dl.sourceforge.net/project/vqadmin/vqadmin/2.3.6/vqadmin-2.3.6.tar.gz
MAILDROP
# wget http://ufpr.dl.sourceforge.net/project/courier/maildrop/2.5.0/maildrop-2.5.0.tar.bz2
QMAILADMIN
wget http://ufpr.dl.sourceforge.net/project/qmailadmin/qmailadmin-stable/1.2.14/qmailadmin-1.2.14.tar.gz
Descargar ucspi-tcp & daemontools:
# wget http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz
# wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
# wget http://djbware.csi.hu/patches/daemontools-0.76.errno.patch
# wget http://www.qmail.org/moni.csi.hu/pub/glibc-2.3.1/ucspi-tcp-0.88.errno.patch
# wget http://qmail.jms1.net/ucspi-tcp/ucspi-rss2.patch
# wget http://qmail.jms1.net/ucspi-tcp/tcpserver-limits-2007-12-22.patch
Descargar patches de John Simpson: ojo, verifiquemos las ultimas versiones.
# wget http://qmail.jms1.net/patches/qmail-1.03-jms1.7.08.patch
# wget http://qmail.jms1.net/patches/qmail-1.03-jms1.7.08.patch.asc
Descargamos scripts de inicialización, jsimpson_patch, finalización y otros:
# wget https://dl.dropboxusercontent.com/u/5878683/hvivani.com.ar/qmail/initial_install_script.sh
# wget https://dl.dropboxusercontent.com/u/5878683/hvivani.com.ar/qmail/aplica_jsimpson_patch.sh
# wget https://dl.dropboxusercontent.com/u/5878683/hvivani.com.ar/qmail/finalize_install_script.sh
# wget https://dl.dropboxusercontent.com/u/5878683/hvivani.com.ar/qmail/check_perlmods.script
Comenzamos:
ejecutamos script inicial:
# /downloads/initial_install_script.sh
# /downloads/aplica_jsimpson_patch.sh
compilamos QMAIL:
# cd /usr/src/qmail/qmail-1.03
# make man && make setup check
# config-fast mail.dominio.com
Instalamos Certificado:
# make cert
# chown -R vpopmail:qmail /var/qmail/control/clientcert.pem /var/qmail/control/servercert.pem
Compilamos ucspi-tcp:
# cd /usr/src/qmail/ucspi-tcp-0.88/
Aplicamos patch antes de compilar:
# patch < /downloads/ucspi-tcp-0.88.errno.patch
# patch < /downloads/ucspi-rss2.patch
3 patch < /downloads/tcpserver-limits-2007-12-22.patch
# make && make setup check
Compilamos daemontools:
# cd /package/admin/daemontools-0.76
Aplicamos patch antes de compilar:
# cd /package/admin/daemontools-0.76/src
# patch < /downloads/daemontools-0.76.errno.patch
# cd /package/admin/daemontools-0.76
# package/install
Ejecutamos la verificación de permisos de John Simpson:
# wget http://qmail.jms1.net/scripts/vfixpermissions
# /downloads/vfixpermissions
Instalamos EZMLM (listas de correo)
# cd /downloads
# rpm -i ezmlm-idx-7.0.2-1.x86_64.rpm
Instalamos AUTORESPONDER (autorespuesta)
# cd /downloads
# tar zxvf autorespond-2.0.5.tar.gz
# cd autorespond-2.0.5
# make && make install
Instalamos VPOPMAIL (dominios de mail virtuales)
# cd /downloads
# tar zxvf vpopmail-5.4.30.tar.gz
# cd vpopmail-5.4.30
# ./configure –enable-logging=p
#make && make install-strip
Instalamos VQADMIN (interfaz web para administrar vpopmail)
# cd /downloads
# tar zxvf vqadmin-2.3.6.tar.gz
# cd vqadmin-2.3.6
# ./configure –enable-cgibindir=/var/www/cgi-bin –enable-htmldir=/var/www/html
Error al configurar en 64bits. Ver este comentario:
vqadmin has old config.guess and config.sub files do not have the
definitions for the 64 bit operating systems. You can copy those files from a
recent vpopmail release and it should configure just fine. I did this
last week and it worked.
So:
# /downloads/vqadmin-2.3.6
# mv config.guess config.guess.20100907
# mv config.sub config.sub.20100907
# cp ../vpopmail-5.4.30/config.sub .
# cp ../vpopmail-5.4.30/config.guess .
Y hacemos de nuevo el configure:
# ./configure –enable-cgibindir=/var/www/cgi-bin –enable-htmldir=/var/www/html
make && make install-strip
Configuramos Apache:
# vi /etc/httpd/conf/httpd.conf
agregamos:
deny from all
Options ExecCGI
AllowOverride AuthConfig
Order deny,allow
Setear:
AllowOverride All
# cd /var/www/cgi-bin/vqadmin
creamos .htaccess:
# vi .htaccess
y agregamos:
AuthType Basic
AuthUserFile /etc/httpd/conf/vqadmin.passwd
AuthName vQadmin
require valid-user
satisfy any
luego:
# chown apache .htaccess
# chmod 644 .htaccess
luego agregamos al admin con su passwd:
# htpasswd -bc /etc/httpd/conf/vqadmin.passwd admin passwordquequeremos
# chmod 644 /etc/httpd/conf/vqadmin.passwd
luego:
# /sbin/service httpd restart
deberíamos poder navegar en la siguiente dirección:
http://localhost/cgi-bin/vqadmin/vqadmin.cgi
Instalamos MAILDROP (filtro de mensajes)
# cd /downloads
# tar jxvf maildrop-2.5.0.tar.bz2
# cd maildrop-2.5.0
# ./configure –prefix=/usr/local –exec-prefix=/usr/local –enable-maildrop-uid=root –enable-maildrop-gid=vchkpw –enable-maildirquota
# make && make install-strip && make install-man
QMAILADMIN (interfaz web para administrar cuentas de mail)
# cd /downloads
# tar zxvf qmailadmin-1.2.14.tar.gz
# cd qmailadmin-1.2.14
# ./configure –enable-cgibindir=/var/www/cgi-bin –enable-htmldir=/var/www/html
# make && make install-strip
Deberiamos poder navegar a:
http://localhost/cgi-bin/qmailadmin/
Finalizamos la instalacion de QMAIL:
ejecutamos:
# ./finalize_install_script.sh
editamos y cambiamos mail.example.com en:
# vi /var/qmail/supervise/qmail-pop3d/run
editamos y cambiamos mail.example.com en:
# vi /var/qmail/supervise/qmail-smtpd/run
# qmailctl stop
# echo ‘127.:allow,RELAYCLIENT=””‘ >> /etc/tcp.smtp
# qmailctl cdb
Creamos Alias comunmente utilizados:
# echo postmaster@dominio.com > /var/qmail/alias/.qmail-root
# echo postmaster@dominio.com > /var/qmail/alias/.qmail-postmaster
# echo postmaster@dominio.com > /var/qmail/alias/.qmail-mailer-daemon
# ln -s /var/qmail/alias/.qmail-root /var/qmail/alias/.qmail-anonymous
# chmod 644 /var/qmail/alias/.qmail*
DESINSTALANDO SENDMAIL:
Verificamos si está instalado:
# rpm -qa | grep sendmail
si está instalado lo desinstalamos
# /etc/rc.d/init.d/sendmail stop (to stop Sendmail)
# rpm -e –nodeps sendmail-x.x.x.x
# rpm -e –nodeps sendmail-doc-x.x.x.x
# rpm -e –nodeps sendmail-devel-x.x.x.x
# rpm -e –nodeps sendmail-cf-x.x.x.x
Establecemos un “path artifical” para el sendmail:
# ln -s /var/qmail/bin/sendmail /usr/lib/sendmail
# ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail
Probando:
Si hacemos
# telnet localhost 110
o
# telnet localhost 25
tenemos que tener respuesta.
OJO en versiones de 64 bits modificar la varialbe softlimits en el run dado que da error. Aumentarla al menos a 40000000
Instalamos COURIER AUTH LIB:
Descargamos
wget https://sourceforge.net/projects/courier/files/authlib/0.63.0/courier-authlib-0.63.0.tar.bz2/download
# cd /downloads/
# tar jxvf courier-authlib-0.63.tar.bz2
# cd courier-authlib-0.63
# ./configure –prefix=/usr/local –exec-prefix=/usr/local –with-authvchkpw –without-authldap –without-authmysql –disable-root-check –with-ssl –with-authchangepwdir=/usr/local/libexec/authlib –with-redhat
# make && make check
# make install-strip && make install-configure
Editamos el rc.local para colocar el arranque al inicio del servicio:
# vi /etc/rc.local
Añadimos la siguiente línea:
/usr/local/sbin/authdaemond start
Instalamos COURIER-IMAP/IMAPS con Courierpassd (autenticación a través de IMAP)
Descargamos
wget https://sourceforge.net/projects/courier/files/imap/4.8.1/courier-imap-4.8.1.tar.bz2/download
OJO que COURIER-IMAP debe ser instalado por un usuario NO ROOT
$ cd /downloads/
$ tar jxvf courier-imap-4.8.1.tar.bz2
$ chown -R hvivani:users courier-imap-4.8.1
$ cd /downloads/courier-imap-4.8.1
$ su hvivani
$ ./configure –prefix=/usr/local –exec-prefix=/usr/local –with-authvchkpw –without-authldap –without-authmysql –disable-root-check –with-ssl –with-authchangepwdir=/usr/local/libexec/authlib –with-redhat
$ make && make check
Ahora volvemos al usuario ROOT:
$ exit
# make install-strip && make install-configure
Ahora crearemos un certificado SSL para el servidor IMAP-SSL
/usr/local/sbin/mkimapdcert
vi /usr/local/etc/imapd.cnf
cambiamos postmaster@example.com por una direccion de mail administrativa que usemos
Grabamos y salimos
vi /usr/local/etc/imapd
Verificar que la siguiente linea existe: IMAPDSTART=YES
vi /usr/local/etc/imapd-ssl
Verificar que la siguiente linea existe: IMAPDSSLSTART=YES
Verificar que la siguiente linea existe: TLS_CERTFILE=/usr/local/share/imapd.pem
Grabamos y salimos.
vi /usr/local/etc/authlib/authdaemonrc
Cerca de la linea 27 veremos la configuracion “authmodulelist”. Tenemos que verificar que “authvchkpw” es el unico modulo instalado.
Quedaría asi:
authmodulelist=”authvchkpw”
Grabamos y salimos.
Creamos los scripts de inicialización:
# cp /usr/local/libexec/imapd.rc /etc/rc.d/init.d/imap
# cp /usr/local/libexec/imapd-ssl.rc /etc/rc.d/init.d/imaps
Starteamos Authdaemond, IMAP e IMAPS:
# /usr/local/sbin/authdaemond stop
# /usr/local/sbin/authdaemond start
# /etc/rc.d/init.d/imap stop
# /etc/rc.d/init.d/imaps stop
# /etc/rc.d/init.d/imap start
# /etc/rc.d/init.d/imaps start
Si hacemos un
# nmap localhost
deberíamos ver los puertos 143 y el 993 escuchando.
Los probamos:
#telnet localhost 143
Trying 192.168.1.10…
Connected to 192.168.1.10.
Escape character is ‘^]’.
* OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE STARTTLS] Courier-IMAP ready. Copyright 1998-2003 Double Precision, Inc. See COPYING for distribution information.
a login postmaster@mydomain.com my_password
a OK LOGIN Ok. (successful login!)
a logout (logs you out)
* BYE Courier-IMAP server shutting down
a OK LOGOUT completed
Connection closed by foreign host.
Ahora Instalamos Courierpassd
cd /downloads/
tar zxvf courierpassd-1.1.0-RC1.tar.gz
cd courierpassd-1.1.0-RC1
./configure
make && make install
Si usamos Xinetd, agregamos el script de arranque:
# cd /etc/xinetd.d
Creamos el script de courierpassd
# vi courierpassd
service courierpassd
{
port = 106
socket_type = stream
protocol = tcp
user = root
server = /usr/local/sbin/courierpassd
server_args = -s imap
wait = no
only_from = 127.0.0.1
instances = 4
disable = no
}
Nota: Courierassd necesita abierto el puerto 106 por lo menos para el tráfico local (127.0.0.1).
Grabamos y salimos
Agregamos el servicio CourierPassd a los servicios del sistema:
# vi /etc/services
Agregamos la siguiente línea al archivo /etc/services :
courierpassd 106/tcp #for /etc/xinetd.d/courierpassd
Restarteamos el xinetd
# /etc/rc.d/init.d/xinetd restart
Ahora tratamos de hacer un cambio de password con este servicio:
# telnet localhost 106
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
200 courierpassd v0.30 hello, who are you?
user postmaster@dominio.com
200 Your password please.
pass my_password
200 Your new password please.
newpass my_new_password
200 Password changed, thank-you.
quit
200 Bye.
Connection closed by foreign host.
Instalamos SquirrelMail (Cliente WebMail)
Verifiquemos en el /etc/php.ini la opción file_uploads = On
Bajamos la ultima versión de Squirrelmail de http://www.squirrelmail.org/download.php
Cambiamos directorio al de instalación y descomprimimos:
# cd /var/www/html
# tar -zxvf /downloads/squirrelmail-x.x.x.tar.gz
# mv squirrelmail-x.x.x to webmail
Ahora lo configuramos:
# mkdir /var/sqattachements
# chown -R apache:apache /var/sqattachements
# cd webmail
# chown -R apache:apache data
# cd config
# ./conf.pl
Esto ejecutará el script de configuraciónd el squirrelMail, donde debemos configurar basicamente lo siguiente:
General
——-
1. Domain : 1.2.3.4 ( IP del Servidor )
2. Invert Time : false
3. Sendmail or SMTP : SMTP
IMAP Settings
————–
4. IMAP Server : localhost
5. IMAP Port : 143
6. Authentication type : login
7. Secure IMAP (TLS) : false
8. Server software : other
9. Delimiter : detect
SMTP Settings
————-
4. SMTP Server : localhost
5. SMTP Port : 25
6. POP before SMTP : false
7. SMTP Authentication : login
8. Secure SMTP (TLS) : false
Ahora configuramos el apache para definir el servidor, agregando esta entrada en el /etc/httpd/conf/httpd.conf
ServerName mail.dominio.com
ServerAlias mail.*
ServerAdmin postmaster@dominio.com
DocumentRoot /var/www/webmail
Reloadeamos el apache:
# service httpd reload
Ahora si ponemos la dirección http://www.dominio.com/webmail/ en el navegador, deberíamos ver el cliente web de mail squirrelmail.
Debemos ingresar usando:
Username: postmaster@dominio.com
Password: password
Algo importante es instalar el plugin para cambiar passwords e idioma:
# cd /var/www/html/webmail/plugins
Descargamos el modulo…
# wget http://squirrelmail.org/countdl.php?fileurl=http%3A%2F%2Fwww.squirrelmail.org%2Fplugins%2Fchange_pass-2.7-1.4.x.tar.gz
Descomprimimos…
# tar zxvf change_pass-2.7-1.4.x.tar.gz
Añadimos el módulo en el squirrel:
# cd /var/www/htmp/webmail/config
Ejecutamos el script de configuración…
# ./conf.pl
Elegimos la opción “plugins” y veremos para agregar el “change_pass”. Grabamos y listo.
Instalamos Clam Antivirus y SpamAssassin (Antivirus y AntiSpam)
Vamos a necesitar los siguientes módulos Perl:
Digest::SHA1
Digest::HMAC
Net::DNS
Time::HiRes
HTML::Tagset
HTML::Parser
Pod::Usage
Parse::Syslog
Statistics::Distributions
perl-suidperl
unzip
Podemos chequear si tenemos instalados estos modulos, ejecutando como usuario NO ROOT, el siguiente script:
$ /downloads/check_perlmods.script
Si nos falta algún módulo, podemos descargarlo directamente desde http://www.cpan.org
Instalamos el Clamav:
# yum install clamav clamav-devel
Verificamos la siguiente configuración en el /etc/clamd.conf:
“Example” – Debe estar comentada (#)
“LogFile” – seteamos /var/log/clamav/clamd.log
“LogTime” – descomentamos
“LogSyslog” – descomentamos
“User” – seteamos a qscand
“ScanMail” – descomentamos
Creamos el usuario qscand:
# useradd -c “Qmail-Scanner Account” -s /bin/false qscand
Starteamos el clamd:
# /etc/init.d/clamd stop
# /etc/init.d/clamd start
Actualizamos la base de virus:
# /usr/bin/freshclam -l /var/log/clamav/clam-update.log
[root@dominio.com clamav]# freshclam -l /var/log/clamav/clamav-update.log
ClamAV update process started at Sun Oct 24 23:36:22 2004
main.cvd is up to date (version: 27, sigs: 23982, f-level: 2, builder: tomek)
daily.cvd is up to date (version: 549, sigs: 1583, f-level: 3, builder: ccordes)
Creamos una entrada en el crontab para que la base se actualice sola:
# crontab -e
25 1 * * * /usr/bin/freshclam –quiet -l /var/log/clamav/freshclam.log
grabamos y salimos
Instalamos SpamAssassin
# yum install spamassassin spamassassin-tools
Instalamos QmailScanner
Descargamos el qmailscanner y el qms-analog. Verificar las últimas versiones:
# cd /downloads
# wget http://sourceforge.net/projects/qmail-scanner/files/qmail-scanner/2.08/qmail-scanner-2.08.tgz/download
# wget http://prdownloads.sourceforge.net/qms-analog/qms-analog-0.4.4.tar.gz?download
# tar -zxvf qmail-scanner-2.08.tgz
# tar -zxvf qms-analog.0.4.4.tgz
# cd qms-analog.0.4.4
# make all
# cd /downloads/qmail-scanner-2.08
# vi qms-config
modificamos lo marcado en rojo:
#!/bin/sh
if [ “$1” != “install” ]; then
INSTALL=
else
INSTALL=”–install”
fi
./configure –domain yourdomain.com \
–admin postmaster \
–local-domains “yourdomain.com,yourotherdomain.com” \
–add-dscr-hdrs yes \
–dscr-hdrs-text “X-Antivirus-MYDOMAIN” \
–ignore-eol-check yes \
–sa-quarantine 0 \
–sa-delete 0 \
–sa-reject no \
–sa-subject “:SPAM:” \
–sa-delta 0 \
–sa-alt yes \
–sa-debug no \
–notify admin \
“$INSTALL”
grabamos y salimos
# chmod 755 qms-config
#./qms-config
respondemos yes a todas las preguntas y si no tenemos errores, directamente instalamos:
# ./qms-config install
Inicializamos el scanner:
# setuidgid qscand /var/qmail/bin/qmail-scanner-queue.pl -z
# setuidgid qscand /var/qmail/bin/qmail-scanner-queue.pl -g
Si todo salió bien, deberíamos tener una salida similar a:
perlscanner: generate new DB file from /var/spool/qmailscan/quarantine-attachments.txt
perlscanner: total of 9 entries.
# chown -R qscand:qscand /var/spool/qmailscan
Para decirle al Qmail que utilice el scanner debemos editar el archivo run y agregar una línea:
# vi /var/qmail/supervise/qmail-smtpd/run
Agregamos la siguiente línea luego del #!/bin/bash
QMAILQUEUE=”/var/qmail/bin/qmail-scanner-queue.pl” ; export QMAILQUEUE
OJO en versiones de 64 bits modificar la varialbe softlimits en el run dado que da error. Aumentarla al menos a 40000000
El archivo run debería haber quedado parecido a esto:
#!/bin/sh
QMAILQUEUE=”/var/qmail/bin/qmail-scanner-queue.pl” ; export QMAILQUEUE
QMAILDUID=`id -u vpopmail`
NOFILESGID=`id -g vpopmail`
MAXSMTPD=`cat /var/qmail/control/concurrencyincoming`
LOCAL=`head -1 /var/qmail/control/me`
if [ -z “$QMAILDUID” -o -z “$NOFILESGID” -o -z “$MAXSMTPD” -o -z “$LOCAL” ]; then
echo QMAILDUID, NOFILESGID, MAXSMTPD, or LOCAL is unset in
echo /var/qmail/supervise/qmail-smtpd/run
exit 1
fi
if [ ! -f /var/qmail/control/rcpthosts ]; then
echo “No /var/qmail/control/rcpthosts!”
echo “Refusing to start SMTP listener because it’ll create an open relay”
exit 1
fi
exec /usr/local/bin/softlimit -m 40000000 \
/usr/local/bin/tcpserver -v -R -l “$LOCAL” -x /etc/tcp.smtp.cdb -c “$MAXSMTPD” \
-u “$QMAILDUID” -g “$NOFILESGID” 0 smtp \
/var/qmail/bin/qmail-smtpd your_domain.com \
/home/vpopmail/bin/vchkpw /usr/bin/true 2>&1
Ahora restarteamos el qmail:
# qmailctl stop
# qmailctl start
# qmailctl stat
Probamos que el qmailscanner funcione con el qmail, clamav y spamassassin:
# cd /downloads/qmail-scanner-2.08/contrib
# chmod 755 test_installation.sh
# ./test_installation.sh -doit
Esto va a generar 2 mails que serán reconocidos como virus y almacenados en cuarentena por el clamav y dos mensajes que iran a la bandeja de entrada, uno de ellos marcado como spam:
setting QMAILQUEUE to /var/qmail/bin/qmail-scanner-queue.pl for this test…
Sending standard test message – no viruses…
done!
Sending eicar test virus – should be caught by perlscanner module…
done!
Sending eicar test virus with altered filename – should only be caught by commercial anti-virus modules (if you have any)…
Sending bad spam message for anti-spam testing – In case you are using SpamAssassin…
Done!
Finished test. Now go and check Email for postmaster@mydomain.com
Si esto funcionó correctamente, en este punto deberíamos teber Clam Antivirus, SpamAssassin y Qmail-Scanner funcionando juntos.
Si el mensaje contenía un virus, se almacenará en cuarentena en: /var/spool/qmailscan/quarantine.
https://dl.dropboxusercontent.com/u/5878683/hvivani.com.ar/qmail/