最新消息:

IPv6的那些事

技术相关 chuanliang 13浏览 0评论

背景:

1、生产服务器采用了dnspod-sr作为内网DNS服务器,以方便应用的部署。

2、所有服务器都采用CentOS,IP采用IPv4,未禁用IPv6,但操作系统路由、路由器及防火墙皆未启用IPv6地址。

虽然以前也遇到过因为IPv6导致类似curl、wget之类的系统命令执行太慢的问题,但一直未对IPv6引起足够的重视。

最近接连出现了一堆与IPv6相关的问题。

1、先是APP上APP Store审核,被苹果因为IPv6的问题接连打回来几次。最终直接把服务器的IPv6禁用了事。

2、有一台Redis服务器作为缓存服务器,其他Spring Boot应用通过内部DNS连接Redia。比较诡异的是,每一次重启Spring Boot应用,初始化Redis连接池时候,至少需要15秒。

最终查明了是DNS解析惹的祸,直接采用IP连接就不存在问题。原因是应用通过内部域名连接Redis时,做域名解析时候,发送了两条AAAA(IPv6)、A(IPv4)域名解析请求,其中AAAA > A记录请求 。

而且CentOS下即便禁用了IPv6,采用TCPDUMP抓包发现似乎仍然也会发送AAAA域名解析请求,导致先AAAA请求超时后,再处理IPv4。

网上大部分资料都建议直接禁用掉IPv6,只不IPv6是趋势,IPv6 Ready还是有必要的,尤其是外部一些IPv6环境的访问服务器时候,服务器端获取IPv6相关信息还是挺有价值的。

有没有在不禁用IPv6的情况下,让操作系统优先使用IPv4而非IPv6呢?

按照RFC3484 的说法,在IPv6、IPv4共存的环境下,解析顺序为
1. IPv6
2. IPv4
3. 6to4-Traffic

如果能够采用 Prefer IPv4 over IPv6,则可以实现IPv4 和IPv6并存。

办法一:修改/etc/gai.conf

/etc/gai.conf是socket getaddrinfo(3)函数的配置文件,因此修改此配置文件,可以影响各种socket程序对IPv4、IPv6地址的处理顺序。

配置样例:

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  100

配置文件说明可以参考Linux MAN

http://man7.org/linux/man-pages/man5/gai.conf.5.html

http://man7.org/linux/man-pages/man3/getaddrinfo.3.html

方案2、在Java应用中,指定-Djava.net.preferIPv4Stack=true

可以参考官方文档 Networking Properties

转载请注明:出家如初,成佛有余 » IPv6的那些事

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址