海外地区开启IPV6无法访问服务器问题

前言

最近有海外地区的用户反馈无法访问公司的网络,无法下载应用和系统进行升级。了解到浏览器可以正常访问公司域名,谷歌,油管等都能正常使用。日志分析GET请求服务器数据时没有得到应答,最终查询网络相关修改确认与网络IPV6有关。
先来看下全球主流网站IPv6的支持情况:
请添加图片描述

具体可查看这篇文章:https://zhuanlan.zhihu.com/p/605189137?utm_id=0
可以看到全球主流大公司很多未支持IPv6网络,国内阿里、腾讯也是部分支持并未全部支持,而360、百度、淘宝、CSDN等网站都不支持IPv6。
不止要考虑网站的IPv6的支持,还要考虑电信业务商是否支持IPv6。像台湾有些电信业务商,支持IPv6网络,例如台湾之星、中华电信,且在4G和5G的支持情况也不一致。

IPv6的可达性测试

在测试IPv6的可达性网址https://en.internet.nl/ 测试 www.czvv.com 网址结果如下,提示IPv6不可达。请添加图片描述

同样测试国内百度www.baidu.com 和 www.tecent.com 也是IPv6不可达。
请添加图片描述

测试支付宝www.alipay.com 谷歌www.google.com 或者 www.youtube.com 等都是IPv6可达的。请添加图片描述

总的来说国内IPv6的普及率不高,很多网址都是IPv6不可达。

问题分析

湾湾和阿三等地区用户都反馈了无法进行在线检查升级,一直在等待服务器应当。湾湾用户反馈使用台湾之星的手机卡不能检测升级,而换另一张非台湾之星的手机卡可以检测升级,之前系统未升级时可以正常访问网络的。通过查证得知系统添加修改了DNS对IPv6的支持,因此可知系统支持IPv6后无法正常从公司服务器获取数据。系统支持IPv6后会优先使用IPv6的地址进行访问。
为了进一步去除IPv6的影响,让湾湾用户在手机上关闭了IPv6的支持,只使用IPv4。结果关掉IPv6后即可以正常检测升级了。
从抓取的日志看到开启IPv6的情况下,请求www.czvv.com 获取信息时一直未收到服务器应答,显示www.czvv.com 使用IPv6的地址不可达。

解决方案

由于IPv6地址不可达,因此需要对DNS进行过滤,滤除IPv6地址。
OkHttpClient支持设置自定义DNS,于是在网络框架初始化时配置OkHttpClient,并添加自定义的DNS过滤器。
DnsFilter代码如下:

import androidx.annotation.NonNull;

import com.czvv.base.utils.ALog;
import com.czvv.mycar.util.ShareDb;

import okhttp3.Dns;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;

public class DnsFilter implements Dns {

    public DnsFilter() {
    }

    @NonNull
    @Override
    public List<InetAddress> lookup(@NonNull String hostname){
        List<InetAddress> addresses = new ArrayList<>();
        try {

            List<InetAddress> list = Dns.SYSTEM.lookup(hostname);
            if (ShareDb.getDnsFilter()) {
                for (InetAddress inetAddress : list) {
                    ALog.print("inetAddress:" + inetAddress.toString() + "  " + (inetAddress instanceof Inet6Address));
                    if (inetAddress instanceof Inet4Address) {
                        addresses.add(inetAddress);
                    }
                }
            } else {
                return list;
            }
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }

        return addresses;
    }
}

通过遍历系统的DNS地址列表,把IPv6的地址滤去。这样去请求网络的时候就不会使用IPv6地址去访问了。
通过增加DNS过滤开关进行过滤IPV6地址,应对不同地区的网络环境导致的网络问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
IPv6是下一代的互联网协议,相对于IPv4来说,它提供了大量的IP地址,使得每个设备都能够拥有独立的地址。在IPv6环境下,外网访问内网服务器相对而言更加简单和方便。 首先,内网服务器需要获得一个公网IPv6地址才能够被外网访问到。这可以通过互联网服务提供商(ISP)或者其他IPv6地址服务提供商获得。一旦获得了公网IPv6地址,就可以将其分配给内网服务器。 其次,需要在路由器或者防火墙上进行相应的配置。由于IPv6的地址数量庞大,一般不会出现地址的短缺问题,因此没有必要进行网络地址转换(NAT)。但是,需要进行端口转发(Port Forwarding)的配置,以确保外网请求能够正确到达内网服务器。 然后,需要正确设置服务器的防火墙规则。确保防火墙允许外部的IPv6请求流量进入内部网络,并将请求正确地路由到内网服务器。同时,也需要考虑服务器的安全性,设置适当的安全措施,例如访问控制列表(ACL)等,以防止潜在的攻击。 最后,为了方便外网访问内网服务器,可以使用DNS(域名系统)服务将内网服务器IPv6地址映射到一个易于记忆的域名上。这样,用户只需要输入域名即可访问内网服务器,而无需记住复杂的IPv6地址。 总的来说,IPv6环境下外网访问内网服务器相对简单,主要需要获得公网IPv6地址、进行端口转发配置、设置防火墙规则,并使用DNS服务提供域名解析。通过这些步骤,用户就能够方便地访问内网服务器

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

言并肃

感谢大哥支持!您的鼓励是我动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值