Configuración avanzada de Sendmail.

Autor: Joel Barrios Dueñas
Correo electrónico: darkshram en gmail punto com
Sitio de Red: http://www.alcancelibre.org/
Jabber ID: darkshram@jabber.org

Creative Commons Reconocimiento-NoComercial-CompartirIgual 2.1

© 1999-2016 Joel Barrios Dueñas. Usted es libre de copiar, distribuir y comunicar públicamente la obra y hacer obras derivadas bajo las condiciones siguientes: a) Debe reconocer y citar al autor original. b) No puede utilizar esta obra para fines comerciales (incluyendo su publicación, a través de cualquier medio, por entidades con fines de lucro). c) Si altera o transforma esta obra o genera una obra derivada, sólo puede distribuir la obra generada bajo una licencia idéntica a ésta. Al reutilizar o distribuir la obra, tiene que dejar bien claro los términos de la licencia de esta obra. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor. Los derechos derivados de usos legítimos u otras limitaciones no se ven afectados por lo anterior. Licencia completa en castellano. La información contenida en este documento y los derivados de éste se proporcionan tal cual son y los autores no asumirán responsabilidad alguna si el usuario o lector hace mal uso de éstos.

Antes de continuar.

Este documento requeire la lectura previa de los documentos titulados «Introducción a los protocolos de correo electrónico», «Configuración básica de Sendmail» y «Cómo configurar Sendmail y Dovecot con soporte SSL/TLS

Usuarios Virtuales.

Si se desea brindar un servicio de hospedaje de dominios virtuales, permitiendo que los usuarios envíen y reciban, correo electrónico, utilizando sus propios dominios, se deben añadir las siguientes opciones resaltadas, justo debajo de virtusertable del archivo /etc/mail/sendmail.mc:

define(`confTO_IDENT', `0')dnl
dnl FEATURE(delay_checks)dnl
FEATURE(`no_default_msa', `dnl')dnl
FEATURE(`smrsh', `/usr/sbin/smrsh')dnl
FEATURE(`virtusertable',`hash -o /etc/mail/virtusertable.db')dnl
FEATURE(`genericstable',`hash -o /etc/mail/genericstable.db')dnl
GENERICS_DOMAIN_FILE(`/etc/mail/generics-domains')dnl
FEATURE(redirect)dnl
FEATURE(always_add_domain)dnl
FEATURE(use_cw_file)dnl
FEATURE(use_ct_file)dnl

Se generan tres archivos nuevos dentro del directorio /etc/mail:

touch /etc/mail/virtusertable
touch /etc/mail/genericstable
touch /etc/mail/generics-domains

El archivo /etc/mail/virtusertable sirve para definir qué cuentas virtuales de correo electrónico se entregan en ciertos buzones, de determinados usuarios. Edite el archivo /etc/mail/virtusertable:

vim /etc/mail/virtusertable

El formato de este archivo permite que la separación de columnas se haga con tabuladores, a fin de poder alinear los registros y poder tener todo mejor organizado. En el ejemplo a continuación, se entrega el correo de webmaster@dominio1.net en la cuenta mengano y el correo de webmaster@dominio2.com, en el buzón del usuario perengano:

webmaster@dominio1.net		mengano
webmaster@dominio2.com perengano

Añada el resto de los usuariso que conformarán el dominio:

juan@dominio1.net			juan
jose@dominio1.net			jose
hugo@dominio1.net			hugo
paco@dominio1.net			paco
luis@dominio1.net			luis
juan@dominio2.com			juan
jose@dominio2.com			jose
hugo@dominio2.com			hugo
paco@dominio2.com			paco
luis@dominio2.com			luis

Para hacer que Sendmail rechace correctamente con un error 553 5.3.0 el correo electrónico dirigido hacia cualquier cuenta ausente en el archivo /etc/mail/virtusertables, añada lo siguiente:

@dominio1.net		error:nouser No such user here
@dominio2.com error:nouser No such user here

Para hacer que el correo electrónico del usuario mengano salga del servidor como webmaster@dominio1.net y que el del usuario perengano salga como webmaster@dominio2.com, es necesario definir en el archivo /etc/mail/genericstable, el contenido contrario del archivo /etc/mail/virtusertable.

Genere el archivo /etc/mail/genericstable:

touch /etc/mail/genericstable

Edite el archivo /etc/mail/genericstable:

vim /etc/mail/generictable

Defina el contenido contrario del archivo en el archivo /etc/mail/virtusertable, del siguiente modo:

mengano			webmaster@dominio1.net
perengano webmaster@dominio2.com

Para efectos prácticos y salvo que se requiera que haya más de una cuenta virtual de correo electrónico para un mismo usuario o bien, que dos o más usuarios emitan mensajes con la misma cuenta de correo electrónico, se puede mantener sincronizados ambos archivos, trabajando directamente con /etc/mail/virtusertable, ejecutando el siguiente guión, el cual se encargará de pasar el texto desde el archivo /etc/mail/virtusertable, con el orden invertido de las columnas, hacia el archivo /etc/mail/genericstable.

while read cuenta usuario garbage
do
echo -e "${usuario}\t${cuenta}" >> /etc/mail/genericstable
done < /etc/mail/virtusertable
sed -i -e 's,error:nouser,#error:nouser,g' /etc/mail/genericstable

El archivo /etc/mail/generics-domains debe contener prácticamente lo mismo que el archivo /etc/mail/local-host-names, más los dominios que vayan a ser gestionados como dominios virtuales.

dominio.com
dominio1.net
dominio2.com

Invariablemente los archivos /etc/mail/virtusertable.db y /etc/mail/genericstable.db, deben actualizarse con el contenido de /etc/mail/virtusertable y /etc/mail/genericstable, respectivamente, cada vez que se realicen cualquier tipo de cambio, como actualizar, añadir o eliminar, cuentas de correo virtuales.

for f in virtusertable genericstable
do
makemap hash /etc/mail/${f}.db < /etc/mail/${f}
done

Encaminamiento de dominios.

Sendmail incluye soporte para realizar en re-encaminamiento de dominios de correo a través de la opción FEATURE(`mailertable',`hash -o /etc/mail/mailertable.db') que debe estar habilitado de modo predefinido en el archivo /etc/mail/sendmail.mc. Esta función permite a Sendmail realizar traducción de dominios, especificar un agente de entrega y cambiar el encaminamiento establecido en un DNS.

Redundancia del servidor de correo.

Cuando se tiene un dominio de correo electrónico que recibe mucho tráfico, es conveniente establecer redundancia en el servicio para garantizar que el correo siempre será recibido y llegará a los buzones de correo hacia los que está destinado.

Se requieren dos servidores de correo. Uno deberá estar registrado en la zona del dominio en el DNS como servidor de correo primario (mail.dominio.com) y otro deberá estar registrado en la zona del dominio en el DNS como servidor de correo secundario (mail2.dominio.com) a fin de contar con redundancia.

1.  Defina en la zona de DNS de dominio.com un servidor de correo primario (mail.dominio.com) y un servidor de correo secundario (mail2.dominio.com)
2.  Configure normalmente el servidor de correo primario (mail.dominio.com) para administrar el correo de dominio.com.
3.  Configure el servidor de correo secundario (mail2.dominio.com) del mismo modo, pero no añada dominio.com en el archivo /etc/mail/local-host-names ya que de otro modo el correo será tratado como local y jamas podrá ser entregado en el servidor de correo primario.
4.  Debe de estar listado dominio.com en el archivo /etc/mail/relay-domains en el servidor de correo secundario (mail2.dominio.com) a fin de permitir la retransmisión de éste hacia el servidor de correo primario (mail.dominio.com).
5.  En el servidor de correo secundario (mail2.dominio.com) modifique el archivo /etc/mail/mailertable y defina que dominio.com será entregado en el servidor de correo primario utilizando el nombre plenamente resuelto en la zona del DNS.
dominio.com		smtp:mail.dominio.com

Si lo desea, puede especificar la dirección IP en lugar del nombre:

dominio.com		smtp:[172.16.1.50]
6.  Reinicie Sendmail
service sendmail restart
7.  En adelante el correo de dominio.com será entregado normalmente y de primera instancia en el servidor de correo primario (mail.dominio.com), pero cuando éste, por alguna razón, se vea imposibilitado para recibir conexiones, el servidor de correo secundario (mail2.dominio.com) definido en la zona de DNS recibirá todo el correo de dominio.com y lo entregará en el servidor de correo primario (mail.dominio.com) cuando éste re-establezca operaciones normalmente.

Servidor de correo intermediario.

Sendmail puede servir de intermediario de correo electrónico ya sea para filtrado de correo con un antivirus, equipamiento lógico para filtrado de correo chatarra o bien como intermediario entre una red pública y un servidor en red local. Se requieren dos servidores de correo. Uno que será el servidor de correo intermediario (proxy.dominio.com), que de forma obligatoria deberá estar definido en la zona de DNS del dominio como servidor de correo primario (un registro MX) y otro que servirá como servidor de correo de destino (mail.dominio.com).

1.  El servidor de correo que funcionará como intermediario (proxy.dominio.com) se configura normalmente, pero no añada dominio.com en el archivo /etc/mail/local-host-names ya que de otro modo el correo será tratado como local y jamas podrá ser entregado en el servidor de correo de destino (mail.dominio.com).
2.  Debe de estar listado dominio.com en el archivo /etc/mail/relay-domains en el servidor de correo intermediario (proxy.dominio.com) a fin de permitir la retransmisión de éste hacia el servidor de correo primario (mail.dominio.com).
3.  La dirección P del servidor de destino (mail.dominio.com) debe estar listada en el archivo /etc/mail/access con RELAY (retransmisión autorizada) del servidor de correo intermediario (proxy.dominio.com).
4.  La dirección P del servidor de intermediario (proxy.dominio.com) debe estar listada en el archivo /etc/mail/access con RELAY (retransmisión autorizada) del servidor de correo de destino (mail.dominio.com).
5.  En el servidor de correo intermediario (proxy.dominio.com) modifique el archivo /etc/mail/mailertable y defina que dominio.com será entregado en el servidor de correo de destino (mail.dominio.com) utilizando el nombre FQDN (Fully Qualified Domain Name) y plenamente resuelto.
dominio.com		smtp:mail.dominio.com
6.  Si lo desea, puede especificar la dirección IP en lugar del nombre:
dominio.com		smtp:[172.16.1.50]
7.  En el servidor de correo de destino (mail.dominio.com), des-comente y defina proxy.dominio.com como valor para la opción define(`SMART_HOST',`smtp.your.provider'), de modo que proxy.dominio.com sea el servidor de retransmisión (smart host:
define(`SMART_HOST',`proxy.dominio.com')
8.  Reinicie Sendmail en ambos servidores de correo.
service sendmail restart

Verificando el servicio.

Desde una terminal, ejecute el mandato nc dirigido hacia el puerto 25 de la dirección IP principal del sistema:

$ nc 192.168.0.254 25

Si Sendmail está funcionando correctamente, se establecerá una conexión exitosa y deberá devolver una salida similar a la siguiente:

Trying 172.16.1.50...
Connected to nombre.dominio (172.16.1.50).
Escape character is '^]'.
220 nombre.dominio ESMTP Sendmail 8.13.1/8.13.1; Sun, 5 Mar 2006 21:45:51 -0600

Ejecute el mandato HELO seguido del nombre del anfitrión:

HELO nombre.dominio

Obtendrá una salida similar a esta:

250 nombre.dominio Hello nombre.dominio [172.16.1.50], pleased to meet you

Ejecute el mandato EHLO seguido del nombre del anfitrión:

EHLO nombre.dominio

Obtendrá una salida similar a ésta y que mostrará las funciones del servidor:

250-nombre.dominio Hello nombre.dominio [172.16.1.50], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH DIGEST-MD5 CRAM-MD5
250-DELIVERBY
250 HELP

Ejecute el mandato QUIT para cerrar la conexión.

QUIT

El servidor deberá contestar lo siguiente al terminar la conexión:

221 2.0.0 nombre.dominio closing connection
Connection closed by foreign host.

La salida completa de todo el procedimiento anterior debe lucir similar a esto (mandatos utilizados resaltados en negrita):

[fulano@nombre ~]$ nc 172.16.1.50 25
Trying 172.16.1.50...
Connected to nombre.dominio (172.16.1.50).
Escape character is '^]'.
220 nombre.dominio ESMTP Sendmail 8.13.1/8.13.1; Sun, 5 Mar 2006 21:45:51 -0600
HELO nombre.dominio
250 nombre.dominio Hello nombre.dominio [172.16.1.50], pleased to meet you
EHLO nombre.dominio
250-nombre.dominio Hello nombre.dominio [172.16.1.50], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH DIGEST-MD5 CRAM-MD5
250-DELIVERBY
250 HELP
QUIT
221 2.0.0 nombre.dominio closing connection
Connection closed by foreign host.

Pruebas de envío de correo.

Utilizando nc.

Utilizar el mandato nc permite conocer y examinar como funciona realmente la interacción entre un servidor de correo y un cliente de correo.

Abra una sesión con nc dirigido hacia el puerto 25 de la dirección IP principal del sistema.

nc 172.16.1.50 25

Salude al sistema con el mandato HELO seguido del nombre del anfitrión.

HELO nombre.dominio

El servidor de correo deberá contestarle:

250 nombre.dominio Hello nombre.dominio [172.16.1.50], pleased to meet you

Ejecute el mandato MAIL FROM especificando la cuenta de correo de un usuario local de sus sistema del siguiente modo:

MAIL FROM: <fulano@nombre.dominio>

El servidor de correo deberá contestarle lo siguiente, a menos que especifique una cuenta de correo con un dominio distinto a los especificados en el archivo /etc/mail/relay-domains:

250 2.1.0 <fulano@nombre.dominio>... Sender ok

Ejecute el mandato RCPT TO especificando una cuenta de correo existente en el servidor del siguiente modo:

RCPT TO: <root@nombre.dominio>

El servidor de correo deberá contestarle lo siguiente:

250 2.1.5 <root@nombre.dominio>... Recipient ok

Ejecute el mandato DATA:

DATA

El servidor de correo deberá contestarle lo siguiente:

354 Enter mail, end with "." on a line by itself

Enseguida se ingresa el texto que desee incluir en le mensaje de correo electrónico. Al terminar finalice con un punto en una nueva línea.

Hola, este es un mensaje de prueba.
.

El sistema deberá contestarle algo similar a lo siguiente:

250 2.0.0 k263wEKK006209 Message accepted for delivery

Ejecute el mandato QUIT:

QUIT

El servidor deberá contestar lo siguiente al terminar la conexión:

221 2.0.0 nombre.dominio closing connection
Connection closed by foreign host.

La salida completa de todo el procedimiento anterior debe lucir similar a esto (mandatos utilizados resaltados en negrita):

[fulano@nombre ~]$ nc 172.16.1.50 25
Trying 172.16.1.50...
Connected to nombre.dominio (172.16.1.50).
Escape character is '^]'.
220 nombre.dominio ESMTP Sendmail 8.13.1/8.13.1; Sun, 5 Mar 2006 21:58:14 -0600
HELO nombre.dominio
250 nombre.dominio Hello nombre.dominio [172.16.1.50], pleased to meet you
MAIL FROM: <fulano@nombre.dominio>
250 2.1.0 <fulano@nombre.dominio>... Sender ok
RCPT TO: <root@nombre.dominio>
250 2.1.5 <root@nombre.dominio>... Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
Hola, este es un mensaje de prueba.
.

250 2.0.0 k263wEKK006209 Message accepted for delivery
QUIT
221 2.0.0 nombre.dominio closing connection
Connection closed by foreign host.

Utilizando mutt.

Mutt, término utilizado en la lengua inglesa para referirse a perros mestizos, es un cliente de correo electrónico (MUA o Mail User Agent) para modo texto. Incluye soporte para color, hilos, MIME, PGP/GPG, protocolos POP3, IMAP y NNTP y para los formatos de correo Maildir y mbox.

Basta ejecutar mutt y pulsar las teclas indicadas la interfaz de texto para realizar diversas tareas. Para enviar un mensaje de correo electrónico siga este procedimiento:

1.  Como usuario sin privilegios, ejecute mutt.
2.  Responda con la tecla «s» para confirmar que se creará ~/Mail.
3.  Una vez iniciada la interfaz de texto de mutt, pulse la tecla «m» para crear un nuevo mensaje.
4.  En la parte inferior de la pantalla aparece un diálogo para el destinatario (To: ). Ingrese una cuenta de correo electrónico válida o alguna que exista al menos en el dominio de la Red Local (LAN).
5.  En la parte inferior de la pantalla aparece un diálogo para ingresar el asunto del mensaje (Subject: ). Ingrese un título para el mensaje.
6.  Enseguida mutt iniciará vi para crear el texto que se enviará en el mensaje. Inicie el modo de insertar texto (i) de vi e ingrese algunas palabras. Al terminar, guarde y salga de vi (:wq).
7.  Tras terminar con el editor de texto simple vi, mutt presentará una vista previa del mensaje. Confirme que los datos son los correctos y pulse la tecla «y» para enviar el mensaje. Si necesita cambiar alguno de éstos, pulse «t» para cambiar el destinatario o bien pulse la tecla «s», para cambiar el campo de asunto del mensaje.
8.  Mutt le devolverá a la pantalla principal. Si recibe un mensaje de respuesta, seleccione éste y pulse la tecla ENTER para visualizar el contenido.
9.  Si desea responder el mensaje, pulse la tecla «r» y repita los procedimientos del paso 4 al 7.

Si lo desea, también puede utilizar mutt desde la linea de mandatos.

echo -e \
"Hola, soy ${USER} en ${HOSTNAME}.\n\
Por favor responde este mensaje.\n\nSaludos." \
| mutt \
-s "Mensaje enviado desde ${HOSTNAME}" \
fulano@maquina.dominio

Lo anterior envía un mensaje de correo electrónico hacia la cuenta fulano@maquina.dominio, con el asunto «Mensaje enviado desde nombre.dominio» con el siguiente contenido como texto del mensaje:

Hola, soy usuario en nombre.dominio
Por favor responde este mensaje.

Saludos.