06
11月

IPv6的那些事

背景:

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

没有评论

第一个在本文留言。

发表评论

名字(必须)
邮箱(不会被公布)(必须)
网址

字体为 粗体 是必填项目,邮箱地址 永远不会 公布。

允许部分 HTML 代码:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
URLs must be fully qualified (eg: http://www.yeeach.com),and all tags must be properly closed.

超出部分系统将会自动分段及换行。

请保证评论内容是与日志或 Blog 内容相关的,灌水、攻击性或不恰当的评论 可能 会被编辑或删除。

    RSS订阅

    近期文章

    近期评论

    文章归档

    分类目录