Caché de DNS y hosts en Java

Algo que puede generar muchos dolores de cabeza si no se sabe, es que Java cuenta con un sistema interno de caché de hosts, además, por defecto suele estar con un valor infinito lo que implica que únicamente se consultará vía DNS ó /etc/hosts la primera vez, después, hasta que no se reinicie la JVM se servirá desde la caché interna de Java.

La clave son estas dos propiedades de seguridad:

networkaddress.cache.ttl


Specified in java.security to indicate the caching policy for successful name lookups from the name service.. The value is specified as integer to indicate the number of seconds to cache the successful lookup.

A value of -1 indicates “cache forever”. The default behavior is to cache forever when a security manager is installed, and to cache for an implementation specific period of time, when a security manager is not installed.

networkaddress.cache.negative.ttl (default: 10)

Specified in java.security to indicate the caching policy for un-successful name lookups from the name service.. The value is specified as integer to indicate the number of seconds to cache the failure for un-successful lookups.

A value of 0 indicates “never cache”. A value of -1 indicates “cache forever”.

Estas propiedades se especifican en el archivo de configuración java.security de la instalación de java, si el valor es “-1”, la caché es ilimitada, ya sea para consultas correctas networkaddress.cache.ttl) como fallidas (networkaddress.cache.negative.ttl):

root@foo:/usr/java/jdk1.8.0_111/jre/lib/security# grep networkaddress.cache java.security
networkaddress.cache.ttl=-1
networkaddress.cache.negative.ttl = 10

Si modificamos este valor, la JVM en ejecución debe ser reiniciada para que aplique los cambios. Pese a que el método recomendado es aplicarlo a nivel global de Java, en caso de ser necesario, también podemos aplicarlo directamente a una JVM específica pasando como parámetro la propiedad de sistema -Dsun.net.inetaddr.ttl=30.

sun.net.inetaddr.ttl

This is a Oracle JDK private system property which corresponds to networkaddress.cache.ttl. It takes the same value and has the same meaning, but can be set as a command-line option. However, the preferred way is to use the security property mentioned above.

-Dsun.net.inetaddr.ttl=secs