Linux 下 curl -6 访问失败问题排查与解决

最近在 Linux 上使用 IPv6 测试命令时遇到一个小问题:

curl -6 ip.sb

结果报错:

curl: (6) Could not resolve host: ip.sb

问题分析

这个报错提示 并不是 IPv6 出口不通,而是 DNS 解析失败。原因主要有以下几种可能:

1.    系统没有配置支持 IPv6 的 DNS,导致解析不到域名的 AAAA 记录。
2.    /etc/resolv.conf 中的 DNS 仅能返回 IPv4 结果。
3.    systemd-resolved 或 NetworkManager 自动覆盖了 DNS 配置。

由于我机器上 确实没有配置 IPv6 DNS,所以无法解析 ip.sb 的 IPv6 地址。

解决方法

1. 临时修改 /etc/resolv.conf

直接在文件中添加公共 IPv6 DNS:

sudo nano /etc/resolv.conf

添加如下内容:

nameserver 2001:4860:4860::8888
nameserver 2001:4860:4860::8844
nameserver 2606:4700:4700::1111
nameserver 2606:4700:4700::1001

保存后再次执行:

curl -6 ip.sb

即可正常返回当前的 IPv6 地址。

⚠️ 注意:有些系统中 /etc/resolv.conf 会被 NetworkManager 或 systemd-resolved 覆盖,重启后配置可能失效。


2. 使用 systemd-resolved 持久化配置

编辑配置文件:

sudo nano /etc/systemd/resolved.conf

在 [Resolve] 段落添加:

DNS=2001:4860:4860::8888 2001:4860:4860::8844
FallbackDNS=2606:4700:4700::1111 2606:4700:4700::1001

重启服务:

sudo systemctl restart systemd-resolved


3. 使用 NetworkManager 配置 IPv6 DNS

如果网络由 NetworkManager 管理,可以通过 nmcli 设置:

nmcli con mod "你的连接名称" ipv6.dns "2001:4860:4860::8888 2001:4860:4860::8844"
nmcli con mod "你的连接名称" ipv6.ignore-auto-dns yes
nmcli con up "你的连接名称"


验证

测试能否解析 AAAA 记录:

dig AAAA ip.sb

若能看到 2606:4700:... 这样的 IPv6 地址,则解析成功。
随后执行:

curl -6 ip.sb

即可返回本机的公网 IPv6 地址。


常见公共 DNS(IPv4 & IPv6)

🌍 Google Public DNS

•    IPv4
•    8.8.8.8
•    8.8.4.4
•    IPv6
•    2001:4860:4860::8888
•    2001:4860:4860::8844

☁️ Cloudflare DNS

•    IPv4
•    1.1.1.1
•    1.0.0.1
•    IPv6
•    2606:4700:4700::1111
•    2606:4700:4700::1001

🔒 Quad9 DNS(安全/隐私)

•    IPv4
•    9.9.9.9
•    149.112.112.112
•    IPv6
•    2620:fe::fe
•    2620:fe::9

🇨🇳 国内常用 DNS

•    阿里 DNS
•    IPv4: 223.5.5.5, 223.6.6.6
•    IPv6: 2400:3200::1, 2400:3200:baba::1
•    百度 DNS
•    IPv4: 180.76.76.76
•    IPv6: (暂无官方 IPv6 地址)
•    114 DNS
•    IPv4: 114.114.114.114, 114.114.115.115
•    IPv6: 240C::6666, 240C::6644