使用IPv6后一些网站无法访问,有时能访问有时无法访问问题解决

发布时间 2023-07-10 03:52:47作者: 胡安

使用IPv6后一些网站无法访问,有时能访问有时无法访问问题解决

遇到这个问题有几天了,虽然有时候可以访问,况且也不是一定要快速访问,但是这样半死不活、并且让人不明就里的状态就很烦,所以开始着手解决这个问题。

把光猫分别配置了只用ipv4和ipv4&ipv6两种情况,发现的确只有在ipv6生效的时候才会发生网站加载十分缓慢或者干脆加载不出来的情况。

搜索发现,大多数指导都是说可能网站问题,可能是防火墙问题等抄来抄去的参考答案,并没有切实有效的解决方法和问题分析,但是还是有必要自己试试。

关了杀毒软件、防火墙等东西之后,查看网页状态,并没有一丝一毫的好转,于是继续搜寻。

把范围缩小到IPv6有关的情况细看,发现了另一种解释,那就是DNS的问题,于是自己把光猫的、本地的DNS都试着修改了一边,通过命令行查询DNS解析,也都没有问题,但是网页端去看,还是问题依旧。

几乎绝望之时,原来点开的文章好像加载出来一点了,虽然没有CSS样式,并且粗看内容和别的照搬文章还是有点不同的,分析的挺有道理,也通俗易懂。

但是细看来也搞笑,我看的这个文章作者是看了另一个大佬的文章,而另一个大佬则是其他人的指点。

其实问题就是PMTU黑洞,大佬的严肃讲解已经很精彩了,我理解来看就是这样:

终端(也就是浏览器等)发包可以设置DF(Don't Fragment)来告诉路由“我给你的别再拆分”,那么路由就会听话不拆分,但是超过了规定,超载了怎么怎么办,既然不让拆小件发,并且超限了,那么丢掉好了,并且恢复给ICMP Fragmentation Needed 消息,告诉发包的,下次别整这么大的,发不了。这样发包的下次就会注意,发小一点的了,这个过程叫PMTU Discovery。

但是在网络链路上,有大量的中间设备为了“安全”或者是因为错误配置,遇到超限且不让拆分的包,它就不声不响地把包扔了,也不吱声,这样收的一方和发的一方都不知道具体情况,那么只能是TCP检测到超时丢包了,以为是网络不通畅,再补发一个一模一样的,但是中间设备还是同样处理。所有的包都在中间部分不知所踪,这就被叫做PMTU黑洞。

由于我们包走的网络链路也并不是固定的,访问目标网站也就极不稳定,只要链路中有这种混蛋设备,你的包就不知所踪了,轻则加载缓慢,重则无法访问。

那么怎么解决呢,那就是自觉自律了,严格要求自己,绝不超限,那么设多少呢,下面是大佬的详细解释,有理有据:

现在国内 ISP 一般都是通过 PPPoE 虚拟拨号建立 WAN 口连接的。Ethernet 的默认 MTU 是 1500,但是 PPPoE 隧道有 8 个 bytes 的开销,所以 PPPoE 虚连接的 MTU 就是 1500-8=1492,减掉 IPv4 包头( 20 字节)和 TCP 包头( 20 字节),可以得知 IPv4 下需要把 MSS 设为 1452 以下。IPv6 的包头是 40 字节,所以 IPv6 下需要把 MSS 设为 1432 以下。
解决方法:

#set security flow tcp-mss all-tcp mss 1452
set security flow tcp-mss all-tcp mss 1432

按照这种思路我改了自己光猫上的参数,成功解决问题。

那么问题来了,为什么一开始没有注意到这篇文章呢?因为这篇文章的网站也是支持IPv6的,所以能加载出来也是巧合,我前面几个小时都看的能正常加载出来的网站。

参考文章:

  1. 使用IPv6后一些网站无法访问,有时能访问有时无法访问问题解决(看到文章)
  2. 使用IPv6后一些网站无法访问,有时能访问有时无法访问问题解决(看到的文章引用的文章)