Tutorial de SendMail
Tutorial de SendMail
Nota Introductoria
Si tuviera que buscar un adjetivo para calificar a Sendmail, pensaría en "excesivo".
Excesivo puesto que este programa intenta -y puede- satisfacer las necesidades de
una audiencia extremadamente amplia... incluso, de una audiencia que hace años ha
desaparecido.
En general, cuando un programa es "más y más flexible", los usuarios deben pagar el
precio de "más y más complejidad" para asimilar toda aquella flexibilidad. Sendmail
permite configurar aspectos que normalmente yacen ocultos en el código compilado
de otros programas similares... aspectos que en la práctica diaria ya casi nadie usa.
Es por eso que usar Sendmail suele ser una experiencia desconcertante... desde el
inicio y hasta el final. Y en ese sentido tengo que admitir que este pequeño texto
también puede serlo, pese a que he procurado que no ocurra así.
Sendmail es calificado de "inseguro", y con justa razón. Tiene una larga historia de
"vulnerabilidades" que han conminado a algunos administradores a optar por solu-
ciones supuestamente más seguras como postfix y qmail. En favor de Sendmail
sólo tengo que indicar que sus creadores han venido haciendo grandes esfuerzos
para que esto cambie, y ciertamente los últimas versiones han consistido esencial-
mente en mejoras en esa dirección.
Un último adjetivo para Sendmail podría ser "legendario", en el sentido que es una
de las utilidades más antiguas de los sistemas Unix, se proporciona en prácticamente
todas sus variantes (y también en Linux), es el servidor de email más utilizado a nivel
mundial, y sorprendentemente es a la vez una de las utilidades menos "dominadas"
por los administradores debido a lo antes indicado - así como a una muy deficiente
documentación!
Cómo contactarme
Cualquier sugerencia para mejorar este texto, o el señalamiento de algún error,
agradecería me sea indicado escribiendo a: diego@[Link].
Lima, Noviembre de 2003
3
Tutorial de Sendmail
Escenario
La gran mayoría de sitios pequeños en Internet puede usar la configuración que pro-
porciona RedHat en forma automática. Es el caso típico de una organización que
disponde de un único servidor de correo electrónico con conexión directa a Internet,
y que posee un dominio tal como "[Link]".
Asumiremos que el servidor de correo designado se llama
"[Link]" y no consideraremos detalles de seguridad como
firewalls y redes DMZ.
Asumiremos también que nuestros clientes son las estaciones de trabajo que se
conectan con algún cliente de correo estándar como "Outlook Express", "Mozilla",
etc.
Configurar el DNS
Asumiremos que las direcciones de correo de nuestros usuarios son de la forma
"usuario@[Link]". En ese caso, en el archivo de configuración de la zona
"[Link]" deberá inscribirse el siguiente registro MX:
@ 1D IN MX 0 correo
DAEMON_OPTIONS(‘Port=smtp,Addr=[Link], Name=MTA’)
por:
DAEMON_OPTIONS(‘Port=smtp, Name=MTA’)
Y regeneraremos la configuración:
# cd /etc/mail
# m4 [Link] > [Link]
4
Tutorial de Sendmail
Nótese que en muchos sistemas distintos a RedHat habrá que usar (en vez de "make")
el comando "makemap" con las opciones correspondientes:
bash# cd /etc/mail
bash# makemap hash access < access
&
Durante estas operaciones conviene verificar los mensajes del log desde otra ventana:
# tail -f /var/log/maillog
Conceptos
Esta sección proporciona una serie de conceptos que se utilzarán en lo que sigue.
Programas Involucrados
MUA/Cliente
El Mail User Agent o Cliente de correo electrónico es un programa que ejecutan
los usuarios para leer y escribir sus mensajes. En la mayoría de casos se ejecuta en
un computador personal. Este programa normalmente enviará los nuevos mensajes
redactados por el usuario al servidor de la organización/proveedor, y descargará
los mensajes pendientes para lectura del usuario desde el servidor de la organi-
zación/proveedor.
MTA/Servidor
El Mail Transfer Agent se encarga de enviar (y reintentar de ser necesario) los men-
sajes redactados por los usuarios de la organización. Igualmente, recibe los mensajes
dirigidos a usuarios de la organización y los coloca en sus respectivas "casillas de
correo" para su posterior lectura.
6
Tutorial de Sendmail
Protocolos
SMTP
El Simple Message Transfer Protocol se emplea para enviar mensajes de correo elec-
trónico entre servidores. En muchos casos, el programa cliente de correo electrónico
remite un nuevo mensaje al servidor usando también SMTP.
POP
El Post Office Protocol permite a los programas clientes de correo electrónico extraer
los mensajes pendientes en las casillas de correo del usuario para que éste los pueda
visualizar.
IMAP
El Internet Message Access Protocol, al igual que POP, permite a los programas
clientes de correo electrónico extraer los mensajes pendientes en las casillas de
correo del usuario para que éste los pueda visualizar. Tiene características
adicionales a las proporcionadas por POP.
DNS
El Domain Name System permite que los mensajes de correo electrónico sean dirigi-
dos al servidor correspondiente en el Internet. En particular, a partir de una dirección
de correo electrónico de destino en un mensaje, se puede encontrar la dirección IP del
computador que debe recibir dicho mensaje.
Mensajes
Header (cabecera)
Esta es una sección informativa que contienen todos los mensajes y que contiene
datos relacionados a su envío, tales como el nombre y dirección electrónica del
creador del mensaje, la lista de destinatarios, la fecha de envío, los servidores
intermedios por donde el mensaje ha pasado, etc.
Body
Contiene el texto del mensaje en sí. Está compuesto por caracteres ASCII.
Envelope (sobre)
Contiene información usada para enrutar los mensajes, tal como los destinatarios
inmediatos. Esta información normalmente tiene coincidencias con algunos compo-
nentes del header.
Attachment
Los archivos que no se componen de texto ASCII pueden ser enviados si primero se
codifican como texto ASCII y se añaden ordenadamente a un mensaje normal. Estos
añadidos al mensaje se denominan attachments.
7
Tutorial de Sendmail
Relay
Corresponde a la facultad del MTA de reenviar los mensajes provenientes de un com-
putador hacia otro computador. Por ejemplo, cuando un usuario de la red local le
proporciona un mensaje que en realidad está dirigido hacia un usuario en Internet.
Empezando
Instalación
RedHat Linux
En los sistemas Linux RedHat, el servidor Sendmail se distribuye mediante el pa-
quete "sendmail". Sin embargo, se hará bien en instalar otros paquetes adicionales
tales como sendmail-cf y sendmail-doc, que proporcionan herramientas de configu-
ración y documentación adicional, respectivamente. Adicionalmente se requerirá el
paquete "m4".
La instalación en RedHat, como de costumbre, se hará mediante el comando RPM
(o durante la instalación del sistema operativo, eligiendo "Mail Server" entre las op-
ciones.) Aquí no explicaremos el comando RPM y nos limitaremos a mostrar cómo
se puede verificar si los paquetes han sido instalados:
8
Tutorial de Sendmail
Desde la fuente
En RedHat y cualquier otro sistema operativo, siempre existe la posibilidad
de descargar el código fuente de Sendmail a fin de compilarlo e instalarlo
manualmente. En este caso deberá descargarse el archivo ".tar" de:
[Link]
Probando Sendmail
Asumiremos que Sendmail ya ha sido instalado. Para verificar la instalación y
obtener cierta información básica, usaremos el siguiente comando, cuyo resultado se
muestra para mi computador:
# sendmail -d0.1 -bt
Version 8.12.5
Compiled with: DNSMAP HESIOD HES_GETMAILHOST LDAPMAP LOG MAP_REGEX
MATCHGECOS MILTER MIME7TO8 MIME8TO7 NAMED_BIND NETINET NETINET6
NETUNIX NEWDB NIS PIPELINING SASL SCANF STARTTLS TCPWRAPPERS
USERDB USE_LDAP_INIT
La opción "-bt" significa "modo de test", y el "-d0.1" significa "debug de aspectos gen-
erales (el cero), en nivel 1". Al modificar el nivel de debug se puede obtener más in-
formación. Por ejemplo, el lector podría observar la salida que presenta el comando
anterior con "-d0.15".
Inicio automático
Como se aprecia, el servidor "sendmail" puede ser invocado en modo interactivo con
diversos propósitos, sin embargo, lo usual es que opere en forma "no interactiva", o
9
Tutorial de Sendmail
como se suele decir en sistemas Unix, como un "demonio". Por lo general esto es con-
figurado en los scripts de inicio del sistema operativo de modo tal que el "demonio
sendmail" se inicie en forma automática cada vez que el computador es iniciado.
En un sistema RedHat Linux (versiones 7 en adelante) se puede emplear el comando
"service" para invocar a estos scripts en cualquier momento. Por ejemplo, para con-
sultar acerca del estado actual del servicio Sendmail:
[root@edithpiaf root]# service sendmail status
sendmail está parado
Para iniciarlo:
[root@edithpiaf root]# service sendmail start
Iniciando sendmail: [ OK ]
Inicio de sm-client: [ OK ]
Para detenerlo:
[root@edithpiaf root]# service sendmail stop
Apagando sendmail: [ OK ]
Desactivación de sm-client: [ OK ]
o
bash# /etc/init.d/sendmail start
o
bash# /sbin/init.d/sendmail start
El log
Sendmail, como cualquier programa relacionado con el correo electrónico,
genera mensajes de eventos (logs) mediante syslog. En los sistemas RedHat
normalmente syslog está configurado para enviar los mensajes hacia el archivo
/var/log/maillog. Cuando se hacen pruebas con Sendmail es muy conveniente
tener una ventana o terminal abierta mostrando el log:
# tail -f /var/log/maillog
Oct 26 [Link] edithpiaf sendmail[1812]: h9QNHAM0001812:
from=root, size=421, class=0, nrcpts=1, msgid=<200310262317.
h9QNHAM0001812@[Link]>, relay=root@localhost
Oct 26 [Link] edithpiaf sendmail[1812]: h9QNHAM0001812:
to=root, ctladdr=root (0/0), delay=[Link], xdelay=[Link],
mailer=relay, pri=30065, relay=[Link].
[[Link]], dsn=4.0.0, stat=Deferred: Connection refused
by [Link].
Oct 27 [Link] edithpiaf sendmail[2299]: h9RMqEA5002299:
from=root, size=244, class=0, nrcpts=1, msgid=<200310272252.
h9RMqEA5002299@[Link]>, relay=root@localhost
Oct 27 [Link] edithpiaf sendmail[2299]: h9RMqEA5002299:
to=root, ctladdr=root (0/0), delay=[Link], xdelay=[Link],
mailer=relay, pri=30065, relay=[Link].
10
Tutorial de Sendmail
DNS
A fin de poder enviar mensajes a destinatarios remotos, Sendmail debe ser capaz de
obtener la información necesaria de un servidor DNS. Incluso en una red local puede
ser conveniente el empleo de un servidor DNS.
Si se desea desactivar completamente el uso del servidor DNS (por ejemplo, si nunca
se saldrá a Internet) entonces se debe recompilar Sendmail con las opciones apropi-
adas (no explicaremos esto aquí.)
En la mayoría de computadores Unix/Linux, la dirección del servidor DNS que
usan las aplicaciones se configura en el archivo /etc/[Link]. Por ejemplo,
si su servidor DNS más cercano (el de la organización o el que ha proporcionado
su proveedor) tiene dirección ip [Link], entonces el archivo "[Link]" del com-
putador destinado para ejecutar Sendmail debe lucir así:
nameserver [Link]
11
Tutorial de Sendmail
Nosotros no detallaremos más la configuración del servidor DNS por ser un tema
fuera del ámbito que nos compete. En [2] se puede encontrar una excelente expli-
cación de todo esto.
Nótese que esto último se hará muy probablemente en un computador distinto al
que ejecuta Sendmail.
Archivo hosts
El archivo /etc/hosts es complementario al sistema DNS. Para su correcta
operación Sendmail normalmente requiere que el computador en que se ejecuta
tenga una configuración como la siguiente:
[Link] localhost
[Link] [Link]
Hostname
El nombre del computador donde se ejecuta Sendmail debe corresponder a lo con-
figurado en el DNS y el archivo hosts. Lamentablemente, la configuración de este
parámetro varía de sistema en sistema. Por ejemplo, en RedHat, la configuración del
hostname se efectúa en el archivo /etc/sysconfig/network en la variable HOST-
NAME.
[root@edithpiaf root]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=[Link]
GATEWAY=[Link]
La forma más fácil -pero no la única- de proseguir tras modificar el hostname, con-
siste en reiniciar el computador.
o incluso:
/var/adm/sendmail/[Link]
12
Tutorial de Sendmail
Como quizá ya haya observado el lector, el archivo "cf" tiene una sintaxis poco intu-
itiva, y ha sido diseñado principalmente para que el computador lo lea de un modo
eficiente (mas no los humanos.)
El archivo "cf" define generalmente la ruta de otros archivos de configuración auxil-
iares que evitan la modificación directa del primero, simplificando la administración
de Sendmail.
En las últimas versiones de sendmail (8.12 o superiores) es usual que se configure el
servidor para que se ejecute "dividido" en dos programas complementarios a fin de
elevar la seguridad del sistema. La siguiente salida (recortada) de RedHat Linux 8.0
ilustra esta idea:
# ps axuw|grep sendmail
root 16216 ? S 15:43 sendmail: accepting connections
smmsp 16226 ? S 15:43 sendmail: Queue runner@[Link] for /var/spool/clientmqueue
En este caso, el segundo proceso (client queue runner) es controlado mediante otro
archivo de configuración:
/etc/mail/[Link]
Sistema de configuración M4
Motivación
Si el lector tuvo curiosidad de listar el archivo "cf", habrá notado seguramente que
éste tiene una sintaxis muy poco intuitiva. Este problema no ha pasado desapercibido
para los desarrolladores de Sendmail (aunque la cura quizá haya resultado peor que
la enfermedad:)
A fin de facilitar la configuración de Sendmail para los usuarios ocasionales y los
administradores en general, existe un mecanismo complementario que evita la es-
critura y modificación directa del archivo "cf". Este mecanismo consiste en escribir
un archivo relativamente sencillo usando la sintaxis del lenguaje "M4", el cual se pro-
porciona en prácticamente todos los sistemas Unix/Linux (a veces como software
opcional.)
Mediante este sistema, el usuario creará (o modificará) un archivo relativamente
breve, el cual se traducirá en muchas líneas del archivo "cf".
Lo cierto es que es absolutamente impráctico escribir "desde cero" un archivo "cf"
medianamente utilizable, así que el método M4 es una opción casi obligatoria.
13
Tutorial de Sendmail
* NOTA: Asegúrese de sacar una copia al archivo "cf" antes de hacer esto!
En RedHat 7 la secuencia es parecida, aunque los directorios difieren:
bash# cd /usr/share/sendmail-cf/cf
bash# m4 [Link] > /etc/[Link]
bash# ls ../ostype/
aix2.m4 bsdi2.0.m4 irix4.m4 powerux.m4
aix3.m4 bsdi.m4 irix5.m4 ptx2.m4
aix4.m4 darwin.m4 irix6.m4 qnx.m4
aix5.m4 dgux.m4 isc4.1.m4 riscos4.5.m4
altos.m4 domainos.m4 linux.m4 sco3.2.m4
amdahl-uts.m4 dynix3.2.m4 maxion.m4 sco-uw-2.1.m4
aux.m4 gnu.m4 mklinux.m4 sinix.m4
bsd4.3.m4 hpux10.m4 nextstep.m4 solaris2.m4
bsd4.4.m4 hpux11.m4 openbsd.m4 [Link].m4
bsdi1.0.m4 hpux9.m4 osf1.m4 solaris2.pre5.m4
Volviendo a Linux RedHat, los archivos "M4" usados por Sendmail se proporcio-
nan en el paquete "sendmail-cf". Obviamente requerirá también el paquete "m4" para
poder usarlo. En otros sistemas Unix/Linux el software "M4" puede ser opcional o
parte de las herramientas de desarrollo.
En Linux RedHat 8.0 y superiores, es también posible regenerar el archivo "[Link]"
a partir de:
# cd /etc/mail
# m4 [Link] > [Link]
Configuración con M4
El sistema M4 de Sendmail permite generar configuraciones para distintos propósitos
así como alterar opciones bastante puntuales. A modo de ejemplo, el parámetro que
14
Tutorial de Sendmail
Téngase cuidado dentro del archivo "M4" de emplear las comillas adecuadas para
cada caso (obsérve que se han usado ambos tipos:
‘ y ’
Envíos locales
Sendmail normalmente determina si un mensajes es local cuando la dirección de des-
tino contiene sólo un nombre de usuario (por ejemplo, "diego".) Asimismo, cuando
la dirección de destino contiene un host que coincide con el "hostname" del servidor.
Por ejemplo, en la dirección "diego@[Link]" el host especificado (lo que
sigue a la @) es "[Link]"; si este coincide con el hostname del computador,
entonces el mensaje debe ser considerado local.
Una excepción (extremadamente común) a lo último consiste en forzar que ciertas
direcciones sean tratadas como locales. Para esto, el usuario generalmente configu-
rará el archivo /etc/mail/local-host-names con los nombres de host considerados
"locales" o "sinónimos" del host local. Por ejemplo, para que el mensaje con destino
"diego@[Link]" sea también considerado local, habría que incluir en el archivo
/etc/mail/local-host-names:
[Link]
Esto es muy importante, puesto que típicamente las organizaciones deciden utilizar
una dirección de email terminada en "@dominio", donde "dominio" casi nunca coin-
cide exactamente con el hostname del servidor. De no configurarse el archivo local-
15
Tutorial de Sendmail
host-names, todos los mensajes que lleguen al servidor con esta dirección serían
considerados no locales, y por tanto serían rechazados.
En otros sistemas el nombre del archivo de configuración local-host-names puede
variar. Para averiguar o verificar esto, debemos consultar la documentación o en úl-
timo caso el archivo "cf":
# grep "^Fw" /etc/mail/[Link]
Fw/etc/mail/local-host-names
En otras palabras, la "clase w" se puede considerar un "array" que contiene los nom-
bres de las direcciones consideradas "locales". Esta clase se puede configurar en el
archivo "cf" mediante el comando "C" (seguido por el nombre de la clase, o sea "Cw")
o mediante un archivo externo (definido por el comando "F", en nuestro caso "Fw".)
Los envíos locales conllevan a que los mensajes sean almacenados en la "casilla de
correo" del usuario destinatario. El usuario deberá extraer estos mensajes con su pro-
grama "cliente", posiblemente mediante los protocolos IMAP o POP como se verá
después.
La casilla de correo (inbox) es simplemente un archivo cuyo nombre coincide con el
del usuario y se ubica en el directorio /var/spool/mail (como siempre, esto puede
variar en otros Unix.) Como veremos, Sendmail no escribe directamente en este
archivo y por tanto no es parte de su configuración.
16
Tutorial de Sendmail
Envíos Remotos
Sendmail tiene la capacidad de hacer envíos remotos usando el protocolo SMTP (que
opera usando TCP/IP.) En este caso, Sendmail no emplea un programa auxiliar como
en los envíos locales.
Cuando un mensaje no puede ser enviado a uno de los destinatarios, el mensaje es
"encolado" para un posterior reintento.
Para efectuar el envío remoto, Sendmail requiere que los destinatarios del mensaje
posean una "parte de host" distinta al hostname local (o a sus sinónimos de la clase-
w, como se vio en la sección anterior.)
Sendmail normalmente utilizará el DNS a fin de encontrar el servidor remoto que
recibirá el mensaje (específicamente, el registro MX y el registro A) y abrirá una
conexión SMTP.
El archivo "cf" define este envío con una línea como la que sigue.
Msmtp, P=[IPC], F=mDFMuX, S=EnvFromSMTP/HdrFromSMTP, R=EnvToSMTP,
E=\r\n, L=990,
T=DNS/RFC822/SMTP,
A=TCP $h
De estos ejemplos se puede apreciar que las definiciones de los "mailers" o "agentes
de delivery" siempre empiezan con el comando "M", inmediatamente seguido por el
nombre del "mailer".
"mailers" en M4
Los mailers en el archivo M4 deben aparecer al final del archivo fuente M4. Para
generar los dos mailers mencionados arriba, simplemente se requiere:
MAILER(smtp)dnl
MAILER(procmail)dnl
Conceptos
Los mensajes que procesa Sendmail muchas veces no pueden ser enviados a su des-
tino en forma inmediata. Por ejemplo, la línea que conecta nuestra organización a
Internet puede estar detenida, o el mail server remoto puede haberse tornado inacce-
sible.
En estos casos Sendmail "encolará" el mensaje a fin de intentar hacer posteriores rein-
tentos a intervalos predefinidos. Cumplido cierto tiempo, Sendmail desistirá de rein-
tentar y el envío se considera fallido (el usuario que envía recibe una notificación.)
17
Tutorial de Sendmail
En otros sistemas, el lector deberá indagar por los scripts de inicio del servicio Send-
mail para configurar el lapso de queue run.
Donde "substr" es un substring del queue ID del mensaje a enviar (o de los mensajes.)
Por ejemplo, si tenemos los siguientes mensajes encolados:
# sendmail -bp
/var/spool/mqueue (4 requests)
-----Q-ID----- --Size-- -----Q-Time----- ------------Sender/Recipient-
----------
h8RKt4UX001163 16 Sat Sep 27 15:55 <root@[Link]>
(Deferred: Name server: [Link].: host name looku)
<diego@[Link]>
h8RKt4UZ001163 10 Sat Sep 27 15:55 <root@[Link]>
(Deferred: Name server: [Link].: host name looku)
<diego@[Link]>
h8PNiopq002785 298 Thu Sep 25 18:44 root
(Warning: could not send message for past 4 hours)
diego@[Link]
18
Tutorial de Sendmail
Y queremos enviar los dos primeros de la lista (que tienen bastante tiempo en la
cola), podemos especificar su Q-ID completo o un substring del mismo. Por ejem-
plo, puesto que sus Q-ID son "h8RKt4UX001163" y "h8RKt4UZ001163", podremos
emplear el substring "1163" así:
# sendmail -qI1163
[root@edithpiaf root]# sendmail -bp
/var/spool/mqueue (2 requests)
-----Q-ID----- --Size-- -----Q-Time----- ------------Sender/Recipient-
----------
h8PNiopq002785 298 Thu Sep 25 18:44 root
(Warning: could not send message for past 4 hours)
diego@[Link]
h8PNh4RM002734 298 Thu Sep 25 18:43 root
(Warning: could not send message for past 4 hours)
diego@[Link]
Total requests: 2
Nota: Como se indicó anteriormente, en las versiones recientes Sendmail viene divi-
dido en "dos partes", una de las cuales se encarga del procesamiento de los mensajes
enviados desde la línea de comando del servidor (sm-client) y otra de los mensajes
recibidos desde la red. Ambas tienen su propia cola. A fin de ver la cola del "sm-
client" es menester usar:
# sendmail -Ac -bp
Donde msgsize es el tamaño en bytes del mensaje; "class" significa el valor numérico
asignado mendiante a las opciones "Precedence" en el header (por ejemplo, los men-
sajes para listas deben tener baja precedencia), y "nrcpt" es el número de destinatar-
ios del mensaje. ClassFactor y RecipientFactor son factores de ajuste (modificables)
para proporcionar un peso relativo (normalmente 1800 y 3000 respectivamente.) Una
valor más elevado de este resultado en realidad significa que el mensaje es tratado
con menos prioridad.
Por último, en cada intento de envío (cada queue run) un mensaje que no pudo ser
enviado sufre una alteración en su prioridad en "RetryFactor". El default para este
parámetro es 90000.
El ordenamiento de la cola en base a la prioridad es la política por omisión de Send-
mail; sin embargo, la opción QueueSortOrder permite alterar esto. Por ejemplo,
QueueSortOrder=host
O en M4:
define(‘confQUEUE_SORT_ORDER’,‘host’)
19
Tutorial de Sendmail
Encolará los mensajes por el host de destino, estado de conexión con el host (primero
se aprovechan las conexiones abiertas con el host) y luego la prioridad.
Esto es recomendado en conexiones de alta velocidad.
Dominios virtuales
En esta sección veremos la forma en que podamos administrar las cuentas de usuar-
ios en diversos dominios. Por simplicidad, supondremos que los dominios son sólo
dos: "[Link]" y "[Link]". Las cuentas existentes deben ser:
oscar@[Link]
ana@[Link]
alex@[Link]
jose@[Link]
diego@[Link]
ana@[Link]
DiegoMaradona@[Link]
Cuentas en el sistema
Lo primero que haríamos en el caso estándar de un solo dominio es crear las cuentas
de todos los usuarios:
# useradd oscar
# useradd ana
...
Pero hay dos inconvenientes. En primer lugar, hay dos cuentas distintas (para dos
personas distintas) con el mismo usuario "ana". En segundo lugar, la cuenta "Diego-
Maradona" no es válida en la medida que Sendmail intentará enviar los mensajes de
este destinatario a "diegomaradona" (en minúsculas.)
Una solución a este dilema consiste en asociar nombres de usuario totalmente inde-
pendientes de la dirección, más o menos del siguiente modo:
oscar@[Link] -> vdu0001
ana@[Link] -> vdu0002
alex@[Link] -> vdu0003
jose@[Link] -> vdu0004
Cualquier otra dirección en estos dominios (o cualquier nuevo dominio) recibirá así
un "username" formado por la palabra "vdu" y un número secuencial ("vdu" es un
prefijo cualquiera que acabo de imaginar. Para mí significa Virtual-Domain-User.)
Por tanto, crearemos los usuarios del siguiente modo:
# useradd vdu0001
# passwd vdu0001
...
# useradd vdu0007
# passwd vdu0007
20
Tutorial de Sendmail
Lo cual genera la referencia a este archivo así como los rulesets necesarios para
aprovecharlo.
DNS
Como cabría de esperarse, en el DNS debe configurarse los registros necesarios para
que el correo de forma user@[Link] y user@[Link] se redirija a nuestro
servidor. Esto se hace configurando el registro MX en los archivos de configuración
de esas zonas. Si nuestro servidor es "[Link]", la configuración de
la zona "[Link]" debería contener:
@ 1D IN MX 0 [Link].
Local-host-names
Es necesario también indicar a Sendmail que los mensajes de dominios
"[Link]" y "[Link]" deben ser aceptados. Para esto, incluirlos en el
archivo "/etc/mail/local-host-names".
Como siempre, la apertura del relay dependerá de dónde se ubican los clientes, cosa
que no se repetirá aquí.
21
Tutorial de Sendmail
Enmascaramiento
En una red conformada por un servidor de correo y un conjunto de estaciones (como
nuestro dominio "[Link]") los usuarios de seguro redactan sus mensajes
usando MUA’s (clientes) que les permiten (y les exigen) especificar la dirección de
correo con la que el mensaje aparente haberse originado (campo "From" en el header.)
Esto se usa por lo general para que el destinatario pueda respondernos.
En nuestro caso, los usuarios configurarán sus direcciones de origen con algo como
"user@[Link]".
Sin embargo, hay algunos MUA’s que no permiten especificar la dirección de origen
(por extraño que esto suene.) Por ejemplo, el comando "mail" disponible en la may-
oría de sistemas Unix permite enviar mensajes usando Sendmail, pero no especifica
dirección de origen (por lo que Sendmail tiene que "imaginarla".)
A fin de no variar el escenario, supongamos que un usuario llamado "oscarin" se
la conectado (usando telnet) al servidor de correo - no importa el motivo - y desea
enviar un mensaje. Invoca a "mail" del siguiente modo:
oscarin$ mail pepebotella@[Link]
Sendmail tendrá ahora que crear el campo "From" del header, y lo hará usando el
hostname (en nuestro caso, [Link]), por lo que el correo que llega
a "pepebotella@[Link]" aparece como proveniente de:
oscarin@[Link]
Como siempre, regenerar el archivo "cf" con el comando "m4" y reiniciar Sendmail.
Nótese que esto puede no funcionar adecuadamente con el usuario "root" (para facil-
itar ciertos diagnósticos) por lo que se deben emplear usuarios comunes.
Recuérdese que esto sólo es necesario cuando se emplean MUA’s con "problemas" en
el sentido explicado. Más adelante veremos otros casos más interesantes de enmas-
caramiento.
Redundancia
Si nuestro servidor de email de pronto sufre un desperfecto, nuestros mensajes de
email no podrán salir. Esto es grave, pero se puede suplir con llamadas telefónicas u
otros medios.
Sin embargo, más grave es el no responder a los mensajes que nos envían. En cier-
tos casos, los servidores remotos intentarán reenviarnos los mensajes (durante cierto
tiempo.) En otros, puede que esto nunca ocurra y que los mensajes "reboten" inmedi-
atamente. En cualquier caso, es muy grave el hecho de perder estos mensajes. Aquí
analizaremos algunas medidas destinadas a contrarrestar estos inconvenientes.
22
Tutorial de Sendmail
@ MX 10 mailserver1
MX 20 mailserver2
Aquí mailserver1 es el servidor "normal" que recibe los mensajes, mientras que
mailserver2 es el "backup". Esta configuración ocasionará que los mensajes que
llegan del exterior y no pueden ser enviados a mailserver1 sean enviados a
mailserver2.
Frecuentemente estos servidores guardarán los mensajes en las casillas de email de
los usuarios destinatarios respectivos, a fin de que éstos los recojan vía protocolos
POP o IMAP. El problema es que la mayoría de clientes de email POP/IMAP sólo se
pueden configurar para acceder a un servidor a la vez.
En otras palabras, si mailserver1 deja de operar y mailserver2 toma la posta, en-
tonces todos los usuarios de la red local deberán ser reconfigurados para que apunten
a mailserver2.
Esto puede ser aceptable en ciertas circunstancias, como en el caso de tener pocos
clientes.
A fin de evitar esto, es posible hacer algunos artificios asumiendo que mailserver1
está inoperativo.
Si nuestros clientes están apuntando a mailserver1 mediante su dirección IP, en-
tonces se puede asociar temporalmente esta dirección IP a mailserver2 por medio
de un "IP virtual" o "IP alias".
Si nuestros clientes están apuntando a mailserver1 mediante su nombre (vía DNS)
entonces se puede modificar temporalmente la configuración del DNS para que
mailserver1 apunte al IP de mailserver2 (cambiar el registro A.)
Con esto los clientes accederán a mailserver2 de modo casi transparente... sin em-
bargo, si usan IMAP y han creado carpetas en el servidor, obviamente estas carpetas
no podrán verse (pues se quedaron en mailserver1.) Informe a sus usuarios de esta
situación.
Otro inconveniente radica en el restablecimiento de mailserver1. Ciertos usuarios
pueden haber dejado mensajes sin leer en mailserver2 que deberán ser trasladados
manualmente a mailserver1 para que estén disponibles en su INBOX. Herramientas
como fetchmail pueden ayudar en estos casos.
En general, si mailserver1 va a ser interrumpido por sólo unos minutos, es mejor
que mailserver2 NO se haga cargo del email entrante por los inconvenientes señal-
ados. Una solución más adecuada (y costosa) consiste en que ambos servidores com-
partan un área de almacenamiento externo compartido.
Un servidor remoto
En el caso de que nuestra conexión a Internet se interrumpa, o en caso de un desas-
tre general en nuestra organización, conviene disponder de un servidor ubicado en
un lugar geográficamente distante y accesible mediante proveedores distintos (a fin
de aumentar la redundancia.) En algunos casos, este servidor puede ser el de otra
organización, con la que pactaremos este servicio.
A la configuración anterior del DNS, añadiremos otra línea:
23
Tutorial de Sendmail
@ MX 10 mailserver1
MX 20 mailserver2
MX 30 [Link].
Como se ve, una última opción de envío consiste en que los mensajes lleguen al
servidor "[Link]". Normalmente este servidor rechazaría nue-
stros mensajes (pues nuestras direcciones terminan en @[Link].) Pero,
puesto que hemos hecho un acuerdo previo, en "[Link]" han aña-
dido la siguiente línea en su archivo access:
[Link] RELAY
Ahora, en caso de que nuestra conexión se interrumpa, los MTA’s remotos inten-
tarán como última opción a [Link], el cual recibirá nuestros men-
sajes y tratará (infructuosamente) de reenviarlos a nuestros servidores mailserver1
y mailserver2. Como no puede, los encolará y los intentará reenviar posteriormente
(ver la sección dedicada al encolamiento para más información.)
Tabla 1.
Trujillo [Link]
usuario@[Link]
Cuzco [Link]
usuario@[Link]
Iquitos [Link]
usuario@[Link]
24
Tutorial de Sendmail
el punto de vista del email, cada subdominio viene a ser una organización indepen-
diente. En cada servidor (en cada ciudad) el administrador crea sus propias cuentas
independientes.
El DNS deberá contener entradas independientes para cada uno de estos servidores
(aquí llamados lima-mail, tru-mail, cuzco-mail, iqui-mail, pto-mail.)
; archivo de zona de [Link]
lima IN MX 10 lima-mail
lima-mail IN A [Link]
trujillo IN MX 10 tru-mail
tru-mail IN A [Link]
cuzco IN MX 10 cuzco-mail
cuzco-mail IN A [Link]
iquitos IN MX 10 iqui-mail
iqui-mail IN A [Link]
pmaldonado IN MX 10 pto-mail
pto-mail IN A [Link]
Un sólo dominio
Tratemos de mejorar el esquema anterior. Intentemos que todas las direcciones sean
de la forma usuario@[Link], manteniendo los cinco servidores en cada ciu-
dad. El primer inconveniente de este esquema es que si tenemos dos usuarios llama-
dos "diego" en Lima y Cuzco, y ambos originalmente tenían direcciones:
diego@[Link]
diego@[Link]
ahora habrá que buscar una forma de diferenciarlos. Por ejemplo, podríamos usar
"diego1" y "diego2". Esto, si bien no es estéticamente agradable, puede ser mejorado
con el uso de aliases. Pero dejaremos esto para más adelante.
Ahora bien, si un mensaje llega desde el exterior a "usuario@[Link]", ¿qué servi-
dor lo recibe?
Una posibilidad es designar un servidor adicional (ubicado en cualquier ciudad) para
que sirva como "switch", aunque podría ser cualquiera de los otros, como veremos.
Este servidor deberá ser capaz de redirigir el mensaje al servidor adecuado. Es decir,
deberá disponer de una tabla similar a:
Tabla 2.
Usuario Destino
diego1 [Link]
diego2 [Link]
25
Tutorial de Sendmail
Todo esto permite que los mensajes destinados con @[Link] lleguen al servi-
dor de correo local que les corresponde.
Los problemas pendientes son:
Pérdida de independencia
Cada administrador local debe notificar al administrador del switch de que se ha
creado un usuario local a fin de que se le registre en virtusertable. Se pierde inde-
pendencia y no hay una forma sencilla de evitar esto.
Performance/Tuning
26
Tutorial de Sendmail
Por lo siguiente:
; archivo de zona de [Link]
@ IN MX 10 switch
switch IN A [Link]
switch IN A [Link]
switch IN A [Link]
lima IN MX 10 lima-mail
lima-mail IN A [Link]
...
Esto supone disponer de tres mailservers llamados "switch" asociados a las direc-
ciones IP [Link][123]. Bajo condiciones normales, esto balanceará la carga entre los
tres servidores. Para más información, revise la referencia [2] en lo referente a "Round
Robin Load Distribution".
El método NAT consistiría en nuestro ejemplo en redirigir las conexiones destinadas
a la dirección [Link] (no habría ningún cambio en el DNS) hacia un grupo de otras
direcciones (DNAT) que realmente están asociadas a los servidores de email. Los
ruteadores normalmente disponen de estas facilidades (y por supuesto Linux cuando
actúa como router, usando el comando iptables.) No lo explicaremos aquí.
27
Tutorial de Sendmail
Esto se debe observar a distintas horas. Un valor razonable puede ser el máximo
observado durante la semana multiplicado por dos.
Por otro lado, si el sistema constantemente tiene problemas de falta de memoria, y
se sospecha que el problema está asociado a un número elevado de "queue runners",
puede ser conveniente reducir esta opción gradualmente (quizá reduciendo 10% al
valor observado) a fin de aliviar este problema. Esto ocasionará que algunos mensajes
encolados tarden más en procesarse.
En M4:
define(‘confTO_QUEUEWARN’,‘2h’)
define(‘confTO_QUEUERETURN’,‘1d’)
Recordar que un valor "PRI" más elevado es menor prioridad y por tanto hace más
probable que la ecuación anterior se verifique.
QueueFactor es una opción configurable cuyo valor por omisión es 600000.
En sistemas grandes puede ser necesario elevar el valor de QueueLA:
O QueueLA=15
En M4:
define(‘confQUEUE_LA’,‘15’)
29
Tutorial de Sendmail
El valor por omisión de esta opción es doce. En sistemas grandes puede ser necesario
elevar este valor.
O RefuseLA=18
En M4:
define(‘confREFUSE_LA’,‘18’)
En M4:
define(‘confCONNECTION_RATE_THROTTLE’,‘5’)
Reglas y Rulesets
En una primera lectura de este tutorial sugiero evitar todo este material puesto que
no es esencial para la gran mayoría de administradores de Sendmail.
Las reglas son especificaciones de configuración que sirven para modificar las direc-
ciones electrónicas y detectar errores en las mismas. Hay diversos motivos por los
que una direccion electrónica debe ser modificada; por ejemplo, si se desea que todos
los mensajes luzcan como si hubieran sido enviados desde cierto computador aunque
en realidad se han enviados desde diversos computadores de distinto nombre.
Los conjuntos de reglas se agrupan en los llamados "Rulesets" que funcionan a modo
de "subrutina" de cualquier lenguaje de programación. Los "Rulesets" se identifican
con un número, aunque en las últimas versiones de Sendmail es posible identificarlos
con una palabra (que internamente es traducida a un número por Sendmail.)
Algunos rulesets son definidos internamente (como los rulesets 0, 1, 2, 3, 4, y 5) mien-
tras que otros se definen manualente en el archivo "cf".
Los rulesets se definen mediante el comando "S" y las reglas mediante el comando
"R". A continuación un extracto del archivo "cf" que viene con RedHat 8.0 en el que se
ilustra el ruleset "0" o también denominado "parse". Obsérvese que el ruleset termina
donde empieza uno nuevo:
######################################
### Ruleset 0 -- Parse Address ###
######################################
Sparse=0
Esta salida puede ser muy distinta en otros sistemas Unix/Linux, pero por el mo-
mento eso no importa.
El ruleset 0 se pudo definir mediante "S0" en lugar de "Sparse", pero como "parse" es
más "comprensible" que "0", entonces se prefiere esta última forma (Sparse=0.)
Para verificar cómo ha cargado Sendmail las reglas, se puede usar el modo de test de
Sendmail con el comando "=S" y el número del ruleset:
# sendmail -bt
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> =S 0
R$* $: $> Parse0 $1
R< @ > $# local $: < @ >
R$* $: $> ParseLocal $1
R$* $: $> Parse1 $1
Nótese que esto coincide con la definición del archivo de configuración. De igual
modo puede consultarse con el nombre del ruleset:
# sendmail -bt
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> =S parse
R$* $: $> Parse0 $1
R< @ > $# local $: < @ >
R$* $: $> ParseLocal $1
R$* $: $> Parse1 $1
Como es fácil de apreciar, cada ruleset consiste de varias "reglas" definidas con el
comando "R".
Cada regla consiste de dos partes separadas por un tabulador, posiblemente seguidas
de un comentario (separado también por un tabulador.)
Como se ve, hemos definido la macro "MAILHUB", el ruleset "prueba" y una única
regla. Para que la regla esté adecuadamente definida, es imprescindible que sus tres
partes estén separadas por al menos un tabulador (no espacios):
R$+@$+ <TAB> $1*${MAILHUB} <TAB> convierte user@host
Para probar nuestra regla, ejecutaremos Sendmail en modo de prueba pero especifi-
cando el nuevo archivo "cf":
31
Tutorial de Sendmail
Tokens
A fin de comprender las reglas, es necesario conocer el concepto de "token".
Las direcciones electrónicas procesadas en los rulesets por las reglas son interna-
mente fraccionadas en varias unidades independientes denominadas "token". Así,
la dirección proporcionada en el ejemplo de arriba: "diego@[Link]" es interna-
mente dividida en los siguientes cinco tokens:
diego
@
hotmail
.
com
Los siguientes caracteres normalmente delimitan los tokens (y actúan ellos mismos
como tokens adicionales):
.:@[]
()<>,;\"\r\n
Expresiones de búsqueda
En el ejemplo de arriba, la LHS está conformada por dos "expresión de búsqueda"
(comodines o wildcards) de tipo "$+". Estos sirven para buscar coincidencias de uno
o más "tokens". Más adelante veremos más de estos comodines.
En nuestro ejemplo, la dirección proporcionada hizo coincidir el primer "$+" con el
token "diego" y el segundo "$+" con los tokens "hotmail", ".", "com".
Por el lado de la RHS, el contenido de cada "expresión de búsqueda" es accesible
mediante los operadores $1, $2, ... respectivamente. Para nuestro caso, tendremos:
$1 = diego
$2 = hotmail . com
32
Tutorial de Sendmail
Rulesets Internos
Los rulesets 0, 1, 2, 3, 4, 5 están reservados para usos específicos de Sendmail. A
futuro Sendmail puede definir los rulesets 6, 7, 8, 9. En general, es conveniente que el
usuario defina - si lo requiere - rulesets con textos identificatorios (para que Sendmail
automáticamente los numere) con lo que se evitan conflictos innecesarios.
Es conveniente conocer el uso que da Sendmail a los rulesets internos. La siguiente
figura intenta ilustrar este punto.
Figura 1.
En general, todas las direcciones electrónicas pasan por el ruleset 3 apenas se inicia
el procesamiento de las mismas. Entre otras cosas, el ruleset 3 extrae la dirección
electrónica "apta para procesamiento" a partir de la dirección electrónica entregada
por los clientes.
Por ejemplo, es usual que las direcciones electrónicas luzcan así (tal como las genera
el programa cliente):
Pedro Escobedo <pescobedo@[Link]>
# sendmail -bt
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> 3 Pedro Escobedo <pescobedo@[Link]>
canonify input: Pedro Escobedo < pescobedo @ noskhon . com . pe >
Canonify2 input: pescobedo < @ noskhon . com . pe >
Canonify2 returns: pescobedo < @ noskhon . com . pe . >
canonify returns: pescobedo < @ noskhon . com . pe . >
Finalmente, todavía en modo test, pruébese el comando "/parse" que permite sim-
ular el procesamiento de una dirección de correo electrónico (por ejemplo, pruebe
"/parse user@localhost".)
Las macros cuyos nombres tienen más de un caracter deben usar llaves en su defini-
ción y su expansión:
D{PRUEBA}[Link]
... ${PRUEBA} ...
34
Tutorial de Sendmail
Clases
Las "clases" son una suerte de variables tipo "array", es decir, que pueden contener
un conjunto de valores.
Las clases no se solapan con las macros. Por ejemplo, existe la clase "w" que no tiene
relación alguna con la macro "w". Los elementos de la clase se añaden con el comando
"C". Por ejemplo, los siguientes dos comandos añaden los elementos "localhost" y
"[Link]" a la clase "w" del archivo "cf":
[root@edithpiaf tmp]# grep ’^Cw’ /etc/mail/[Link]
[Link]
Cwlocalhost
La clase w desde M4
Como se ve, esta clase es especial. A tal efecto si usamos el método M4 y se de-
sea generar un archivo "cf" que incluya la configuración via el archivo local-host-
names deberá usarse:
FEATURE(use_cw_file)dnl
Descripción
Supondremos que nuestra organización se desempeña tras un Firewall. Podríamos
hacer que el esquema anterior siga sin variaciones simplemente habilitando los
puertos respectivos en el filtro de paquetes. Sin embargo, aquí consideraremos
una situación más complicada en la que se requiere de dos servidores de email.
Asumimos que el lector conoce el concepto de una red DMZ (zona desmilitarizada)
usada como primera línea de defensa para los servicios que deben dar cara al
exterior.
Uno de estos servidores de email se encontrará en la red DMZ (correo_dmz) y será
accesible desde Internet (aunque pasando por el Firewall), y el otro se encuentra
dentro de nuestra red LAN (correo_lan). Las estaciones seguirán configuradas
35
Tutorial de Sendmail
Configuración de correo_dmz
Este servidor no almacenará los mensajes pendientes en casillas, por lo que
no requiere que se inscriban allí nuestros usuarios. A fin de que los mensajes
36
Tutorial de Sendmail
[Link] smtp:correo_lan.[Link]
Los detalles que vimos para el archivo access son aplicables a este archivo. En par-
ticular, para activar esta funcionalidad desde el archivo "mc", se debe incluir:
FEATURE(‘mailertable’,‘hash -o /etc/mail/mailertable’)dnl
Por otro lado, "correo_dmz" sirve de relay a "correo_lan", por lo que debemos in-
scribir a este último en /etc/mail/access como se vió en una sección anterior:
correo_lan.[Link] RELAY
correo_dmz IN A [Link]
correo_lan IN A [Link]
ns1 IN A [Link]
Configuración de correo_lan
Tal como vimos en una sección anterior, se debe modificar el archivo
/etc/mail/local-host-names (o su equivalente) para que se acepten los mensajes
con el formato deseado.
Ahora haremos que se envíe todo el correo no local hacia el computador
"correo_dmz" en lugar del Internet. Para esto, debemos regenerar el archivo "cf" a
partir del "mc", añadiendo previamente la siguiente directiva a éste último:
define(‘SMART_HOST’, ‘smtp:correo_dmz.[Link]’)dnl
Eso debería bastar. Revise los logs, verifique que el firewall no bloquee más de lo
necesario.
37
Tutorial de Sendmail
Vamos a configurar el MUA para que acceda a nuestro servidor de correo. Asumimos
que ya están activos los servicios POP o IMAP. Cuál de estos se usará para traer los
mensajes, y de qué usuario, se selecciona en el menu Edit -> Preferences -> Mail
Servers -> Incoming Mail Servers -> Edit o Add -> Server Name y Username , como
se aprecia en la figura:
38
Tutorial de Sendmail
Asimismo, en Edit -> Preferences -> Mail Servers -> Outgoing (SMTP)
server, se debe especificar nuevamente nuestro servidor de correo, puesto que
hacia allí se enviarán los mensajes que redactemos.
Finalmente, en Edit -> Preferences -> Identity , se debe especificar nuestra di-
rección de email y nuestro nombre real, tal como lo verán los destinatarios:
39
Tutorial de Sendmail
Ahora Ud. debería poder enviar mensajes a usuarios locales (de la forma
user@[Link]), y recibir mensajes desde cualquier lugar de Internet. Pruebe a
crear algunos usuarios en el servidor y a hacer que se intercambien mensajes desde
sus estaciones.
C. Referencias
[1] Bryan Costales & Erick Allman: Sendmail. 2th Edition. O’Reilly. USA. ISBN 1-
56592-222-0
[2] Paul Albitz & Cricket Liu: DNS and BIND. 4th Edition. O’Reilly. USA. ISBN 0-
596-00158-4. 2001
Notas
1. [Link]
40