[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Exim



On Thu, Mar 22, 2001 at 01:24:08AM +0100, IJAS wrote:
> Hola... llevo 1 semana peleando con el exim (ya se que soy muy bruto) y
> nada que no lo echo a andar... a parte de la documentación de
> /usr/doc/exim ¿hay algún COMO (si es en español mejor)?.... Problemas
> que encuentro:
> 1) Inicialmente me dejaba los mensajes como 'frozen' hasta que me di
> cuenta que tenia que enmascarar el dominio con el de mi ISP
> 2) Ahora me dice noseque de que mi /var/spool(???)/input está locked y
> sigue sin enviar nada ¿¿??
> 3) Como hago para que el envio del correo lo pueda hacer sin entrar como
> root... yo antes, con smail, tenia un script que cuando conectaba a
> internet me enviaba (smail -q) los mensajes pendientes en la cola y
> luego bajaba (con fetchmail) los mensajes de varios servidores. Cuando
> cerraba la conexión tenia otro script que hacía lo mismo, mandaba los
> mensajes que hubiera pendientes y volvia a comprobar los servidores
> pop3, luego cerraba la conexión.... ¿como hago algo parecido con exim?
> 
> Gracias
Aqui tienes un COMO en español...no profundiza mucho...pero para ayudar en la configuracion...

A lo del /var/spool...noseq+ asi a bote pronto no tengo ni idea.

Para configurarlo...casi lo mejor q haces, por lo menos para mi es usar eximconf y luego ajustar la configuracion a mano

Espero haberte servido de algo

Title: Configuración básica de Exim / COMO

Configuración básica de Exim / COMO

Alberto García González, Internet: bertogg@yahoo.com, Fidonet: 2:348/105.108

v1.21, 13 de Enero del 2000


Este documento explica la forma de configurar el MTA Exim para los casos típicos de PCs con conexión a internet via módem, usando la característica de reescritura de cabeceras

1. Introducción

Antes de nada, aclarar que no soy ningún experto en Exim, y todo esto está basado en la experiencia: es el método que uso yo y algunas personas más actualmente, y está funcionando bien. Sin embargo, no puedo garantizar que esté libre de errores. Espero que os sirva de ayuda. Cualquier duda, consulta, comentario o sugerencia será agradecido.

Este documento no prentende en ningún caso ser exhaustivo. Se trata de una pequeña guía para poner a punto una configuración básica de Exim, un servidor de SMTP más sencillo de configurar que otros equivalentes como el conocido Sendmail. No por ello Exim es un programa menos serio, sino que puede satisfacer perfectamente las necesidades de un servidor SMTP normal.

Este texto está orientado a un perfil típico de un usuario de PC, con un ordenador o una pequeña red local conectada a Internet via modem, por ejemplo. El objetivo de esta configuración es la reescritura del campo From: de los mensajes de correo salientes, de forma que aparezca la dirección de internet en lugar de la dirección local.

NOTA: Este documento está basado en Exim 3.03 (de Debian potato), pero probablemente es también aplicable a otras versiones de Exim, ya que los cambios en los ficheros de configuración son mínimos.

Este documento se puede encontrar en mi página web, cuya dirección es http://www.geocities.com/bertogg/linux

2. Estructura general del fichero de configuración de Exim

El fichero de configuración se divide en 6 bloques. Cada bloque está separado del siguiente por la palabra ``end'', excepto el último que no lleva ``end''. Todos los bloques deben aparecer, si alguno se encuentra vacío tiene que aparecer el ``end'' de todos modos. Los bloques son los siguientes:

  1. Configuración principal: aquí van las directivas principales de configuración, las preferencias, etc., como el nombre de nuestra máquina, a quién hacemos relay, etc. etc.
  2. Transports: Cuando se sabe definitivamente cómo y a donde se va a enviar un determinado mensaje, el transport correspondiente es el que se encarga de hacerlo. Cada transport tiene un driver que indica el tipo de reparto. Ejemplos de drivers: ``appendfile'', que concatena el msg a un fichero (para folders UNIX normales), ``smtp'' que hace una conexión a un smtp para enviar.
  3. Directors: Cuando un mensaje va a una dirección local, se busca un director que sepa qué hacer con ella. Son los que se encargan de buscar en el fichero de aliases, etc. El orden ES importante.
  4. Routers: cuando una dirección no es local, se busca el primer router que sea capaz de enviarla. El orden ES importante.
  5. Retry: Aquí se especifica el tiempo que tiene que transcurrir hasta que un msg se considere que no se puede enviar.
  6. Reescritura: Aquí están las reglas de reescritura de cabeceras.

Cómo funciona exim (a grosso modo):

Cuando exim recibe un email, lo primero que hace es aplicar las reglas de reescritura de cabeceras. Una vez reescrito, se comprueba si el destinatario es local o está en otra máquina. Si es local, se pasa por la lista de directors, hasta que alguno sepa qué hacer con él y lo reparta.

Si no es local, se pasa por la lista de routers, también hasta que alguno sepa qué hacer con él.

Para saber si un email es local, se compara el dominio del detinatario con la lista definida en el campo ``local_domains'' en el fichero de configuración.

3. Configuración reescribiendo todos los mensajes

El primer ejemplo que vamos a ver es una reescritura simple: suponemos que tenemos una red con dos ordenadores ``pc1.mired'' y ``pc2.mired'', y estamos en pc1.

Queremos que todo el correo que salga con ``From: usuario1@pc1.mired'' se chequee en una base de datos, por si hay que reescribir la dirección de ``usuario1'' por otra: usuario1@pc1.mired -> usuario@cuenta.inet

Vamos a partir de una configuración básica cualquiera. En Debian, el script eximconfig genera un fichero de configuración que nos puede servir de maravilla, si seleccionamos ``Internet system using smarthost''. En este documento, en la sección Configuración de ejemplo, hay una basada en esa.

Estas son algunas directivas importantes a considerar en la parte 1 de la configuración. Una vez que todo esté funcionando, se recomienda echarle un vistazo al manual para dejar esto a gusto de cada uno:

----------------------------------------------
# Este es el nombre completo de la máquina.
primary_hostname = pc1.mired

# Nombres a los que podemos dirigir correo refiriéndonos a nuestra máquina.
# Cualquier mail que vaya a uno de estos dominios se considera local
# La '@' equivale al valor de primary_hostname
local_domains = @:pc1:localhost

# Las IPs de nuestra máquina también se consideran locales
local_domains_include_host_literals = true

# No permitimos relay a ninguna parte 
relay_domains = ""

# A nuestras máquinas sí permitimos hacer relay a cualquier parte
host_accept_relay = localhost:*.mired
----------------------------------------------

En la parte 2 (transports) la cosa se puede dejar igual, no es necesario tocar nada. En la parte 3 (directors), pues lo mismo.

Ahora viene la parte 4 (routers). Esto es todo lo necesario:

----------------------------------------------
# Todo el correo que vaya a alguna de las máquinas de la red local se envía
# directamente. A continuación explico cada flag:
# driver = lookuphost -> Se resuelve el nombre de la máquina para saber su IP
# domains -> Para usar este router, el dominio tiene que ser uno de estos.
#            Pon aquí todos los nombres válidos para una máquina de la LAN
# self = local -> Si al resolver el nombre se obtiene nuestra IP, se envía
#                 el mensaje como si fuese local. Si todos los posibles
#                 nombres de nuestra máquina ya están en 'local_domains',
#                 esto no es necesario
# gethostbyname -> Así se mira el /etc/hosts
# transport -> Uno de los que aparecen en la sección de transports,
#              que se encarga de enviar el correo via SMTP
red_local:
  driver = lookuphost
  domains = "*.mired:pc2"
  self = local
  gethostbyname = true
  transport = remote_smtp

# Si en el dominio ponemos una dirección IP, se viene por este router
literal:
  driver = ipliteral
  transport = remote_smtp

# Todo lo que no pasó por el anterior se viene por aquí. Todo el correo se
# envía al smarthost 'smtp.proveedor.es'
smarthost:
  driver = domainlist
  transport = remote_smtp
  route_list = "* smtp.proveedor.es bydns_a"

end
----------------------------------------------

La parte 5 es la de ``retry configuration''. La puedes dejar como está o poner a tu gusto.

Finalmente, la parte 6 es la de reescritura. Esta irá así:

----------------------------------------------
*@pc1.mired       ${lookup{$1}lsearch{/etc/email-addresses}\
                                       {$value}fail} bcfrF
----------------------------------------------

Creamos el fichero /etc/email-addresses, de la forma:

    usuario1:       cuenta1@dom1.sub1
    usuario2:       cuenta2@dom2.sub2

De esta manera, cualquier mail que enviemos, si el login del que lo envía está en ese fichero, llegará reescrito. Si nos enviamos un email a nosotros mismos en la propia máquina, podremos comprobar que llega con el From: reescrito.

4. Configuración reescribiendo sólo correo saliente

Si sólo nos interesa que se reescriba el From: de los mensajes que salen de la red local (algo bastante usual), el método es bastante similar. Este es un método que se me ocurrió hace algún tiempo, pero pensaba que tenía que haber otra manera de hacerlo. Consultando el FAQ del Exim, comprobé que allí se explicaba una manera muy similar a esta, por lo que decidí que mi método era correcto.

A partir del exim.conf anterior, hacemos las siguientes modificaciones:

De esta forma, todo el correo que llegue al router ``correo_exterior'', será pasado nuevamente al exim, pero esta vez con otra configuración diferente.

Esta es la otra configuración, el fichero /etc/exim.conf.external:

-------------------
########### General
local_domains =
relay_domains = *
spool_directory = /var/spool/exim/external
end
########### Transports
remote_smtp:
  driver = smtp
end
########### Directors
end
########### Routers
smarthost:
  driver = domainlist
  transport = remote_smtp
  route_list = "* smtp.proveedor.es bydns_a"
end
########### Retry
*                      *           F,2h,15m; G,16h,2h,1.5; F,4d,8h
end
########### Reescritura
*@pc1.mired       ${lookup{$1}lsearch{/etc/email-addresses}\
                                       {$value}fail} bcfrF
-------------------

Esto ya no tiene mucho misterio. Esta vez no hay ``local_domains'', así que ningún mensaje es local. Todo se envía al router ``smarthost'' que lo envía a internet. Y como vemos, esta configuración sí reescribe la cabecera.

Lo que sí hay que notar es que el directorio de spool es diferente. Esto es así para evitar problemas. Por eso, los que vacíen la cola del exim al conectar a internet deben añadir la opción ``-C /etc/exim.conf.external'', para vaciar sólo la cola del correo que va a internet, que es la que tiene sentido ahí. El comando debería quedar más o menos de la forma ``exim -qf -C /etc/exim.conf.external''

5. Consideraciones adicionales

Enviar el correo a internet usando el SMTP de nuestro proveedor no es la única opción disponible. Normalmente, estos smarthosts hacen control de relay, por lo que si conectamos en un momento dado con un proveedor distinto, es muy posible que no podamos enviar correo a internet. Una posible solución es enviar el correo directamente a su destino en lugar de usar un smarthost. Así tendremos la ventaja adicional de que el correo llegará antes. Para hacer eso, tan sólo hay que sustituir el router ``smarthost'' que tenemos en los dos ejemplos por este otro:

--------------------------------
correo_saliente:
  driver = lookuphost
  transport = remote_smtp
--------------------------------

Y esto es todo lo que hay. Espero que lo disfruteis. Se aceptan comentarios, críticas, sugerencias, agradecimientos, etc. :))

Próximamente ampliaré este COMO con un nuevo método para reescribir sólo el correo saliente y manteniendo una única cola de correo. Aunque parece que funciona bien, de momento está en fase de pruebas O:) Estoy disponible en mi dirección de correo habitual para cualquier consulta sobre él.

6. Configuración de ejemplo

Este es un ejemplo de configuración que puede valer perfectamente. Sólo hay que modificarla un poco para adaptarla a cada caso. Está basado en el fichero de ejemplo que genera el programa de configuración de Debian.

El nombre del fichero es /etc/exim.conf

####### EJEMPLO DE CONFIGURACION DE EXIM

primary_hostname = pc1.mired

local_domains = @:pc1:localhost
local_domains_include_host_literals = true

relay_domains = ""
host_accept_relay = localhost:*.mired

host_lookup = 0.0.0.0/0

trusted_users = mail

smtp_verify = false

gecos_pattern = ^([^,:]*)
gecos_name = $1

received_header_text = "Received: \
          ${if def:sender_fullhost {from ${sender_fullhost} \
          ${if def:sender_ident {(${sender_ident})}}\n\t}\
          {${if def:sender_ident {from ${sender_ident} }}}}\
          by ${primary_hostname} \
          ${if def:received_protocol {with ${received_protocol}}} \
          (Exim ${version_number} #${compile_number})\n\t\
          id ${message_id}"
end

###### TRANSPORTS

local_delivery:
  driver = appendfile
  group = mail
  mode = 0660
  mode_fail_narrower = false
  file = /var/spool/mail/${local_part}

address_pipe:
  driver = pipe
  return_output

address_file:
  driver = appendfile

address_directory:
  driver = appendfile
  no_from_hack
  prefix = ""
  suffix = ""

address_reply:
  driver = autoreply

remote_smtp:
  driver = smtp

end

####### DIRECTORS

real_local:
  prefix = real-
  driver = localuser
  transport = local_delivery

system_aliases:
  driver = aliasfile
  file_transport = address_file
  pipe_transport = address_pipe
  file = /etc/aliases
  search_type = lsearch

userforward:
  driver = forwardfile
  file_transport = address_file
  pipe_transport = address_pipe
  reply_transport = address_reply
  no_verify
  check_ancestor
  file = .forward
  modemask = 002
  filter

localuser:
  driver = localuser
  transport = local_delivery

end

###### ROUTERS

red_local:
  driver = lookuphost
  domains = "*.mired:pc2"
  gethostbyname = true
  self = local
  transport = remote_smtp

literal:
  driver = ipliteral
  transport = remote_smtp

smarthost:
  driver = domainlist
  transport = remote_smtp
  route_list = "* smtp.proveedor.es bydns_a"
      
end


###### RETRY

# Domain               Error       Retries
# ------               -----       -------
*                      *           F,2h,15m; G,16h,2h,1.5; F,4d,8h

end

###### REESCRITURA

# Fin de la configuración de Exim

Attachment: pgpmhELomEAGV.pgp
Description: PGP signature


Reply to: