Apéndice B


Ejemplos de Archivos de Configuración para smail

Este apéndice muestra ejemplos de archivos de configuración para un sistema UUCP terminal en una red de área local. Están basados en los archivos de ejemplo que se incluyen en la distribución de las fuentes de smail-3.1.28. Aun cuando se intenta explicar someramente como trabajan dichos archivos, le aconsejo que lea la página de manual de smail(8), que trata acerca de estos archivos con gran detalle. Una vez que Ud. comprendió la idea básica de la configuración de smail, merece la pena leerla. ĦEs fácil!

El primer archivo que se muestra es el routers, mediante el cual se establecen los encaminadores de smail. Cuando smail tiene que enviar un mensaje a una dirección dada, prueba con las direcciones de todos los encaminadores, uno por vez, hasta que concuerda con la de uno de ellos. La concordancia significa que el encaminador encuentra el nodo de destino en su base de datos, sea en el archivo paths, en el /etc/hosts, o en cual sea el mecanismo de encaminamiento que se utilice.

Las entradas en los archivos de configuración de smail siempre comienzan con un nombre único que identifica el encaminador, transporte, o programa de entrega local. Luego le sigue una lista de atributos que definen su comportamiento. Esta lista consta de un conjunto de atributos globales, tales como el controlador utilizado, y atributos privados que solo tienen sentido para ese controlador particular. Los atributos están separados mediante comas. El conjunto de atributos globales se separa de los privados mediante un punto y coma.

Intentemos clasificar estas distinciones. Supongamos que Ud. quiere mantener dos archivos de alias de caminos distintos; uno que contiene la información de encaminamiento para su dominio, y otro que almacena la información de encaminamiento global, generada probablemente por los mapas de UUCP. Con smail, puede especificar dos encaminadores en el archivo routers, y ambos utilizarán el controlador pathalias. Este controlador busca los nombres de nodo en la base de datos pathalias.

#
# base de datos de alias de caminos para el encaminamiento dentro del dominio
domain_paths:
driver=pathalias, # busca el nodo en el archivo de caminos
transport=uux; # si lo encuentra lo envía a través de UUCP

file=paths/domain, # el archivo es /usr/lib/smail/paths/domain
proto=lsearch, # el archivo no esta ordenado (búsqueda lineal)
optional, # si el archivo no existe, no importa
required=vbrew.com, # buscar solo los nodos tipo *.vbrew.com

#
# base de datos de pathalias para encaminamientos fuera de nuestro dominio
world_paths:
driver=pathalias, # busca el nodo en el archivo de caminos
transport=uux; # si lo encuentra, lo envía a través de UUCP
 
file=paths/world, # el archivo es /usr/lib/smail/paths/world
proto=bsearch, # el archivo fue clasificado con sort(1)
optional, # si el archivo no existe, no importa
-required, # no es obligatorio tener dominio
domain=uucp, # quitar el ".uucp" final antes de la búsqueda

 

El segundo atributo global que se ha mostrado en cada una de las dos entradas de routers define el transporte que se deberá utilizar cuando el encaminador haga concordar las direcciones. En nuestro caso, el mensaje se enviara utilizando el transporte uux. Los transportes se definen en el archivo transports, que se explica mas adelante.

Se puede hacer un ajuste más fino con respecto a que transporte se utilizará para enviar un mensaje si especifica un archivo de método en lugar del atributo transport. Los archivos de método son una forma de traducir los nombres de nodo a los transportes necesarios. No los trataremos aquí.

El siguiente archivo routers define los encaminadores para una red de área local que utiliza la biblioteca de resolución. Sin embargo, en un nodo Internet Ud. querrá utilizar un encaminador que maneje registros MX. Por lo tanto, deberá quitar los caracteres de comentario del encaminador alternativo inet_bind que usa el controlador BIND incorporado en smail.

En un contexto en el cual se utilizan UUCP y TCP/IP a la vez, puede Ud. encontrarse con el problema de que haya ciertos nodos que figuran en su archivo /etc/hosts con los cuales se contacta solo ocasionalmente mediante SLIP o PPP. En general, el correo hacia estos sistemas se debe enviar mediante UUCP. Para evitar que el controlador inet_hosts concuerde con dichas máquinas, deberá agregarlos al archivo paths/force. Este archivo es otra base de datos del estilo de alias de caminos, y se consulta antes de que smail consulte al sistema de resolución.

# Ejemplo de archivo /usr/lib/smail/routers
#
# force - obliga a enviar mediante UUCP a ciertos nodos, aun en el caso
# en que estén en nuestro /etc/hosts
force:
driver=pathalias, # busca el nodo en el archivo de caminos
transport=uux; # si lo encuentra, envío a través de UUCP

file=paths/force, # el archivo es /usr/lib/smail/paths/force
optional, # si el archivo no existe, no importa
proto=lsearch, # el archivo no esta ordenado
# (busqueda lineal)
-required, # no es obligatorio tener dominio
domain=uucp, # quitar el ".uucp" final antes de la búsqueda

# inet_addrs - encuentra literales de dominio que contienen literales
# de direcciones de IP, como por ejemplo janet@[191.72.2.1]
inet_addrs:
driver=gethostbyaddr, # controlador para encontrar literales
# de dominios IP
transport=smtp; # enviar utilizando SMTP sobre TCP/IP

fail_if_error, # fallar si la dirección esta mal formada
check_for_local, # enviar directamente si nosotros somos
# el nodo

# inet_hosts - encuentra nombres de nodo con gethostbyname(3N)
# Quítelo de los comentarios si desea usar en su lugar la versión BIND
inet_hosts:
driver=gethostbyname, # busca nodos con la funcion de biblioteca
transport=smtp; # usar SMTP de forma predeterminada

-required, # no es obligatorio tener dominio
-domain, # no hay sufijos de dominio definidos
-only_local_domain, # no se restrinja a los dominios definidos

# inet_hosts - versión alternativa usando BIND para acceder al DNS
#inet_hosts:
# driver=bind, # utilizar el controlador BIND incorporado
# transport=smtp; # usar TCP/IP SMTP para el envío
#
# defnames, # usar búsqueda de dominio estándar
# defer_no_connect, # intentar de nuevo si el servidor de
# nombres no está activo
# -local_mx_okay, #

#
# base de datos tipo pathalias para el encaminamiento dentro del dominio
domain_paths:
driver=pathalias, # busca el nodo en el archivo de caminos
transport=uux; # si lo encuentra, envío a través de UUCP
file=paths/domain, # el archivo es /usr/lib/smail/paths/domain
proto=lsearch, # el archivo no esta ordenado
# (búsqueda lineal)
optional, # si el archivo no existe, no importa
required=vbrew.com, # buscar solo los nodos tipo *.vbrew.com

#
# base de datos tipo pathalias p/encaminar hacia nodos fuera de nuestro dominio
world_paths:
driver=pathalias, # busca el nodo en el archivo de caminos
transport=uux; # si lo encuentra, envío a través de UUCP

file=paths/world, # el archivo es /usr/lib/smail/paths/world
proto=bsearch, # el archivo fue clasificado con sort(1)
optional, # si el archivo no existe, no importa
-required, # no es obligatorio tener dominios
domain=uucp, # quitar el ".uucp" final antes de la búsqueda
# smart_host - redireccionador de nodo inteligente parcialmente especificado
# Si el atributo smart_path no se define en
# /usr/lib/smail/config, se ignorará este encaminador.
# La variable global smart_transport tiene precedencia sobre
# el atributo transport
smart_host:
driver=smarthost, # controlador para el caso especial
transport=uux; # si no hay otra especificación,
# envío a través de UUCP

-path, # usar la variable del archivo
# de configuración smart_path

 

El manejo del correo para las direcciones locales se configura en el archivo directors. Este se construye de la misma manera que el archivo routers, y consta de una lista de entradas que definen los redirectores respectivos. Los redirectores no envían los mensajes, sino que solamente realizan todas las redirecciones que sean posibles, por ejemplo a través de alias, reenvío de correo y cosas por el estilo.

Cuando se envía correo a una dirección local, como janet, smail pasa el nombre del usuario a todos los redirectores del modulo de entrega local, uno por vez. Si un redirector concuerda, entonces o bien especifica el transporte a través del cual el mensaje debe enviarse (por ejemplo, el nombre de archivo del buzón del usuario) o, si no, genera una nueva dirección (por ejemplo al evaluar un alias).

Por las cuestiones de seguridad involucradas, los redirectores generalmente realizan varios controles para ver si los archivos que se usan son archivos sensibles del sistema. Las direcciones que se obtienen a partir de medios dudosos (por ejemplo desde un archivo aliases con permisos de escritura para todo el mundo) se indican como inseguras. Algunos controladores de transporte se negarán a utilizar dichas direcciones, por ejemplo el transporte que envía mensajes a un archivo.

Además, smail también asocia un usuario con cada dirección. Cualquier operación de lectura o escritura se realizan operando con los permisos y privilegios del usuario correspondiente. Para enviar un mensaje a, por ejemplo el buzón de janet, la dirección esta asociada por supuesto a janet. Las otras direcciones, tales como las que se obtienen del archivo aliases, tienen otros usuarios asociados a ellas, por ejemplo, el usuario nobody.

Para mas detalles de estas características, refiérase por favor a la página de manual de smail(8).

# Ejemplo de archivo /usr/lib/smail/directors

# aliasinclude - expande las direcciones ":include:filename"
# producidas por los archivos de alias
aliasinclude:
driver=aliasinclude, # use este controlador para caso especial
nobody; # si es inseguro, acceder al archivo como
# usuario nobody

copysecure, # obtener los permisos desde el
# redireccionador de alias
copyowners, # obtener los propietarios a partir del
# redireccionador de alias

# forwardinclude - expande las direcciones ":include:filename"
# producidas por los archivos de reenvío (forward)
forwardinclude:
driver=forwardinclude, # use este controlador de caso especial
nobody; # si es inseguro, acceder al archivo como
# usuario nobody

checkpath, # controlar la accesibilidad del camino
copysecure, # obtener los permisos desde el

# redireccionador de reenvíos
copyowners, # obtener los propietarios desde el
# redireccionador de reenvíos

# aliases - buscar las expansiones de alias almacenadas en la base de datos
aliases:
driver=aliasfile, # redireccionador de alias de propósito general
-nobody, # de manera predeterminada, todas las direcciones
# están siempre asociadas a nobody
sender_okay, # no quitar el remitente de las expansiones
owner=owner-$user; # los problemas se mandan a la dirección
# del propietario

file=/usr/lib/aliases, # predeterminado: compatible con sendmail
modemask=002, # no debe ser de escritura para todo el mundo
optional, # si el archivo no existe, no importa
proto=lsearch, # archivo ASCII sin ordenar

# dotforward - expande los archivos .forward de los directorios 'home'
# de los usuarios
dotforward:
driver=forwardfile, # redireccionador de reenvíos de
# propósito general
owner=real-$user, # los problemas se envían al buzón del usuario
nobody, # usar usuario nobody, si es inseguro
sender_okay; # nunca se quita el remitente en la expansión

file=~/.forward, # archivo .forward en los directorios 'home'
checkowner, # el usuario puede ser el propietario
# de este archivo
owners=root, # o el root puede serlo
modemask=002, # no debe ser de escritura para todo el mundo
caution=0-10:uucp:daemon, # no correr como root o daemon
# hay que ser extremadamente cuidadoso con los directorios 'home'
# que se acceden remotamente
unsecure="~ftp:~uucp:~nuucp:/tmp:/usr/tmp",

# forwardto - expande la linea "Forward to " al frente
# del archivo buzón del usuario
forwardto:
driver=forwardfile,
owner=Postmaster, # errores al Postmaster
nobody, # usar usuario nobody, si es inseguro
sender_okay; # no quitar remitente en la expansion

file=/var/spool/mail/${lc:user}, # posicion del buzón del usuario
forwardto, # habilitar el control "Forward to "
checkowner, # el usuario puede ser propietario
# de este archivo
owners=root, # o el root puede serlo
modemask=0002, # bajo System V, el grupo mail puede escribirlo
caution=0-10:uucp:daemon, # no corra como root o daemon

# user - encuentra usuarios en el nodo local con envio a sus respectivos buzones
user: driver=user; # controlador para encontrar nombres de usuario

transport=local, # el transporte local es hacia los buzones
# real_user - encuentra nombres de usuario cuando estan prefijados
# con la cadena "real-"
real_user:
driver=user; # controlador para encontrar nombres de usuario

transport=local, # el transporte local es hacia los buzones
prefix="real-", # por ejemplo, encontrar real-root

# lists - expande listas de correo almacenadas debajo de /usr/lib/smail/lists
lists: driver=forwardfile,
caution, # marcar todas las direcciones con prudencia
nobody, # y luego asociarlas al usuario nobody
sender_okay, # NO quitar el remitente
owner=owner-$user; # el propietario de la lista

# pasar a minúsculas el nombre de la lista de correo
file=lists/${lc:user},

 

Después de encaminar o redireccionar un mensaje, smail lleva el mensaje al transporte especificado por el encaminador o redireccionador que concordó con la dirección. Estos transportes están definidos en el archivo transports. Nuevamente, se define un transporte mediante un conjunto de opciones globales y privadas.

La opción más importante que se define para cada entrada se refiere al controlador que realiza el transporte, por ejemplo el controlador pipe, que invoca el comando especificado en el atributo cmd. Además de este, existen una cierta cantidad de atributos globales que puede utilizar un transporte, que realizan varias transformaciones en la cabecera del mensaje, y posiblemente en su cuerpo. El atributo return_path, por ejemplo, hace que el transporte inserte un campo return_path en la cabecera del mensaje. El atributo unix_from_hack hace que se preceda toda ocurrencia de la palabra From al principio de una línea con el signo >.

# Ejemplo de archivo /usr/lib/smail/transports

# local - envía correo a los usuarios locales
local: driver=appendfile, # agrega el mensaje al archivo
return_path, # incluir un campo Return-Path:
from, # proveer una línea de sobre con From_
unix_from_hack, # insertar > antes de From en el cuerpo
local; # usar formatos locales para el envío

file=/var/spool/mail/${lc:user}, # posición del archivo buzón
group=mail, # el grupo propietario del archivo
# para System V
mode=0660, # el grupo mail puede acceder
suffix="\n", # agregar un cambio de línea extra

# pipe - enviar el correo a través de comandos de shell
pipe: driver=pipe, # encauzar el mensaje hacia otro programa
return_path, # incluir un campo Return-Path:
from, # proveer una linea de sobre con From_
unix_from_hack, # insertar > antes de From en el cuerpo
local; # usar formatos locales para el envío

cmd="/bin/sh -c $user", # enviar las direcciones al shell Bourne
parent_env, # info de entorno a partir de la dirección
# del padre
pipe_as_user, # usar user-id asociado con la dirección
ignore_status, # ignore un status de salida distinto de cero
ignore_write_errors, # ignore errores de escritura,
# por ejemplo: tubería cortada
umask=0022, # umask para el proceso hijo
-log_output, # no registrar stdout/stderr en el
# archivo de registro

# file - enviar el correo a archivos
file: driver=appendfile,
return_path, # incluir un campo Return-Path:
from, # proveer una línea de cabecera con From_
unix_from_hack, # insertar > antes de From en el cuerpo
local; # usar formatos locales para el envío

file=$user, # el nombre del archivo se toma de
# la dirección
append_as_user, # usar el user-id asociado con la dirección
expand_user, # expandir ~ y $ dentro de la dirección
suffix="\n", # agregar un cambio de línea extra
mode=0600, # poner los permisos en 600

# uux - envíos al programa rmail de una instalación UUCP remota
uux: driver=pipe,
uucp, # usar formatos de direcciones estilo UUCP
from, # proveer una línea de sobre con Form_
max_addrs=5, # máximo 5 direcciones por invocación
max_chars=200; # máximo 200 caracteres en dirección

cmd="/usr/bin/uux - -r -a$sender -g$grade $host!rmail $(($user)$)",
pipe_as_sender, # que los registros uucp registren al llamador
log_output, # guardar las salidas de error para
# los mensajes rebotados
# defer_child_errors, # reintentar si uux retorna un error

# demand - envíos al programa rmail remoto, el sondeo es inmediato
demand: driver=pipe,
uucp, # usar formatos de direcciones estilo UUCP
from, # proveer una línea de sobre con Form_
max_addrs=5, # máximo 5 direcciones por invocación
max_chars=200; # máximo 200 caracteres en dirección

cmd="/usr/bin/uux - -a$sender -g$grade $host!rmail $(($user)$)",
pipe_as_sender, # que los registros uucp registren al llamador
log_output, # guardar las salidas de error para
# los mensajes rebotados
# defer_child_errors, # reintentar si uux retorna un error

# hbsmtp - half-baked BSMTP. Los archivos de salida deben procesarse
# regularmente y enviarse via UUCP.
hbsmtp: driver=appendfile,
inet, # usar direccionamiento RFC 822
hbsmtp, # SMTP por lotes sin HELO ni QUIT
-max_addrs, -max_chars; # no hay limite en el número de direcciones

file="/var/spool/smail/hbsmtp/$host",
user=root, # el archivo es propiedad de root
mode=0600, # solo legible-escribible por root.

# smtp - envios utilizando SMTP sobre TCP/IP
smtp: driver=tcpsmtp,
inet,
-max_addrs, -max_chars; # no hay límite en el número de direcciones

short_timeout=5m, # timeout para operaciones breves
long_timeout=2h, # timeout para operaciones SMTP
# de mayor duración
service=smtp, # conectar a este puerto de servicio
# Para uso en internet: descomente las siguientes 4 líneas
# use_bind, # resolver MX y registros A múltiples
# defnames, # usar búsqueda de dominio estándar
# defer_no_connect, # reintentar si el servidor de nombres
# # no está activo
# -local_mx_okay, # no usar MX con el sistema local