【问题标题】:Specifying DNS server for lookup in Go在 Go 中指定用于查找的 DNS 服务器
【发布时间】:2020-01-24 03:01:05
【问题描述】:

有没有办法指定使用哪个 DNS 服务器进行名称查找?

查看https://golang.org/pkg/net/#LookupHost 似乎它只会使用本地解析器

LookupHost looks up the given host using the local resolver. It returns a slice 
of that host's addresses.

也早在那个链接上

 It can use a pure Go resolver that sends DNS requests directly to 
 the servers listed in /etc/resolv.conf,

如何像使用 dig 一样查找任意服务器?

dig @8.8.8.8 google.com

【问题讨论】:

    标签: go dns


    【解决方案1】:

    /u/g-a-c 回复 reddit

    如果我正确阅读了该文档(也许不是)...

    使用您要使用的 DNS 地址 (https://golang.org/pkg/net/#Resolver) 创建自己的本地解析器,使用自定义拨号器,然后使用该解析器的 LookupAddr 功能?

    编辑:

    package main
    
    import (
        "context"
        "net"
        "time"
    )
    
    func main() {
        r := &net.Resolver{
            PreferGo: true,
            Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
                d := net.Dialer{
                    Timeout: time.Millisecond * time.Duration(10000),
                }
                return d.DialContext(ctx, network, "8.8.8.8:53")
            },
        }
        ip, _ := r.LookupHost(context.Background(), "www.google.com")
    
        print(ip[0])
    }
    

    这似乎有效 - 在我的防火墙上,这表明我的机器正在打开与 Google 的连接,而不是本地域控制器

    【讨论】:

    • 需要注意的是 DNS 使用 UDP AND TCP。对于答案不适合 UDP 数据包的查询,上述内容可能无法为您提供答案。
    • 这是一个很好的例子。我削弱了它,因此对 TCP 的调用将使用传递的“网络”标志调用 DialContext。尽管如此,即使我导致基于 UDP 的回调返回错误,pureGo-resolver 也从未使用 TCP 网络调用“拨号”。这是疯狂的部分!您仍然可以将“tcp”、“tcp4”、“tcp6”传递给 DialContext,解析器将使用 TCP 传输而不是 UDP 传输。通过 Wireshark 确认。
    • 不幸的是,上面的代码返回了我的外部 POP 的私有 IP,就好像它仍在查询内部 DNS(转到 1.16)
    • @nc。答案是在我发表评论后编辑的。它最初有return d.DialContext(ctx, "udp", "8.8.8.8:53"),它有我的评论中描述的问题。完成的编辑说即使使用network 也可能存在问题(没有回退到 TCP)。因此,在所有情况下,无论您做什么,作为 DNS 客户端,您都需要同时尝试 UDP 和 TCP,并对此保持聪明。 UDP 回复可能不会出现或在 DNS 数据包应答中带有截断标志,在这种情况下,您需要使用 TCP 重试。您还可以使用 UDP 的 bufsize EDNS0 选项来提供帮助。
    • @nc。在哪里学什么?关于 DNS 的东西,核心文档是 RFC 1034 和 1035,但它们陈旧、简洁、有错误、被其他文档多次更新等,非常复杂。 powerdns.org/hello-dns 的页面可能是对技术点的更好介绍。否则这里的问题(如果与编程有关),Webmasters 用于与网络相关的 DNS,或 serverfault.com 用于在业务设置中管理/使用 DNS 服务器是学习的方法。
    【解决方案2】:

    我正在使用这种方法来允许自定义 DNS 服务器查询。

    但是,我注意到在使用客户解析器时执行 DNS 查找要慢得多。

    当我使用默认的网络解析器时,9 条 DNS 记录的查询时间为 200 毫秒,但当使用 f.x 8.8.8.8 时,9 条 DNS 记录的查询时间为 1600 毫秒。

    这也是线性扩展的,所以查询的 DNS 记录越多,毫秒间的差距就越大

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 2017-06-29
    • 2015-07-11
    相关资源
    最近更新 更多