systemadmin.es > Correo > Instalación de patchs para netqmail-1.06

Instalación de patchs para netqmail-1.06

Para la instalación paso a paso de un servidor de correo con qmail se utiliza un patch conjunto de varios parches típicos de qmail sobre un netqmail-1.06. Vamos a ver como aplicar los parches uno a uno:

El listado de parches que utilizaremos es el siguiente:

  • Parche para tratar paquetes de respuesta DNS grandes: Para el caso que una respuesta DNS ocupe más de 512 bytes
  • Parche para limitar el tamaño de los bounces a 50K o al valor que deseemos según en el fichero /var/qmail/control/bouncemaxbytes
  • Patch para el protocolo SMTP AUTH con los tipos de autenticación LOGIN, PLAIN y CRAM-MD5.
  • chkuser: Para comprobar si existe el usuario en la fase SMTP, descartando cualquier correo a un usuario inexistente. Mediante este parche la carga extra que supone la entrada de correos de SPAM a direcciones inexistentes.
  • Cifrado mediante TLS. La sesión SMTP se inicia en texto plano, pero el cliente puede solicitar el paso a encriptado mediante el comando STARTTLS

Empezamos descargándolos en /usr/local/src:

cd /usr/local/src
wget http://www.ckdhr.com/ckd/qmail-103.patch 
wget http://www.bowe.id.au/michael/ftp/Sources/linux/WebMail/qmail-limit-bounce-size.patch.txt
wget http://www.interazioni.it/opensource/chkuser/download/archives/chkuser-2.0.9-release.tar.gz
tar xzf chkuser-2.0.9-release.tar.gz

Los aplicamos desde dentro del netqmail:

cd netqmail-1.06
patch -p1 < ../qmail-103.patch
patch < ../qmail-limit-bounce-size.patch.txt

Con estos dos no tenemos problemas, con lo que ya tenemos los parches para las respuestas DNS grandes y para limitar el tamaño de los bounces. Seguimos con el SMTP AUTH:

wget http://systemadmin.es/wp-content/uploads/2010/09/qmail-smtpd-auth-0.31.tar.gz
tar xzf qmail-smtpd-auth-0.31.tar.gz
cd qmail-smtpd-auth-0.31/

Para instalarlo deberemos copiar los ficheros dentro del netqmail y aplicar el patch llamado auth.patch:

cp auth.patch README.auth base64.c base64.h ../netqmail-1.06
cd ../netqmail-1.06
patch < auth.patch

Seguimos con el chkuser:

patch < ../chkuser-2.0.9-release.patch

En este caso ya tenemos conflictos:

patching file CHKUSER.automatic_patching
patching file CHKUSER.changelog
patching file CHKUSER.copyright
patching file CHKUSER.log_format
patching file CHKUSER.manual_patching
patching file CHKUSER.readme
patching file CHKUSER.running
patching file Makefile
Hunk #2 succeeded at 308 (offset 4 lines).
Hunk #3 FAILED at 1548.
1 out of 3 hunks FAILED -- saving rejects to file Makefile.rej
patching file TARGETS
Hunk #1 succeeded at 386 (offset 1 line).
patching file chkuser.c
patching file chkuser.h
patching file chkuser_settings.h
patching file conf-cc
patching file qmail-smtpd.c
Hunk #2 FAILED at 34.
Hunk #3 succeeded at 274 (offset 20 lines).
Hunk #5 succeeded at 299 (offset 20 lines).
1 out of 5 hunks FAILED -- saving rejects to file qmail-smtpd.c.rej

Primero deberemos arreglar manualmente el qmail-smtpd.c según las instrucciones que tenemos en el fichero qmail-smtpd.c.rej:

sed 's@#define AUTHCRAM@/* start chkuser code */\n#include "chkuser.h"\n/* end chkuser code */\n\n#define AUTHCRAM@' -i qmail-smtpd.c

Y luego hacemos lo mismo para el Makefile:

sed  's@fs.a auto_qmail.o base64.o socket.lib@fs.a auto_qmail.o base64.o socket.lib $(SMTPD_CHKUSER_OBJ)@' -i Makefile
sed 's@./load qmail-smtpd rcpthosts.o commands.o timeoutread.o@./load qmail-smtpd $(SMTPD_CHKUSER_OBJ) \\\n\trcpthosts.o commands.o timeoutread.o @' -i Makefile
sed 's@alloc.a substdio.a error.a str.a fs.a auto_qmail.o base64.o  @alloc.a substdio.a error.a str.a fs.a auto_qmail.o base64.o \\\n\t$(VPOPMAIL_LIBS) \\\n\t@' -i Makefile

Para evitar el error "CHKUSER relaying rcpt: from <> rcpt <> : client allowed to relay.", modificamos el chkuser_settings.h comentando el define de CHKUSER_ENABLE_LOGGING:

sed 's@^#define CHKUSER_ENABLE_LOGGING@//#define CHKUSER_ENABLE_LOGGING@' -i chkuser_settings.h

Ahora aplicamos el parche para tener TLS mediante STARTTLS en el smtpd:

cd /usr/local/src
wget http://www.suspectclass.com/sgifford/ucspi-tls/files/netqmail-1.05-ucspitls-0.3.patch
cd netqmail-1.06
patch < ../netqmail-1.05-ucspitls-0.3.patch

De nuevo tenemos conflictos:

patching file Makefile
Hunk #1 succeeded at 1300 (offset 12 lines).
Hunk #2 FAILED at 1548.
1 out of 2 hunks FAILED -- saving rejects to file Makefile.rej
patching file qmail-popup.c
patching file qmail-smtpd.c
Hunk #1 FAILED at 23.
Hunk #2 succeeded at 68 (offset 17 lines).
Hunk #3 FAILED at 250.
Hunk #4 succeeded at 314 (offset 44 lines).
Hunk #5 succeeded at 660 (offset 233 lines).
Hunk #6 succeeded at 486 (offset 49 lines).
2 out of 6 hunks FAILED -- saving rejects to file qmail-smtpd.c.rej
patching file TARGETS
Hunk #1 succeeded at 287 (offset 1 line).
patching file ucspitls.c
patching file ucspitls.h

El Makefile resulta simple de arreglar:

sed 's@\ttimeoutwrite.o ip.o ipme.o ipalloc.o control.o constmap.o@\ttimeoutwrite.o ip.o ipme.o ipalloc.o control.o constmap.o \\\n\tucspitls.o @' -i Makefile

Luego tenemos que retocar el qmail-smtpd.c:

sed 's@#include "commands.h"@#include "commands.h"\n#include "ucspitls.h"@' -i qmail-smtpd.c
sed 's@int timeout = 1200;@int timeout = 1200;\nint tls_available = 0;\nint tls_started = 0;@' -i qmail-smtpd.c

La función smtp_ehlo() esta así:

void smtp_ehlo(arg) char *arg;
{
  smtp_greet("250-");
#ifdef AUTHCRAM
  out("\r\n250-AUTH LOGIN CRAM-MD5 PLAIN");
  out("\r\n250-AUTH=LOGIN CRAM-MD5 PLAIN");
#else
  out("\r\n250-AUTH LOGIN PLAIN");
  out("\r\n250-AUTH=LOGIN PLAIN");
#endif
  out("\r\n250-PIPELINING\r\n250 8BITMIME\r\n");
  seenmail = 0; dohelo(arg);
}

Y el parche dice que debe estar así:

  void smtp_ehlo(arg) char *arg;
  {
+   smtp_greet("250-");
+   if (tls_available && !tls_started)
+     out("\r\n250-STARTTLS");
+   out("\r\n250-PIPELINING\r\n250 8BITMIME\r\n");
    seenmail = 0; dohelo(arg);
  }

Por lo que lo arreglamos con lo siguiente:

sed 's@smtp_greet("250-");@smtp_greet("250-");\n  if (tls_available \&\& !tls_started)\n    out("\\r\\n250-STARTTLS");@' -i qmail-smtpd.c

Quedando la función así:

void smtp_ehlo(arg) char *arg;
{
  smtp_greet("250-");
  if (tls_available && !tls_started)
    out("\r\n250-STARTTLS");
#ifdef AUTHCRAM
  out("\r\n250-AUTH LOGIN CRAM-MD5 PLAIN");
  out("\r\n250-AUTH=LOGIN CRAM-MD5 PLAIN");
#else
  out("\r\n250-AUTH LOGIN PLAIN");
  out("\r\n250-AUTH=LOGIN PLAIN");
#endif
  out("\r\n250-PIPELINING\r\n250 8BITMIME\r\n");
  seenmail = 0; dohelo(arg);
}

Finalmente sólo nos queda parchear el qmail para desactivar SpamAssassin para mails que se mandan desde el servidor con lo siguiente:

sed 's@out("235 ok, go ahead (#2.0.0)\\r\\n");@if (!env_put2("RELAYCLIENT",relayclient)) die_nomem();\n      out("235 ok, go ahead (#2.0.0)\\r\\n");@' -i qmail-smtpd.c

Ahora sólo nos queda compilar e instalar el qmail parcheado:

for i in $(ls /service/ | grep qmail); do svc -d /service/$i; done ; make setup check; for i in $(ls /service/ | grep qmail); do svc -u /service/$i; done

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>