如何刷新socket.gethostbyname的缓存响应?
有没有人遇到过这个问题:
我更新了DNS记录后,使用命令查询'test.somedomain.com',结果得到了167.69.143.234。但是当我用socket.gethostbyname('test.somedomain.com')时,却得到了167.69.6.234。
我猜socket可能还是在用缓存……那我该怎么清除它呢?或者说,怎么刷新一下?
我的代码非常简单:
Linux终端
dig test.somedomain.com
Python:
import socket
socket.gethostbyname('test.somedomain.com')
它应该返回167.69.143.234这个地址,因为这是在DNS中更新后的地址。
2 个回答
在Linux系统中,DNS(域名系统)默认是不会缓存的,这意味着每次都要去查询最新的地址。为了实现这个功能,Linux需要一个叫做sssd
或nscd
的后台程序。你可以简单地重启这个程序来强制更新地址。
对于Windows用户来说,系统默认会缓存DNS信息,你可以通过运行ipconfig /flushdns
来清除这个缓存。
另外,你可能在/etc/hosts
文件中有一个固定的地址,这个文件会优先使用,所以最好先检查一下那里。像dig
或nslookup
这样的工具可以直接向DNS服务器查询,不会经过NSS库的子系统。
Python中的socket.gethostbyname
这个功能会使用操作系统自带的解析器,而且没有清除缓存的接口。这里的缓存可能是操作系统使用的一个缓存DNS服务器,或者是操作系统或标准库的某个组件。这个缓存是DNS系统的一个基本部分,处理它的“正确方法”就是等到记录的TTL(生存时间)值过期后,操作系统会自动把过期的值从缓存中删除。当你更新DNS时,最好提前调整一下旧值的TTL。
你也可以使用Python的DNS实现,比如DNSPython,来代替socket.gethostbyname
。这样你就可以完全控制解析器的缓存(不过不能控制解析器使用的NS缓存)。不过,我猜这样做可能也解决不了你现有代码的问题。