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#L19 和 https://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
更多关于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解析器,它会读取所有域名服务器。

