目前我在用的系统是Linux,家里是移动宽带,到2024年头几乎到处都有ip6地址。然后有个问题困扰我,就是移动的ip6宽带出国非常慢。

从路由跟踪来看,在国内都正常延迟,到了国外就丢包50%。很大概率就是移动的出国线路带宽拥挤,而且是不论什么时候。ip4就不会,我猜两个路径应该是不同线路并且有不同的容量,ip6可能出国线路设备并没有去升级。

为了解决该问题,我考虑了如下做法:

  1. ip目标地址是国内的,电脑访问优先用ip6地址
  2. ip目标不是国内的,则优先用ip4地址
  3. 无ip4地址的网站,依然还是用ip6访问

通过编辑 /etc/gai.conf 文件,仅添加如下规则

precedence 240e::/20 110
precedence 2409:8000::/20 110
precedence 2408:8000::/20 110
precedence ::ffff:0:0/96  100

前三行是国内三大运营商的ip6 block,只使用这三个block可以几乎覆盖所有国内的公共ip6地址,优先级110。然后第四行ip4的地址优先级逊于110只有100,当然了 gai.conf 有默认隐含规则是 precedence ::/0 40 ,则代表其他所有ip6的优先级比ip4低。

这样配置之后,所有使用glibc的getaddrinfo的域名请求过程,比如firefox浏览器,都会在访问国内网站的时候如果有ip6地址则优先使用。