I-postfix: (0.03) (potato)(woody) Servidor SMTP más seguro que sendmail y exim Cambios 0.02 16/1/01 alias de root a usuario 0.03 4.1.04 mynetworks = ... Copyright Manel Marin @ 2000 Cubierto por la licencia GNU GPL disponible en http://www.gnu.org/copyleft/gpl.html Se puede copiar, distribuir y modificar libremente bajo los términos de la GPL e incluyendo siempre este párrafo ***POR HACER:*** Envío de faxes con Hylafax a "nombre@1234567.fax" ANTES DE EMPEZAR: 1) Instalar el paquete postfix Durante la instalación se crea un usuario y grupo postfix:postfix -Create world writable mail drop? [no] Se crea el grupo postdrop -Start Postfix now? [y] 2) Cambios de configuración Potato nos deja un archivo bastante configurado, solo hay que afinar unos detalles... Uso con conexión a Internet intermitente (sin autollamada "dialup") Uso con conexión a Internet permanente sin dominio válido (ADSL) +---------------------------------------------------------------------------- | ATENCIÓN: main.cf solo admite comentarios (#) al principio de la linea, no | poner espacios ni tabuladores antes del # para evitar errores +---------------------------------------------------------------------------- Añadir al final de /etc/postfix/main.cf ---8<--- relayhost = smtp.de_proveedor_de_internet.es --->8--- Verificar/ajustar en main.cf nuestra red local (para hacer rele) ---8<--- mynetworks = 127.0.0.0/8, 192.168.0.0/24 --->8--- Enviar correo a Internet al conectarnos: Potato ya añade el archivo /etc/ppp/ip-up.d/postfix conteniendo ---8<--- #!/bin/sh -e #... /usr/sbin/sendmail -q --->8--- Si queremos que la conexión se cierre sola al acabar de enviar el correo, este script no debe acabar hasta que el correo se ha enviado (o intentado enviar una vez cada mensaje) ---8<--- #!/bin/sh -e /usr/sbin/sendmail -q sleep 10 while mailq | grep '^[^ ]*\*' > /dev/null do sleep 10 done --->8--- Esto se basa en las respuestas de mailq, mira el Anexo-II (los mensajes que están siendo enviados tienen un símbolo '*' tras la ID en la primera palabra de la linea) 3) Reescritura de cabeceras Si tenemos que utilizar las cuentas de correo de un proveedor necesitamos que en los mensajes de cada usuario los dos Sender: (el del mensaje y el del envoltorio) sean la dirección de correo válida Vamos a crear un "sender_canonical_maps" que reescribe solo las direcciones del "remitente" y no las de destino a) Creamos (o aprovechamos de exim) el archivo /etc/email-addresses *En el de exim hay que quitar los ":" tras el nombre para que funcione* ---8<--- manel manel3@apdo.com --->8--- b) Añadimos a /etc/postfix/main.cf ---8<--- sender_canonical_maps = hash:/etc/email-addresses --->8--- c) Hay que generar el hash (ahora y cada vez que modifiquemos la tabla) postmap /etc/email-addresses 4) Activamos todos los cambios /etc/init.d/postfix reload 5) Enviar correo de root a usuario (alias) - Editar /etc/aliases ---8<--- webmaster: root root: manel --->8--- - Generar hash a partir del archivo de alias . newaliases SEGURIDAD: 1) Limitar interfaces a nuestra red local y nuestro propio servidor (loopback) a) Añadir (o descomentar) en /etc/postfix/main.cf ---8<--- inet_interfaces = $myhostname, localhost --->8--- b) Cerrar los socket y volver a abrirlos para hacer efectivo este cambio: /etc/init.d/postfix stop /etc/init.d/postfix start 2) Que no corra como root Postfix está compuesto de muchos procesos pequeños que son lanzados por un "manager" que es el único que corre como root, y no interacciona con los usuarios Los demás procesos corren como usuario postfix Este sistema es una buena solución ya que el servidor SMTP necesita privilegios root para varias cosas importantes: - Aceptar correo de entrada local de un cliente a través de un pipe y dejarlo en el dir de spool (parece la forma estándar de entregar correo local) - Cambiar a los privilegios del usuario de destino al entregar el correo con el ~/.forward 3) Que no haya ningún suid root No lo hay (BIEN) USO: mailq # Ver correo en cola pendiente de envío newaliases # Genera el hash a partir del archivo de los alias PRUEBAS: Enviar correo con "mail", "mutt", o "communicator" Es bueno mirar las cabeceras para ver que todo está bien... POR DENTRO: Procesos[1] por los que pasan los mensajes: sendmail Recoge el correo local y lo deja en el dir maildrop si es escribible por todo el mundo postdrop Programa setgid que deja el correo en el dir maildrop si no es escribible por todo el mundo pickup Toma el correo del dir maildrop y lo entrega a cleanup smtpd Acepta conexiones de red SMTP y entrega correo a cleanup cleanup Pone mensajes en la cola -los puede reescribir trivial-rewrite Reescribe (completando) y resuelve direcciones man canonical Tabla de reescritura de cabeceras man virtual Tabla de redirección "por sobre" sin reescritura qmgr Gestiona las colas de correo -rebota correo de usuarios en en la BD "relocated" man relocated Tabla de "user has moved" smtp Envía los mensajes vía SMTP -los problemas de suministros se comunican a: - bounce - defer local Suministra correo local -procesa los archivos ~/.forward manager Lanza todos los demás (corre como root) [1] Todos estos procesos tienen una página man (sección 8, p.e. man 8 local) ARCHIVOS: /etc/postfix/main.cf Config /var/log/mail.log Log /var/log/mail.warn /var/log/mail.err /var/spool/postfix/* Directorios de spool (y otras cosas) /var/spool/postfix/deferred Correos a reintentar? /var/spool/postfix/defer Mensajes sobre correos a reintentar? Parámetros de reescritura en la config: canonical_maps Reescribe Sender: y To: recipient_canonical_maps Reescribe solo los dos To: sender_canonical_maps Reescribe solo los dos Sender: DEFICIENCIAS: No veo la forma de reescribir cabeceras solo en los mensajes que se envían a internet y no en los locales RODEO: Tener dos servidores de correo, uno local sin reescritura que envíe mensajes no locales a otro servidor en el cortafuegos con reescritura, ¿ambos podrían estar en la misma máquina? BUGS: MAS AYUDA: Mi chuleta comparativa de servidores SMTP "0-potato-smtp" En http://www.postfix.org puedes encontrar: Postfix FAQ Postfix Anatomy - Receiving Mail Postfix Configuration - Basics Postfix Overview - Introduction /usr/doc/postfix/examples/sample-rewrite.cf /usr/doc/postfix/examples/sample-canonical.cf man canonical man virtual man aliases Anexo-I archivo de configuración ---8<--- ... # Other configurable parameters. # ESTO LO PONE LA POSTINST DE DEBIAN myhostname = este_host.dominio_local myorigin = este_host_o_gateway_si_lo_hay.dominio_local alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases # MM # ESTO LO HE PUESTO YO relayhost = smtp.proveedor.es sender_canonical_maps = hash:/etc/email-addresses inet_interfaces = $myhostname, localhost --->8--- Anexo-II respuestas del comando mailq #Desconectados $ mailq -Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient------- D543D440F3 812 Sat Oct 7 23:14:47 manel3@apdo.com (Name service error for domain smtp.proveedor.es: Host not found, try again) manel3@apdo.com -- 0 Kbytes in 1 Request. #El correo se está enviando $ mailq -Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient------- D543D440F3* 812 Sat Oct 7 23:14:47 manel3@apdo.com manel3@apdo.com -- 0 Kbytes in 1 Request. #No hay correo por enviar $ mailq Mail queue is empty