Как очистить кеш для ответа 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.