手欠删除了之前的博文,重新提交下:
那个啥,不喜欢看一些背景 分析啥的 直接看红字修改就行了。 其他的都是冗余部分,都是码出来的,其他的地方好像搜不到。经验之谈。避免大家采坑。
在国家网信办推行IPv6的大前提下,进行IPv6改造工作,有在服务器上配置IPv4 和 IPv6双栈的需求。但是调研发现配置IPv6后会出现以下几个隐患:
双栈网络下 IPv6优先级更高:
域名解析的AAAA记录优先级 以及网络出口的优先级
首先说域名解析AAAA优先导致的问题:
由于双栈情况下AAAA记录优先,域名解析会向localdns发起 AAAA 和A记录查询,刚才说到有AAAA记录优先 这就埋下了隐患,也就是说域名解析的过程会等待AAAA记录的返回(无论是否有解析记录),如果无AAAA解析记录会影响什么?
理论上有A记录 也就是IPv4兜底,肯定有解析,但是 dns的解析过程中,如果localdns无结果,会向上级域递归,直至根域查询无果。
这个过程会浪费掉一定的时间。这个时间也会算到dns解析过程中,故在双栈的情况下 一些域名的解析可能会缓慢,进而影响到服务。
然后是 网络出口IPv6优先导致的问题:
网络架构的变更,一般的服务器都不配置公网IP,都是通过nat/snat出公网的,在进行改造后 直接通过IPv6出公网,不经过nat。对网络架构是一种改造。
可能导致的问题:被调用端获取到的IP已经变化,相关IP段的授权需要修改。
另外,通过IPv6访问,可能出现质量不稳定:大网环境不稳定 IPv6正常测试推进过程中,整体网络环境 不如现在的稳定。还有 被调用方支持较弱,也就是覆盖节点不全面 或者是灰度部分不重要的地域,服务质量没办法保证。
综上,在当前情况下 服务器上及时开启双栈支持IPv6也是面临一定的问题。环境下又必须推进这件事情,那就使用折中方案。配置双栈 但是 IPv4优先。
配置很简单:
修改
/etc/gai.conf
precedence ::ffff:0:0/96 100
关于为啥修改这个能生效 往下看,其他的blog好像没有解释的,撸了很多协议发现大概是这样的,欢迎补充。
1 调研gai.conf的理论依据:
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