Go语言net.LookupIP报错连接拒绝,nslookup正常的排查求助
检查Go程序的DNS配置优先级
Go默认读取系统resolv.conf,但如果程序运行环境(如容器、不同用户)的resolv.conf与执行nslookup的环境不一致,会导致解析差异。可以核对程序读取的resolv.conf路径,或通过自定义Resolver强制指定DNS测试:resolver := &net.Resolver{ PreferGo: true, Dial: func(ctx context.Context, network, address string) (net.Conn, error) { // 强制使用IPv4连接公共DNS return net.Dial("udp4", "8.8.8.8:53") }, } ips, err := resolver.LookupIP(context.Background(), "ip", host)另外错误中显示Go尝试连接
[::1]:53(本地IPv6 DNS),而nslookup可能默认用IPv4 DNS,这也可能是差异原因。验证程序运行的权限与网络环境
确认执行nslookup的用户和运行Go程序的用户是否一致,不同用户的DNS配置或网络限制(如SELinux、AppArmor规则)可能不同。如果程序在容器中运行,需进入容器内部执行nslookup,排查容器与宿主机的DNS配置差异。检查本地DNS服务状态
执行ss -ulnp | grep :53查看53端口的监听情况,确认是否有服务监听[::1]:53——错误提示该端口连接被拒绝,说明本地IPv6 DNS服务未启动或未监听IPv6端口。若nslookup用的是IPv4本地DNS(127.0.0.1:53),可修改resolv.conf将nameserver改为127.0.0.1,或确保本地DNS服务同时监听IPv6和IPv4端口。核对Go版本差异
不同Go版本的DNS解析逻辑存在差异,老版本可能存在resolv.conf处理bug或IPv6支持问题。尝试升级Go到稳定版本,或切换到已知正常的版本测试,排查是否为版本导致的问题。测试自定义DNS服务器
在Go程序中直接指定公共DNS服务器(如8.8.8.8、1.1.1.1)进行解析,若能成功则说明本地DNS配置存在问题,可进一步定位本地DNS的故障点。
内容的提问来源于stack exchange,提问作者Amol

