Golang如何在Win10上缓存DNS?

时间:2018-11-02 16:55:31

标签: go dns

我正在尝试为golang可执行文件编写一个http(s)代理,这就是我所做的:

  1. 编写一个.dll,该钩子会钩住'getaddrinfo','GetAddrInfoW','gethostbyname',并将所有域重定向到localhost
  2. 将.dll注入golang_target.exe(现在所有请求都重定向到localhost)

预期: 我希望所有请求都重定向到localhost:80(443),这些请求将失败。

结果 :. dll注入后不会立即生效,请求仍然可以正常工作。我已经在那些“ getaddrinfo ...”函数中添加了MessageBox,它们没有被调用。

但是大约三分钟后,.dll似乎可以正常工作,所有请求均失败,并弹出MessageBox。

问题:我猜golang或Windows操作系统会缓存dns,并每隔几分钟刷新一次缓存吗?可以手动刷新缓存吗?因此,我可以使.dll立即生效。

1 个答案:

答案 0 :(得分:0)

No Go(大多数语言标准库)不缓存DNS响应,而仅依赖于操作系统。 IIRC Windows和macOS默认情况下将缓存DNS,但Linux发行版通常不缓存。

如果您可以挂接到GetAddrInfoW调用中,则可以绕过Windows的缓存(可以检查Go正在lookupIP的{​​{1}}方法中调用syscall),但我没有认为您可以使用DLL,因为Go拥有自己的syscall实现。

除此之外,您还可以通过运行src/net/lookup_windows.go命令来刷新Windows DNS缓存。