【问题标题】:How Golang caches DNS on Win10?Golang如何在Win10上缓存DNS?
【发布时间】:2018-11-02 16:55:30
【问题描述】:

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

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

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

结果:.dll注入后,并没有立即生效,requests仍然可以正常工作。我在那些'getaddrinfo ...'函数中添加了MessageBox,它们没有被调用。

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

问题:我猜是golang还是Windows操作系统缓存了dns,每隔几分钟刷新一次缓存?是否可以手动刷新缓存?所以我可以让.dll立即生效。

【问题讨论】:

  • Go 不会缓存 dns 结果,但取决于您构建应用程序的方式,操作系统可能会。您可能还必须考虑正在重复使用的活动 http 连接。
  • 确实,正如 Jim 所说,Go 没有自己的 DNS 缓存。不过,Windows 肯定会这样做。

标签: go dns


【解决方案1】:

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

如果您可以挂接到 GetAddrInfoW 调用,您将绕过 Windows 的缓存(您可以检查 Go 是否在 src/net/lookup_windows.go 中的 lookupIP 方法中调用系统调用)但我认为您无法使用DLL,因为 Go 有自己的系统调用实现。

除此之外,您还可以通过运行 ipconfig /flushdns 命令刷新 Windows DNS 缓存。

【讨论】:

  • 我在exe启动后尝试了'ipconfig /flushdns',请求仍然有效,请求失败仍然需要几分钟,似乎没有区别。
  • @aj3423 你确定你迷上了 Go DNS 查找吗? (无论 DNS 缓存如何)您可以尝试一些您确定未缓存的随机域名。
猜你喜欢
  • 2022-01-24
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 1970-01-01
  • 2018-06-04
  • 2011-11-04
  • 2018-05-29
相关资源
最近更新 更多