Golang内置DNS解析器仅从/etc/resolv.conf接受一个域名服务器

Golang内置DNS解析器仅从/etc/resolv.conf接受一个域名服务器 我想知道 Go 内置的 DNS 解析器只接受 /etc/resolv.conf 文件中的一个域名服务器是否是故意的。

查看这两行代码 https://github.com/golang/go/blob/go1.16/src/net/dnsconfig_unix.go#L19https://github.com/golang/go/blob/go1.16/src/net/dnsconfig_unix.go#L73 意味着最多只会有一个域名服务器被添加到列表中,因为域名服务器列表已经预先填充了 2 个本地地址,所以只留出了一个空位。

我看到第 72 行的注释:

case "nameserver": // add one name server

但它的含义似乎有点模糊,是“通常添加一个域名服务器”还是“在这种情况下添加一个域名服务器”。


更多关于Golang内置DNS解析器仅从/etc/resolv.conf接受一个域名服务器的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang内置DNS解析器仅从/etc/resolv.conf接受一个域名服务器的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Go的DNS解析器从/etc/resolv.conf只读取一个域名服务器是设计行为。在dnsconfig_unix.go中,conf.nameservers切片初始容量为3,并预先填充了两个本地地址(127.0.0.1:53和[::1]:53),因此仅保留一个空位用于外部域名服务器。

关键代码段:

// 第19行:初始化nameservers,容量为3
conf.nameservers = make([]string, 0, 3)

// 第73行:处理nameserver行
case "nameserver":
    if len(conf.nameservers) < 3 {
        // 只添加一个域名服务器到预留位置
        conf.nameservers = append(conf.nameservers, ns)
    }

示例:假设/etc/resolv.conf包含:

nameserver 8.8.8.8
nameserver 8.8.4.4

Go仅会使用第一个(8.8.8.8),忽略后续的。这是为了优先使用本地DNS缓存(如systemd-resolved或dnsmasq),避免绕过本地解析服务。如果需要多个上游服务器,可通过环境变量GODEBUG=netdns=go使用纯Go解析器,它会读取所有域名服务器。

回到顶部