背景:
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呢?
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
网友评论已有0条评论, 我也要评论