¿Cómo vaciar la memoria caché para la respuesta socket.gethostbyname?

Cualquiera que se encuentre con esto antes:

Después de actualizar los registros de DNS … Hago una búsqueda para ‘test.somedomain.com’, obtengo 167.69.143.234, sin embargo, cuando hago un socket.gethostbyname (‘test.somedomain.com’) obtengo 167.69.6.234.

Supongo que el socket todavía está usando el caché … ¿cómo lo borro? o tirarlo?

Mi código es muy simple:

Linux Termianl

dig test.somedomain.com 

Pitón:

 import socket socket.gethostbyname('test.somedomain.com') 

Debe devolver la dirección 167.69.143.234 ya que es la actualizada en DNS.

El socket.gethostbyname de Python utiliza el sistema de resolución del sistema operativo y no tiene API para borrar su caché. El caché (que puede ser un servidor DNS de almacenamiento en caché usado por el sistema operativo o un sistema operativo o un componente de biblioteca estándar) es un elemento fundamental del sistema DNS y “la forma correcta” de afrontarlo es esperar hasta el valor TTL del registro. expira (el sistema operativo debería eliminar el valor obsoleto de la memoria caché). Cuando actualice el DNS, probablemente debería tener TTL del valor anterior ajustado anteriormente.

También puede usar una implementación de Python DNS, como DNSPython en lugar de socket.gethostbyname ; debe tener el control total sobre la caché de resolución (pero no las cachés de NS que usa la resolución). Sin embargo, probablemente no solucionará su problema (con un código existente, supongo).

DNS no se almacena en caché en Linux de manera predeterminada y requiere un demonio como sssd o nscd . Simplemente puede reiniciar el demonio para forzar el tirado de la nueva dirección.

Nota para los usuarios de Windows: hay un caché predeterminado que se puede borrar con ipconfig /flushdns .

Alternativamente, puede tener una entrada codificada en /etc/hosts , verifique allí primero. Las herramientas como dig o nslookup consultarán directamente al servidor DNS y evitarán el subsistema de la biblioteca NSS.