遇到了网络优先级问题
按照搜索的教程将 gai.conf 里的那行#删除保存后
使用curl ip.sb后 显示结果还是v6
然后搜索了下其他人说的,有人说13默认v6优先改不了,还有人说要去内核里改
有没有懂的大佬帮忙解惑一下
遇到了网络优先级问题
按照搜索的教程将 gai.conf 里的那行#删除保存后
使用curl ip.sb后 显示结果还是v6
然后搜索了下其他人说的,有人说13默认v6优先改不了,还有人说要去内核里改
有没有懂的大佬帮忙解惑一下
我去隔壁发一贴吧 这边看的人少
对 IPv6 不是很熟。但应用具体会优先用哪个 IP 栈,这个事是由应用 / 库自身决定的吧。gai.conf 这里的配置只能影响不在乎这个事的应用 / 库。curl 是按 happy eyeballs 算法来选的,总是优先 v6:Happy Eyeballs - everything curl 如果你要强制让 curl 走 v4 可以加 -4 参数
再就是如果应用不走 getaddrinfo 的解析 / 有自己的配置,那么 gai.conf 这里的配置也影响不到应用的行为。
gai.conf 的配置可以用命令 getent ahosts example.com 来验证
我把系统DD的debian13,用的科技lion的脚本改的,刚才看了下没问题,你可以试试,在系统工具里面
/etc/resolv.conf 文件 加行 options no-aaaa 就行
稍微补充一点点? 最近有在折腾这个. (因为套了he-ipv6隧道, 不想被v6优先太影响速度)
问了一下claude说
Happy Eyeballs RFC 8305 says: try IPv6 first, wait ~250ms, then start IPv4 in parallel — whichever connects first wins. It doesn't measure throughput or latency beyond the initial TCP handshake. Since your HE tunnel still connects within 250ms, IPv6 "wins" even though it's 60-70x slower in practice.
zh-cn:
《Happy Eyeballs RFC 8305》规定:优先尝试IPv6,等待约250毫秒后并行启动IPv4——先成功建立连接的协议获胜。该标准不评估TCP握手后的吞吐量或延迟。由于您的HE隧道仍能在250毫秒内完成连接,因此IPv6获胜,尽管实际性能比IPv4慢60-70倍。
实测新版curl的Happy Eyeballs算法确实会在默认值250ms-时优先使用IPv6?
root@localhost:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: ens17: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 xdp/id:128 qdisc mq state UP group default qlen 1000
link/ether 8a:30:59:00:0d:3a brd ff:ff:ff:ff:ff:ff
altname enp0s17
altname enx8a3059000d3a
inet 1.1.1.1/24 brd 1.1.1.255 scope global ens17
valid_lft forever preferred_lft forever
inet6 fe80::8830:59ff:fe00:d3a/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
3: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
link/sit 0.0.0.0 brd 0.0.0.0
4: he-ipv6@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN group default qlen 1000
link/sit 1.1.1.1 peer 216.218.221.6
inet6 2001:470::/48 scope global
valid_lft forever preferred_lft forever
inet6 fe80::74cc:111/64 scope link
valid_lft forever preferred_lft forever
root@localhost:~# curl ip.sb
2001:470::
root@localhost:~# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=117 time=1.73 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=117 time=1.74 ms
^C
--- 8.8.8.8 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 1.731/1.735/1.740/0.004 ms
root@localhost:~# ping 2001:4860:4860::8888
PING 2001:4860:4860::8888 (2001:4860:4860::8888) 56 data bytes
64 bytes from 2001:4860:4860::8888: icmp_seq=1 ttl=119 time=135 ms
64 bytes from 2001:4860:4860::8888: icmp_seq=2 ttl=119 time=135 ms
^C
--- 2001:4860:4860::8888 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 134.830/134.854/134.878/0.024 ms
root@localhost:~# curl -V
curl 8.14.1 (x86_64-pc-linux-gnu) libcurl/8.14.1 OpenSSL/3.5.4 zlib/1.3.1 brotli/1.1.0 zstd/1.5.7 libidn2/2.3.8 libpsl/0.21.2 libssh2/1.11.1 nghttp2/1.64.0 nghttp3/1.8.0 librtmp/2.3 OpenLDAP/2.6.10
Release-Date: 2025-06-04, security patched: 8.14.1-2+deb13u2
Protocols: dict file ftp ftps gopher gophers http https imap imaps ipfs ipns ldap ldaps mqtt pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp ws wss
Features: alt-svc AsynchDNS brotli GSS-API HSTS HTTP2 HTTP3 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM PSL SPNEGO SSL threadsafe TLS-SRP UnixSockets zstd
root@localhost:~# curl --happy-eyeballs-timeout-ms 0 ip.sb
1.1.1.1
root@localhost:~# curl --happy-eyeballs-timeout-ms 300 ip.sb
2001:470::
手动调整了一下默认值走回更快的原生IPv4了
要测试/etc/gai.conf有没有生效可以用ping或者wget等等还没有遵从Happy Eyeballs算法且默认值以下IPv6优先的工具(我调高 he-ipv6隧道的路由 Metric 值, 不过好像没这个有用就忽略叭)
root@localhost:~# cat /etc/gai.conf | head -c 67
precedence ::ffff:0:0/96 100
# Configuration for getaddrinfo(3).
root@localhost:~#
root@localhost:~# wget -qO- ip.sb
Prepended http:// to 'ip.sb'
116.204.135.152
root@localhost:~# nano /etc/gai.conf
root@localhost:~# cat /etc/gai.conf | head -c 68
#precedence ::ffff:0:0/96 100
# Configuration for getaddrinfo(3).
root@localhost:~#
root@localhost:~# wget -qO- ip.sb
Prepended http:// to 'ip.sb'
2001:470::
root@localhost:~# cat /etc/gai.conf | head -c 67
precedence ::ffff:0:0/96 100
# Configuration for getaddrinfo(3).
root@localhost:~#
root@localhost:~# ping -c 2 ip.sb
PING ip.sb (172.67.75.172) 56(84) bytes of data.
64 bytes from 172.67.75.172: icmp_seq=1 ttl=57 time=1.28 ms
64 bytes from 172.67.75.172: icmp_seq=2 ttl=57 time=1.23 ms
--- ip.sb ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 1.228/1.255/1.282/0.027 ms
root@localhost:~# nano /etc/gai.conf
root@localhost:~# cat /etc/gai.conf | head -c 68
#precedence ::ffff:0:0/96 100
# Configuration for getaddrinfo(3).
root@localhost:~#
root@localhost:~# ping -c 2 ip.sb
PING ip.sb (2606:4700:20::681a:c1f) 56 data bytes
64 bytes from 2606:4700:20::681a:c1f: icmp_seq=1 ttl=59 time=143 ms
64 bytes from 2606:4700:20::681a:c1f: icmp_seq=2 ttl=59 time=141 ms
--- ip.sb ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 140.645/141.593/142.541/0.948 ms
root@localhost:~#
root@localhost:~# cat /etc/gai.conf | head -c 67
precedence ::ffff:0:0/96 100
# Configuration for getaddrinfo(3).
root@localhost:~#
root@localhost:~# getent ahosts ip.sb
172.67.75.172 STREAM ip.sb
172.67.75.172 DGRAM
172.67.75.172 RAW
104.26.12.31 STREAM
104.26.12.31 DGRAM
104.26.12.31 RAW
104.26.13.31 STREAM
104.26.13.31 DGRAM
104.26.13.31 RAW
2606:4700:20::ac43:4bac STREAM
2606:4700:20::ac43:4bac DGRAM
2606:4700:20::ac43:4bac RAW
2606:4700:20::681a:c1f STREAM
2606:4700:20::681a:c1f DGRAM
2606:4700:20::681a:c1f RAW
2606:4700:20::681a:d1f STREAM
2606:4700:20::681a:d1f DGRAM
2606:4700:20::681a:d1f RAW
root@localhost:~# nano /etc/gai.conf
root@localhost:~# cat /etc/gai.conf | head -c 68
#precedence ::ffff:0:0/96 100
# Configuration for getaddrinfo(3).
root@localhost:~#
root@localhost:~# getent ahosts ip.sb
2606:4700:20::ac43:4bac STREAM
2606:4700:20::ac43:4bac DGRAM
2606:4700:20::ac43:4bac RAW
2606:4700:20::681a:c1f STREAM
2606:4700:20::681a:c1f DGRAM
2606:4700:20::681a:c1f RAW
2606:4700:20::681a:d1f STREAM
2606:4700:20::681a:d1f DGRAM
2606:4700:20::681a:d1f RAW
172.67.75.172 STREAM ip.sb
172.67.75.172 DGRAM
172.67.75.172 RAW
104.26.12.31 STREAM
104.26.12.31 DGRAM
104.26.12.31 RAW
104.26.13.31 STREAM
104.26.13.31 DGRAM
104.26.13.31 RAW
搞点暴力的(如果不支持.curlrc的话), 劫持一下curl(PS:执行需要which,bash,chattr,支持-e的echo)
bash -c 'export file_path="$(which curl)";mv -i "${file_path}" "${file_path}.real";echo -e "#!/bin/env bash\n#Do not reserve default 250ms perfer time for IPv6\nexec \"${file_path}.real\" --happy-eyeballs-timeout-ms 0 \"\$@\"" > "${file_path}";chmod +x "${file_path}" "${file_path}.real";chattr +i "${file_path}" "${file_path}.real";'
可能有用的第三方参考内容:(算了, 杀掉了. 感觉有点给第三方引流不符合论坛观念, 真要的话再dd我)
偷懒关闭IPv6我觉得很不负责… 用IPv6不就是为了尽可能点对点连接, 人人都不用IPv6那ta造了干嘛… 你不用(服务商不提供IPv6)我不用(我关闭IPv6),IPv6永远发展不了(虽然happy eyeballs这种强制ipv6优先而不是并发连接然后留质量好的,以推广ipv6也是挺坏的…)
没啥可补充的。就,看我链接到的那个文档就行。