那个啥,不喜欢看一些背景 分析啥的 直接看红字修改就好了。 其余的都是冗余部分,都是码出来的,其余的地方好像搜不到。经验之谈。避免你们采坑。 html
在国家网信办推行IPv6的大前提下,进行IPv6改造工做,有在服务器上配置IPv4 和 IPv6双栈的需求。可是调研发现配置IPv6后会出现如下几个隐患:
linux
双栈网络下 IPv6优先级更高:域名解析的AAAA记录优先级 以及网络出口的优先级bash
首先说域名解析AAAA优先致使的问题:服务器
因为双栈状况下AAAA记录优先,域名解析会向localdns发起 AAAA 和A记录查询,刚才说到有AAAA记录优先网络
这就埋下了隐患,也就是说域名解析的过程会等待AAAA记录的返回(不管是否有解析记录),若是无AAAA解析记录会影响什么?架构
理论上有A记录 也就是IPv4兜底,确定有解析,可是 dns的解析过程当中,若是localdns无结果,会向上级域递归,直至根域查询无果。app
这个过程会浪费掉必定的时间。这个时间也会算到dns解析过程当中,故在双栈的状况下 一些域名的解析可能会缓慢,进而影响到服务。curl
而后是 网络出口IPv6优先致使的问题:ide
网络架构的变动,通常的服务器都不配置公网IP,都是经过nat/snat出公网的,在进行改造后 直接经过IPv6出公网,不通过nat。对网络架构是一种改造。测试
可能致使的问题:被调用端获取到的IP已经变化,相关IP段的受权须要修改。
另外,经过IPv6访问,可能出现质量不稳定:大网环境不稳定 IPv6正常测试推动过程当中,总体网络环境 不如如今的稳定。还有 被调用方支持较弱,也就是覆盖节点不全面 或者是灰度部分不重要的地域,服务质量没办法保证。
综上,在当前状况下 服务器上及时开启双栈支持IPv6也是面临必定的问题。环境下又必须推动这件事情,那就使用折中方案。配置双栈 可是 IPv4优先。
配置很简单:
修改 /etc/gai.conf precedence ::ffff:0:0/96 100
关于为啥修改这个能生效 往下看,其余的blog好像没有解释的,撸了不少协议发现大概是这样的,欢迎补充。
gai.conf说明 http://www.man7.org/linux/man-pages/man5/gai.conf.5.html
gai.conf - getaddrinfo(3) configuration file 系统调用getaddrinfo(3) 可能获得多个地址,系统根据RFC3484选取最优地址。
RFC容许管理员修改/etc/gai.conf 实现动态更改地址排序规则。
RFC3484协议 https://tools.ietf.org/rfc/rfc3484.txt
RFC 网络协议的圣经
10.3. Configuring Preference for IPv6 or IPv4
默认状况下IPv6优先级高于IPv4,应用程序优先使用IPv6地址。能够经过赋予 ::ffff:0:0/96 更高的优先级实现IPv4优先级高于IPv6。
注: ::ffff:0:0/96 IPv4/IPv6转换地址 (IPv4-mapped IPv6 address)
/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
precedence 的IP段说明:
Prefix Precedence Label
::1/128 50 0
::/0 40 1
2002::/16 30 2
::/96 20 3
::ffff:0:0/96 10 4
0:0:0:0:0:0:0:1/128 50 0 单播地址 环回地址 等同于IPV4的127.0.0.1
0:0:0:0:0:0:0:0/0 40 1 缺省路由 等同于IPV4 0.0.0.0
2002:0:0:0:0:0:0:0/16 30 2 可聚合全球地址
0:0:0:0:0:0:0:0/96 20 3 ipv4兼容地址
0:0:0:0:0:ffff:0:0/96 10 4 IPv4映射地址(这个地址网络上信息较少,地址范围::: ffff:0.0.0.0~:: ffff:255.255.255.255 地址数量2 128−96 = 2 32 = 4 294 967 296,用于软件,目的是IPv4映射的地址。 )
来源于维基百科,国内的那货死活搜不出来。
Prefix | Precedence | Label | Usage |
---|---|---|---|
::1/128 | 50 | 0 | Localhost |
::/0 | 40 | 1 | Default unicast |
::ffff:0:0/96 | 35 | 4 | IPv4-mapped IPv6 address |
2002::/16 | 30 | 2 | 6to4 |
2001::/32 | 5 | 5 | Teredo tunneling |
fc00::/7 | 3 | 13 | Unique local address |
::/96 | 1 | 3 | IPv4-compatible addresses (deprecated) |
fec0::/10 | 1 | 11 | Site-local address (deprecated) |
3ffe::/16 | 1 | 12 | 6bone (returned) |
选取服务器进行测试,并配置IPv6地址:
并设置/etc/gai.conf:precedence ::ffff:0:0/96 100
服务器具有双栈
服务器的双栈可以出公网
默认配置下 系统有优先使用ipv6(这里使用wget测试,curl dig ping等其余的测试都有IP版本之分,只要指定版本就不算系统优选了):
修改优先级:
屡次测试 可以稳定路由。
在修改优先级 ::ffff:0:0/96 >= 40 时 服务器优先使用IPv4地址。可按照文档设定为100。
测试的链接:
wget -SO /dev/null weixin.qq.com
wget -SO /dev/null https://k.sinaimg.cn/n/default/1_img/upload/3933d981/300/w1620h1080/20200105/f33b-imrkkfy0727359.jpg/w640slw.jpg
结论:
测试结果显示 修改该优先级可以达到服务器在双栈的状况下,优先使用IPv4。
该配置 可能会致使后续 使用IPv6失败的状况,须要在之后的改造过程当中注意。
修改/etc/gai.conf ipv4的优先级的方式 是否正确 是否会引发其余的问题。 协议里面的内容比较多,包括不少目的地址选址方面的问题。须要关注下。
另外,根据RFC协议中的内容,我这进行了测试,若是有AAAA记录 可是IPv6地址不通,仍使用IPv4地址,与存活探路有关。不过程序处理须要消耗时间,得不偿失。建议直接规避吧。