跳转到主要内容

在IPv6+IPv4双栈下优先使用IPv4

最近服务器引入了 IPV6IPv6 ,但是就出现了一个问题:

如果访问的域名同时拥有 A 和 AAAA 解析,那么系统会优先使用 AAAA 解析,也就是 IPV6IPv6 地址,同时网络出口的优先级都会比 IPV4高。

而且还有更牛的,IPV6+IPV4IPv6+IPv4 双栈下,DNS查询会同时发送 AAAA 和 A 解析,无论访问域名有没有 AAAA 解析都会浪费一定时间去查询。

但是现在 IPV6IPv6 网络还不理想

举一个栗子

wget https://papermc.io/api/v1/paper/1.15.2/385/download
--2020-08-14 00:21:05--  https://papermc.io/api/v1/paper/1.15.2/385/download
正在解析主机 papermc.io (papermc.io)... 2606:4700:20::ac43:4580, 2606:4700:20::681a:202, 2606:4700:20::681a:302, ...
正在连接 papermc.io (papermc.io)|2606:4700:20::ac43:4580|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:44783881 (43M) [application/java-archive]
正在保存至: “download”

 2% [=>                                                                             ] 1,317,487   9.59KB/s 剩余 35m 23s
wget https://papermc.io/api/v1/paper/1.15.2/385/download
--2020-08-14 00:26:40--  https://papermc.io/api/v1/paper/1.15.2/385/download
正在解析主机 papermc.io (papermc.io)... 172.67.69.128, 104.26.3.2, 104.26.2.2, ...
正在连接 papermc.io (papermc.io)|172.67.69.128|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:44783881 (43M) [application/java-archive]
正在保存至: “download”

 1% [                                                                               ] 466,050      105KB/s 剩余 6m 51s

 

结果很 amazing 啊 ,这 IPV4IPv4 不知道快到那里去了。

 

好,说正事

优先 IPV4 非常简单

只要在 /etc/gai.conf 文件里面添加一行(这个文件默认不存在,手动生成吧)

precedence  ::ffff:0:0/96  100

保存就立即生效了

 

那么这行代码意味着什么呢

/etc/gai.conf 是干嘛的?   
系统调用 getaddrinfo(3) 时可能返回会多个答案。根据 RFC 3484 ,系统必须对这些答案进行排序,来让成功率最高的地址优先级最高。RFC 还要求系统管理员可以动态修改优先级,这就是修改优先级的文件。
人话:系统获取 IP 地址的时候可能会获取到多个地址,这个文件运行你修改使用优先级。

 

/etc/gai.conf 这个文件默认里面写了 (我知道你的是刚创建的,里面什么都没写也等于写了下面的内容)

label  ::1/128       0
label  ::/0          1
label  2002::/16     2
label ::/96          3
label ::ffff:0:0/96  4
precedence  ::1/128       50
precedence  ::/0          40
precedence  2002::/16     30
precedence ::/96          20
precedence ::ffff:0:0/96  10

这些是什么地址?看下表:

IPv6 默认地址选择

前缀 优先级 标签 用途/描述
::1/128 50 0 本地主机
::/0 40 1 Default unicast默认单播
::ffff:0:0/96 35 4 IPv4-mappedIPv4映射的IPv6地址(用 IPv6 address代表的 IPv4 地址)
2002::/16 30 2 用于 6to4 隧道的地址 (现已废弃)
2001::/32 5 5 Teredo tunneling隧道地址
fc00::/7 3 13 Unique local address唯一的本地地址
::/96 1 3 IPv4-compatible兼容 addressesIPv4 (deprecated)的地址(已废弃)
fec0::/10 1 11 Site-local address (deprecated)站点本地地址(已废弃)
3ffe::/16 1 12 6bone 6bone网络(returned)

因此 precedence ::ffff:0:0/96 100 意味着把所有 IPv4 地址的优先级调为 100

 

别说我优先级 100 是乱改熬,这是 RFC384 说的 https://www.ietf.org/rfc/rfc3484.txt

10.3. Configuring Preference for IPv6 or IPv4
The default policy table gives IPv6 addresses higher precedence than IPv4 addresses. This means that applications will use IPv6 in preference to IPv4 when the two are equally suitable. An administrator can change the policy table to prefer IPv4 addresses by giving the ::ffff:0.0.0.0/96 prefix a higher precedence: