Ubuntu系统下如何增加getaddrinfo返回的IP地址数量?
解决getaddrinfo返回IP数量有限的问题(Ubuntu环境)
先确认DNS服务器的返回能力
直接用dig命令测试目标域名的DNS返回数量,比如:dig your-domain.com A +short | wc -l dig your-domain.com AAAA +short | wc -l如果DNS服务器本身只返回8个IP,那getaddrinfo也拿不到更多——这时候换个更全的DNS服务器,比如Cloudflare的1.1.1.1或者Google的8.8.8.8,修改Ubuntu的DNS配置即可(比如在
/etc/systemd/resolved.conf里设置DNS=1.1.1.1 8.8.8.8,然后重启systemd-resolved服务)。启用DNS TCP查询突破UDP大小限制
UDP协议的DNS响应默认有大小限制(传统是512字节,即使EDNS0扩展后也可能被服务器限制),如果目标域名的IP数量多,UDP响应会被截断,导致getaddrinfo只能拿到部分IP。
在Ubuntu的DNS配置里启用TCP查询:- 如果用
systemd-resolved,编辑/etc/systemd/resolved.conf,添加或修改:
或者直接在DNSOverTLS=opportunistic/etc/resolv.conf里添加(注意如果resolv.conf是symlink到systemd-resolved的,需要先取消链接再修改):options use-vc - 重启DNS服务:
sudo systemctl restart systemd-resolved
- 如果用
清理DNS缓存解决重复返回问题
多次调用getaddrinfo返回相同地址,是因为系统DNS缓存(比如systemd-resolved或nscd)保存了之前的查询结果。要刷新缓存:- 用systemd-resolved的话:
sudo systemctl restart systemd-resolved - 用nscd的话:
sudo nscd -i hosts
- 用systemd-resolved的话:
绕过getaddrinfo手动解析DNS
如果上面的方法都无法获取更多IP,可以直接用DNS解析库(比如libdns、libldns)自己实现查询逻辑,直接解析DNS响应包,这样能拿到域名对应的所有IP地址,不受getaddrinfo的默认限制。
内容的提问来源于stack exchange,提问作者rare77
相关产品推荐
相关产品推荐

