如何从DNS查询结果与getaddrinfo返回值中排除不可用IP地址?
解决方法分两类,可根据需求选择:
1. 临时过滤getaddrinfo返回结果
getaddrinfo默认只返回IP信息,不会附带IP对应的域名映射,要过滤ns相关IP需要额外做反向解析:
- 遍历getaddrinfo返回的全部addrinfo结构体链表,逐个提取IP地址
- 对每个IP调用
getnameinfo做PTR反向查询,获取IP绑定的域名 - 丢弃所有域名匹配
ns*.baidu.com规则的IP,剩下的就是可正常访问的百度服务IP
该方案仅适合临时应急,会额外增加解析耗时,且如果IP没有配置PTR反向记录会失效。
2. 根因修复(优先推荐)
正常DNS服务器查询baidu.com的A记录时,只会返回baidu.com自身绑定的Web服务IP,不会混入NS域名服务器的IP,你遇到的返回结果异常本身是WSL2默认DNS服务的bug,修复后无需额外做过滤:
- 先关闭WSL2自动生成resolv.conf的逻辑:在
/etc/wsl.conf中添加如下配置:
[network] generateResolvConf = false
- 手动修改
/etc/resolv.conf,将原有nameserver替换为公共DNS,比如nameserver 8.8.8.8,也可以用国内公共DNS如114.114.114.114、223.5.5.5 - 执行
wsl --shutdown关闭WSL后重新启动,配置就会生效,之后dig、getaddrinfo查询baidu.com都会返回正确的IP列表。
内容的提问来源于stack exchange,提问作者xmllmx
相关产品推荐
相关产品推荐

