Postfix: Dinamización del listado de redes locales

Descripción

Postfix define cuales son las redes locales que se conectan a él a través de la variable mynetworks, esta variable contiene una lista de IPs y/o subredes para definir que MTAs o MUAs son considerados de la misma red (de confianza) para el servidor Postfix que administramos.

El problema

Si uno de los MUAs o MTAs que se conectan a nuestro MTA lo hace desde una IP dinámica no podemos poner su hostname en la lista de IPs de mynetworks.

En que afecta

Los hosts que se consideran locales (definidos en mynetworks) tienen un trato especial, por ejemplo, si se hace un control de acceso por RBLs y el host de confianza que se nos quiere conectar pertenece a un rango considerado peligroso gracias a que esa IP pertenece a un rango de confianza la restricción de la RBL no le afectará. Para que esto pase el fichero de configuración main.cf de postfix contendría algo así:

...
mynetworks = 1.1.1.1
...
smtpd_client_restrictions =
        permit_mynetworks,
        reject_rbl_client dnsbl.njabl.org,
        reject_rbl_client cbl.abuseat.org,
        reject_rbl_client bl.spamcop.net,
        reject_rbl_client dnsbl.sorbs.net,
        reject_rbl_client  sbl-xbl.spamhaus.org
...

La solución

Como otros muchos comandos de Postfix podemos hacer que el contenido de la variable mynetworks sea dinámico, o sea, que se pregunte su contenido directamente contra un servidor de tablas TCP. Este servidor lo hemos programado a medida para que a través de un fichero de configuración se obtenga la lista de IPs y/o hostnames que queremos considerar como própios. El hecho de soportar hostnames nos permite que estos se resuelvan contra más de una IP o con una IP dinámica. Estas funcionlidades extendien el comportamiento de la variable mynetworks.

Consideración

Para cada connexión que reciba Postfix el servidor de tablas TCP para mynetworks recibirá una petición de resolución, esto no significa una nueva conexión ya que a menudo se aprovechará otros sockets abiertos para hacer las peticiones.

Ejemplo del protocolo de tabla TCP para mynetworks

postfix > servidor : get hostname_fqdn_no_local
servidor > postfix : 500 este hostname no es local
...
postfix > servidor : get hostname_fqdn_local
servidor > postfix : 200 este hostname es local

Código fuente

El código fuente del servicio de tablas mynetorks esta junto al resto de código del servidor de backend.