Soluciones de configuración de exim4
Actualmente (debian 12), la configuración básica se hace mediante dpkg-reconfigure exim4-config. Todo lo que sigue da por supuesto que se utiliza configuración dividida en ficheros en /etc/exim4/conf.d/. El fichero de configuración en uso real siempre es /var/lib/exim4/config.autogenerated, generado mediante sudo update-exim.conf; despues de actualizarlo hay que reiniciar exim para que cargue la nueva configuración.
No existe un fichero determinado para configuración local de macros que luego se usan en los ficheros de configuración, pero en algún lugar de la doc de debian recomiendan conf.d/main/000_localmacros.
1. Puertos de escucha
Algunos clientes estúpidos, se niegan a usar el pto 25 con TLS. Para soportarlos, en debian se usa una opción que hay en /etc/default/exim4, llamada SMTPLISTENEROPTIONS, cdocumentada en el propio fichero.
2. Dovecot delivery
La configuración exim se describe en /usr/share/doc/dovecot-core/wiki/LDA.Exim.txt.gz, y consiste fundamentalmente un nuevo transporte dovecot definido en conf.d/transport/30_exim4-dovecot_delivery y en un nuevo router para usuarios locales que dirija las entregas a ese transporte.
3. Autenticación plain bajo TLS
En conf.d/auth/30_exim4-config_examples hay ejemplos para diversos mecanismos de configuración. Para usuarios de sistema se usa el #plain_saslauthd_server. Lo mejor es, en lugar de quitar los comentarios al ejemplo, implementarlo en fichero nuevo en el mismo dir.
4. rblspam
En conf.d/main/000_localmacros, CHECK_RCPT_IP_DNSBLS = zen.spamhaus.org
En conf.d/acl/30_exim4-config-check_rcpt el tratamiento de la macro CHECK_IP_RCPT_DNSBLS se hace por defecto con warn, lo que se traduce solo en una cabecera añadida al mensaje (que habría que filtrar, por tanto, despues): mas fácil ponerlo a deny y ya está, mientras CHECK_IP_RCPT_DNSBLS no contenga rbls dudosas.
5. Blacklists
En conf.d/acl/30_exim4-config-check-rcpt se implementan, entre otros dos ficheros blacklist: CONFDIR/local_host_blacklist, que contiene lista de hosts que queremos rechazar y CONFDIR/local_sender_blacklist, que contiene direcciones o dominios-en-direcciones. Cuidado con los nombres de host en el primero pq un fallo en dns hace fallar todo el correo pq todo el correo pasa por esta acl (aunque bien mirado, si no tienes dns otras cosas tb van a fallar).
6. log para debug
Ver conf.d/main/90_exim4-config_log_selector.
7. TLS como cliente
Para que funcione tls_advertise_hosts, MAIN_TLS_ENABLE ha de estar a yes; si no, ignora el valor que se le ponga y siempre es *.
8. Cliente de smarthost
Para poder enviar correos desde máquinas que no estan en internet, hay que configurar su exim con el tipo de config smarthost (o satellite, que no contempla siquiera correo local), que consiste en utilizar un smarthost para enviar todo su correo. Cosas importantes a considerar aki:
- Poner como nombre del smarthost exactamente el mismo que haya en su certificado. Me ha llevado horas averguar qué coño pasaba, porque registra error de certificado en ambos lados
- Habilitar TLS tb en el cliente, porque el smarthost debe estar configurado para que la autenticación se produzca dentro del intercambio encriptado y, si no se habilita TLS en el cliente, la autentticación no llega a producirse. En debian, lo normal es que todos los modelos de autenticación esten reservadas a modo TLS, y para evitarlo hay que definir AUTH_SERVER_ALLOW_NOTLS_PASSWORDS.
- Poner las credenciales de autenticación en el smarthost en /etc/exim4/passwd.client/. Ver el formato con man exim4-config_files y man exim4_passwd_client.
9. Autenticación clientes no sistema.
Se puede poblar /etc/exim4/passwd con credenciales de clientes no sistema. Ver exim4-config_files(5) (no confundir con etcexim4/passwd.client).
10. ACLs
El capítulo relevante de la referencia es: https://www.exim.org/exim-html-current/doc/html/spec_html/ch-access_control_lists.html
Hay unos nombres de acls pre-definidos como acl_smtp_rcpt, pero en debian conf.d/main/02_exim4-config_options define acl_smtp_rcpt = MAIN_ACL_CHECK_RCPT, permitiendo poner en esa macro el nombre de una acl definida mediante otro nombre, que por defecto es acl_check_rcpt, definida en conf.d/acl/30_exim4-config_check_rcpt.
Ahora bien, puede ser que sea necesario modificar algo incluído en esa acl, pero si tocas el 30_exim4-config_check_rcpt, que viene en el paquete debian, luego al re-instalar te aparece el típico mensaje de conflicto. La solución es la siguiente:
- En local macros se asigna MAIN_ACL_CHECK_RCPT = acl_check_rcpt_mio.
- Se crea conf.d/acl/300_exim4-config_check_rcpt donde se define la acl acl_check_rcpt_mio esa acl de la siguiente manera
acl_check_rcpt_mio: accept acl = acl_local_deny_exceptions acl = acl_check_rcpt
... donde acl_local_deny_exceptions es una acl definida en conf.d/acl/20_exim4-config_local_deny_exceptions (solo para su uso desde otras acls) que acepta como sender los nombres que esten incluídos en sender_local_deny_exceptions, entre otros. Dado que la condición acl resulta verdadera si la acl a la que se llama devuelve true y false si devuelve deny, nuestro accept funciona si cualquiera de las dos acls devuelve true y si el accept no funciona, la acl termina con el deny implícito que toda acl lleva al final.
11. Routers
Los routers se usan, principalmente para determinar el transporte a utilizar según la dirección del mensaje, pero tb para convertir esa dirección en una o mas nuevas. Los routers se van probando uno a uno hasta que se encuentra uno que acepta la dirección o determina que hay que devolver (bounce) el mensaje.
11.1. Wildcards en etcaliases
Por defecto, no se pueden usar. Pero se pueden usar expresiones regulares cambiando lsearch por nwildlsearch en etcexim4/conf.d/router/400_..._aliases, de forma que funcione algo como:
^chafar-.+: chafar_correo
... eso funciona, pero tiene el inconveniente de que re-instalaciones de exim encontraran un fichero del paquete modificado y preguntaran qué hacer. Se podría utilizar un 399_exim4-config_system_aliases fusilando el router del 400_... (probablemente con otro nombre) e introduciendo ese cambio: al aparecer antes en el fichero de configuración final, nuestro clon se ejecuta antes, acepta la dirección y ya no se intentan los siguientes routers. Esto no lo he probado, pero seguro que funciona.
También se puede implementar lo mismo en el router que determina la entrega local mediante local_part_suffix = +* : -* y local_part_suffix_optional, aunque no he comprobado que funcione (lo tengo en el router de entrega local dovecot_delivery, pero tb tengo el primer mecanismo que describo: no sé cual está funcionando.