坑边闲话:​最近发现还有几个小伙伴看我好几年前的 IPv6 系列教程,虽然为这些内容依然有价值感到高兴,但是以我现在的观点看,用纯 IPv6 还是有些局限性。

用 IPv6 的用户主要是追求网络可达性,这是新人小白网络探索的第一步,毕竟我当你也是这么走过来的。IPv6 的确是很多人刚入门时的「第一道成就感关卡」:

  • 开通之后立刻可以直接发布服务,不需要 NAT;
  • ping6 能通,感觉自由之门已开。

然而这只是网络可达性阶段

真正的下一步是网络可控性:你要开始关心自己的流量路径DNS 解析MTU路由策略透明代理出口策略路由等。

在这个阶段,IPv6 的优势反而变成负担,因为它的机制(NDP、RA、SLAAC、DHCPv6、两套 DNS、甚至双栈回退逻辑)让控制权被分散。

IPv4 加隧道工具的组合 (WireGuard、Tailscale、Cloudflare Tunnel、Zerotier、EdgeOne Connector) 反而让网络拓扑更统一、可控性更强。而且现在跟几年前不同,最近几年的云管理模式的组网工具越来越多,EdgeOne 和 Cloudflare Connector 就是典型的例子,为此 Cloudflare 甚至在 WireGuard 之外单独开发了 MASQUE 这个协议。

1. 网络栈应该越简单越好·

网络栈越复杂,出了问题就越难排查。IPv6 作为一个与 IPv4 并存的 IP 栈,有自己的一套 NDP 协议,DNS 也可以走独立的 IPv6 地址。加上有些人需要使用代理软件,这导致网络复杂度非常高。

昨晚重启了一下英国这边的路由器,然后网络玄学问题就出现了:有网络,但是所有网页都无法打开。这让我折腾了半小时才定位到问题所在。

当初为了固件刷机的通用性,我仍然选择在英国这台 GL-iNet MT6000 固件里集成 OpenClash. 而且,这个固件已经连续稳定运行 103 天。然而,昨天晚上重启了一次,结果局域网里的所有设备都无法上网。所有发往路由器的 DNS 查询都了无音信。经过一番排查,最终发现 OpenClash 的 init 脚本仍然注入了 53 端口的流量劫持,然而 OpenClash 服务并没有开启,最终导致 DNS 请求都石沉大海。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ sudo nft list ruleset | grep 53
45.252.192.0-45.252.235.255, 45.253.0.0-45.253.87.255,
45.253.92.0-45.253.123.255, 45.253.132.0-45.253.247.255,
59.152.112.0/21, 59.153.4.0/22,
59.153.32.0/22, 59.153.60.0-59.153.75.255,
59.153.92.0/22, 59.153.116.0/22,
59.153.136.0/22, 59.153.152.0/22,
... # China IP list
oifname { "eth2", "phy1-sta0" } counter packets 4174 bytes 656531 accept comment "!fw4: accept wan IPv4/IPv6 traffic"
udp dport 53 counter packets 4105 bytes 289810 redirect to :0 comment "OpenClash DNS Hijack"
tcp dport 53 counter packets 2 bytes 128 accept comment "OpenClash DNS Hijack"
meta skuid != 65534 udp dport 53 ip daddr 127.0.0.1 counter packets 122 bytes 9070 redirect to :0 comment "OpenClash DNS Hijack"
meta skuid != 65534 tcp dport 53 ip daddr 127.0.0.1 counter packets 0 bytes 0 accept comment "OpenClash DNS Hijack"
tcp dport 53 meta skuid != 65534 meta mark set 0x00000162 counter packets 0 bytes 0
tcp dport 0-65535 meta skuid != 65534 meta mark set 0x00000162 counter packets 8195 bytes 25049243
meta l4proto { tcp, udp } th dport 0-65535 meta mark set 0x00000162 counter packets 71226 bytes 15209859

正常情况下,我们使用 OpenClash 的 DNS 服务,但是并不开启 53 端口的流量劫持。使用 AdGuardHome 等软件做 DNS 控制并向上请求 OpenClash 做 DNS 解析会更优雅一些。如果强行在 netfilter 里注入 53 端口的流量劫持,即开启 OpenClash DNS Hijack,会导致 AdGuardHome 无法正常工作,因此 DHCP 下发的 DNS server 就形同虚设,不能上网也就不足为怪了。

2. IPv6 也会让网络变得非常复杂·

上述的 DNS 案例可能和 IPv6 关系不大,但是根据我的使用经验,加入 IPv6 的后果和这个差不多,都会急剧增加网络复杂度。除非你很有信心能解决问题,否则还是要坚持网络栈越简单越好的原则。

建议还是多研究一下网络隧道工具的用法,这样可以降低网络复杂度。因为绝大多数网络隧道工具的模型是网络接口 interface,因此路由配置会更加统一、简单。基于 IPv6 实现全链路连接,还是有些过于不切实际。

3. IPv6 的使用价值·

对于国内网络互联,完全可以基于 IPv4 和 IPv6 组建一套双活的网络隧道。比如默认使用 IPv4 建隧道,如果不通,则自动切换到 IPv6 替代。