Как очистить кеш для ответа socket.gethostbyname?

Кто-нибудь сталкивался с этим раньше:

После обновления записей DNS. Я копаю «test.somedomain.com» и получаю 167.69.143.234, однако, когда я делаю socket.gethostbyname («test.somedomain.com»), я получаю 167.69.6.234.

Я предполагаю, что сокет все еще использует кеш... как его очистить? или смыть?

Мой код очень прост:

Терминал Linux

dig test.somedomain.com

Питон:

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

Он должен возвращать адрес 167.69.143.234, поскольку он обновлен в DNS.


person Jim    schedule 03.08.2011    source источник


Ответы (2)


Python socket.gethostbyname использует преобразователь операционной системы и не имеет API для очистки кэша. Кэш (который может быть кэширующим DNS-сервером, используемым операционной системой, операционной системой или компонентом стандартной библиотеки) является фундаментальным элементом системы DNS, и «правильный способ» справиться с ним — дождаться, пока значение TTL записи не истечет. истекает (после этого операционная система должна удалить устаревшее значение из кэша). При обновлении DNS у вас, вероятно, должно быть ранее настроено старое значение TTL.

Вы также можете использовать реализацию DNS Python, например DNSPython, вместо использования socket.gethostbyname — тогда вы должны иметь полный контроль над кешем распознавателя (но не кеши NS, которые использует распознаватель). Хотя, вероятно, это не решит вашу проблему (я думаю, с существующим кодом).

person Jacek Konieczny    schedule 03.08.2011

DNS по умолчанию не кэшируется в Linux и требует демона, такого как sssd или nscd. Вы можете просто перезапустить демон, чтобы принудительно получить новый адрес.

Примечание для пользователей Windows: есть кеш по умолчанию, который можно очистить с помощью ipconfig /flushdns.

В качестве альтернативы у вас может быть жестко закодированная запись в /etc/hosts, сначала проверьте ее. Такие инструменты, как dig или nslookup, будут напрямую запрашивать DNS-сервер, минуя библиотечную подсистему NSS.

person Steve-o    schedule 04.08.2011