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

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

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

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

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

Linux Termianl

dig test.somedomain.com

Python:

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

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

2 ответа

Решение

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

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

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

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

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

Другие вопросы по тегам