家庭网络启用 IPv6 指北
很难相信上一篇文章已经是写作于六年以前了。这篇文章中笔者将讲一讲家庭网络启用IPv6过程和遇到的相关问题。
这并非一篇严肃的文章。
读者可能最有兴趣的问题
问:启用IPv6后,网速是否有提高?延迟是否有降低?
答:
简单答案:没有。
完整答案:笔者没有肉眼观察到网速提高和延迟降低。通过对国内大厂的IPv6地址进行 ping
测试,然后和同类服务的IPv4进行对比,反倒是IPv4的延迟要低一些。
当然,用ping测试延迟并不是很严谨,用TCP延迟会更好一些。但一些笔者测试的IPv6的TCP常用端口并未响应握手,故无法测试TCP延迟。这里笔者统一用ping测试延迟,然后统计数据。这个场景下,有差错的数据也比完全没有数据要好。
阿里DNS IPv4
1028 packets transmitted, 1028 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 5.659/8.927/74.450/4.168 ms
阿里DNS IPv6
1084 packets transmitted, 1084 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 34.291/37.353/302.918/9.137 ms
广东电信DNS IPv4
1391 packets transmitted, 1391 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 37.322/42.831/249.455/17.318 ms
广东电信DNS IPv6
1386 packets transmitted, 1386 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 33.885/41.057/306.478/19.199 ms
淘宝主站点 IPv4
1344 packets transmitted, 1344 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 3.733/8.113/192.451/13.384 ms
淘宝主站点 IPv6
1335 packets transmitted, 1335 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 3.992/9.065/256.288/14.864 ms
腾讯主站点 IPv4
1106 packets transmitted, 1106 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 4.691/9.434/280.426/17.910 ms
腾讯主站点 IPv6
1136 packets transmitted, 1136 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 20.880/27.748/312.603/21.003 ms
从上面的数字看,除广东电信DNS IPv6的ping平均值数据略优于IPv4外,其他数据无论是平均数还是标准差,IPv4统计到的数据均优于IPv6。笔者简单检查了下,发现是IPv6路由有绕路的情况,看来IPv6的优化没有IPv4做的好。
然后笔者还使用 Iperf3 做了简单的速度测试。客户端连接同一个服务器,第一次连接IPv6地址,第二次连接IPv4地址;客户端使用8个并发连接;服务端发送数据,客户端接收。结果如下,
IPv6 结果
[SUM] 0.00-10.05 sec 88.4 MBytes 73.8 Mbits/sec 5646 sender
IPv4 结果
[SUM] 0.00-10.04 sec 91.9 MBytes 76.7 Mbits/sec 6418 sender
在 Iperf3 测试中,IPv4的速度表现仍然是略优一些。
需要注意的是,这些测试是在同一地理位置下在相近的时间段内进行的。并未排除ISP,家庭内部设备,时间段,被测试服务器负载等变量。如果读者正在考虑启用IPv6,笔者建议在自己的位置进行单独的测试。
问:当前IPv6是否已经成熟?
答:在文章写作的当前时间点(2024年),国内的IPv6发展和部署情况已经足够成熟和广泛。^1
问:IPv6是否需要额外付费?
答:不需要。从逻辑上说,IPv6是发展趋势,且是互联网底层的一部分,对这部分升级应该包含在基础设施费用中。IPv6并非增值服务,不需要额外付费。
问:启用IPv6的设置是否复杂?
答:因为个人兴趣关系,笔者的家庭网络拓扑结构比一般家庭更复杂,故对应的设置也要多一些。笔者认为在大部分情况下,读者的家庭网络结构的复杂程度不太可能超过笔者,若读者参考本文设置启用IPv6,需要的设置会比文章中提到的要更少。
优势和缺陷
下面是笔者找到的,启用IPv6的优势和缺陷。
优势
IPv6公网访问
获取到IPv6的家庭内网设备,可以直接在公网通过IPv6直接访问。使用v6后,不需要再设置端口转发之类的服务。笔者自己没有需要在公网访问家庭内网设备的场景,但许多互联网用户的确有该需求,所以算得上是个好处。
访问纯IPv6资源
启用v6后,纯IPv6资源就是可访问状态了。比如纯IPv6的网站;一些P2P协议也可能会从中受益,比如BitTorrent。笔者认为当前互联网中,若支持v6访问,那大概率也是支持v4访问。目前笔者找到的纯v6网站更多为测试性质,比如检查v6是否正常启用;未找到纯v6,不支持v4,且无替代业务的网站。
除上面提到的内容外,笔者就暂时没有找到其他的好处了。当然有类似更多地址空间,解决NAT问题,全球唯一地址等优点。但笔者认为这些好处在家庭网络这个小型网络场景中并未明确体现,故未列出。
缺陷
笔者发现v6的缺陷明显多于优势。
隐私问题
笔者的网关设备在默认选项下,v6的 DHCPv6 和 Router Advertisement (RA) 处于转发模式下。这意味着网关自己没有处理相关请求,而是将这些转发给了上游ISP的服务器。进一步地,相关设备信息会被发送给上游,比如设备的MAC地址。若此时启用IPv6的设备不支持随机MAC,此信息可以被用于跨网络追踪设备的网络接入情况。
举一个极端的例子:假设笔者住在一个合租的房子内,和其他的几位室友连接同一个Wi-Fi。某天笔者需要翻墙下载一些资料,若此时未启用v6,万一很不幸地,警察叔叔来找笔者的麻烦,笔者还可以甩锅给室友(不考虑其他可追踪因素,如路由器log,国内App帐号实名制等)。因为经过路由器NAT后,所有内网设备访问公网资源的源地址会显示为同一个IP。
但如果启用了IPv6,此时还想抵赖就非常困难了。v6的地址全球唯一,此时进行网络访问,服务器端记录到的地址将会是设备的v6地址,且还存在MAC这种大概率唯一的数据。若叔叔认真,可能会被请到其工作地点喝茶。
虽然可以通过设置来部分解决这些问题,但其一是过程复杂,对不了解技术的用户来说几乎不可能实现;其二是,很可能家庭的路由器根本没有这些设置,那修改更是无从谈起。
安全问题
在笔者接触到的设备和系统中,即使已经配置过IPv4的防火墙,IPv6的防火墙也许要单独地再配置一次。这意味着如果设备或者系统默认防火墙若配置不正确,在启用v6后,内网所有设备将直接暴露于公网。
这里再举一个笔者自己的例子,笔者的网关设置在启用IPv6之前,只设置了v4的防火墙。启用v6后,笔者忘记了设置v6的防火墙。在之后的几天,笔者陆续优化完善了v6的内网配置,然后才想起来防火墙这件事。笔者发现自己的网关默认没有启用v6防火墙,且对v6的入向流量默认放行。
当笔者发现该问题后,使用自己的一个带IPv6地址的VPS对网关后的一个设备尝试连接。结果不出所料,连接成功了。笔者的一个内网设备上运行的服务并未设置用户认证,且这个服务的端口可以直接通过IPv6在公网访问,这不禁让笔者吓出一身冷汗。幸运的是,因为协议比较小众,且使用了非标准端口,所幸未受到攻击,log日志也没有发现异常。笔者自认为计算机相关经验丰富,安全意识已经较高,但是还是在设置IPv6时出现了安全问题,故引申出一个相关的思考:设置IPv6是否会导致出现在IPv4场景下没有发现的安全缺陷?
软件适配
虽然当下IPv6在底层已经相对成熟,但部分软件仍然缺少对v6的支持、需要额外的适配,也许有或多或少的问题。
以大名鼎鼎的 Nginx 为例,监听一个IPv4的443端口需要一个 listen 443
指令;但如果想监听IPv6的同一个端口,做到支持双栈网络,需要增加一行指令 listen [::]:443
。可见IPv6未做到无缝接入,软件也并非在IPv6开箱即用的状态。
除上面提到 Nginx,笔者也使用 Docker,在启用IPv6后,笔者尝试在自己的容器服务内启用对IPv6的支持,但并未成功。后来才在文档中看到:macOS版本的 Docker Desktop 并未支持 IPv6。^2 直到笔者写下这本文章,IPv6仍处于不支持的状态。作为一个被广泛使用的服务端程序,笔者惊讶于其并未支持v6。
启用的理由
读者可能想说:既然你这里列出的缺点多于优点,还需要额外的设置,为什么还要启用IPv6?在这里,笔者给出两个自认为适当的理由。
第一是,IPv6是趋势。虽然目前IPv6的使用增长缓慢,但是这个增长的趋势仍然在。^3 当IPv6的用户成为多数后,强制使用 IPv6 也并非不可能。^4 故比起到时候慌忙设置 IPv6 导致出现各种测试、适配问题,在有空时逐步引入,持续测试并监控网络情况是一种更好的选择。
第二是,正如一句知名台词所言:选择是一种幻觉,但无疑是一种珍贵的东西。启用IPv6,你就多了一种选择,如果你连接的终端有双栈网络支持,那你可以选择走v6,也可以选择走v4,只要你愿意去折腾。多一种选择不一定有用,但肯定比只有一种选择要更好。
总结
笔者认为在家庭这个小型网络场景启用IPv6的优势不明显,且存在一些问题,但仍然值得去尝试。
启用的步骤
确认网络服务提供商、硬件和软件支持
首先要做的是,确认你的网络服务提供商分配给你的宽带是否已经支持 IPv6。在当下,中国移动、联通和电信在大部分地区应该已经完全支持IPv6。当然,确认一下也不会花太多的时间,你可以在光猫的管理后台查看到。如果不知道如何访问光猫后台,可以搜索或者使用生成式AI查询相关方法。
其次是,确认需要启用IPv6的设备,这些设备在硬件是否支持。一般来说,现在的消费级计算设备(电脑,手机等)已经在硬件全面支持IPv6,找到一台没有v6支持的硬件可能反而是稀罕事。
最后是,你需要确认运行于这些设备上的,希望启用IPv6的软件,是否支持IPv6。举例来说:
- 如果你希望上网使用IPv6,那么你需要确认浏览器和操作系统是否支持v6。
- 如果你希望让一个运行于 Docker 容器中的 Nginx 实例启用IPv6,那么你需要检查 Docker 配置,Nginx 配置和操作系统支持情况。
当然你完全不需要这么认真,常用的软件大概率已经有了IPv6支持。另外,搜索引擎或者使用生成式AI会是你最好的帮手。如果你使用的是一个付费的软件或者服务,最简单的办法就是询问客服。
确认IPv6的防火墙状态
笔者将这一步放在比较靠前的位置是因为出于对上文中提到的安全问题的考虑。怀疑与谨慎乃安全之母,需要认真对待安全问题。虽然笔者侥幸没有遭遇攻击,但是作为读者的你则不能期待与笔者有相同的运气和结果。
在这里,笔者建议读者,如果网关设备有安全或者防火墙方面的设置,则进入浏览。确认IPv6的防火墙处于打开的状态:
- 如果光猫运行于路由模式,则检查光猫的防火墙设置。
- 如果光猫运行于桥接模式,则检查主路由器的防火墙设置。
在这里,笔者需要单独提一下专业的网关设备,或者硬件防火墙上的防火墙设置。因为笔者自己自己因为不当配置,被卡住了一段时间。如果读者使用的是一台普通的消费级路由器,则不需要阅读本节下面的这段话。
对于专业的网关设备或者硬件防火墙,笔者建议使用最小权限法则,仅允许明确需要公网访问的端口接受入向流量,对其他入向流量默认直接丢弃。除此之外,可能需要允许 546
和 547
这两个端口的入向流量,因为他们是 DHCPv6 协议使用的端口。如果禁用会导致内网设备不能被自动分配 IPv6 地址。
确认 DNS 支持 IPv6 解析
这一步中,我们需要确认设备的 DNS 支持解析 IPv6 (会返回 AAAA 记录)。否则即使启用 IPv6,如果 DNS 不支持解析v6地址,通过域名访问支持IPv6的网站,也不会走v6的线路。
首先要做的是,确认你的设备使用是自定义DNS,还是网关的DNS。如果使用自定义DNS,笔者建议修改为使用网关提供的DNS,方便管理。
然后打开网关/你的路由器,找到DNS设置,笔者建议设置为,
- 主DNS(腾讯提供):119.29.29.29
- 副DNS(阿里巴巴提供):223.5.5.5
这二者DNS由笔者测试均支持解析IPv6。
如果你不希望使用这两个DNS,可以用下面的命令来测试你使用的DNS服务器是否支持IPv6,
- Windows系统:
nslookup -type=AAAA www.taobao.com
- 类Unix系统:
dig www.taobao.com AAAA
如果返回的数据中包含一个合法的公网IPv6地址,比如 2402:4e00::
、2400:3200::1
或者 240e:96c:6400:600:3::7eb
则证明你的DNS支持解析IPv6。
请注意,“DNS支持解析IPv6地址”和“DNS支持通过IPv6连接”是两个不同的概念。即使你目前处于纯IPv4环境,如果DNS支持IPv6,也会返回包含IPv6的数据。
另外,DNS 在路由器端和设备端均大概率存在缓存,如果你修改了DNS 地址,最简单的清空缓存的方法是重启设备。
启用网关/主路由器的IPv6
进入网关/主路由器的管理后台,启用 IPv6。一般情况下,启用IPv6的开关应该在网络设置中一个比较显眼的位置,不会难找。
启用 IPv6 后,笔者这里建议等待5分钟,然后重启一下网关/主路由器。这可以让设备回到冷启动状态,并且重新拨号联网,避免一些可能的小问题。
确认网关/主路由器已获取IPv6
重启网关/主路由器后,等待设备重新联网,完成后检查是否获取到 IPv6 网段。此信息应该可以在设备管理后台的 设备状态 或者 网络状态 类似的区域中找到。
需要注意的是,获取到的 IPv6 网站应该是一个全球单播地址,国内可能是以 24
开头,
- 中国移动:可能为
2409
开头 - 中国联通:可能为
2408
开头 - 中国电信:可能为
240e
开头
正常情况下,网关/主路由器显示的获取到的 IPv6 网段应该包含,
- 一个或者多个全球单播地址(
24
)分配于外网接口 - 一个本地地址(
fe
或者fd
)分配于内网接口
你的设备可能会合并显示上面的信息。但如果你发现获取的到IPv6地址只有本地地址,那么你的设备仍然无法通过 IPv6 在公网通讯。此情况下,需要重新检查网络、硬件和软件的配制,是否有不支持或者配制错误的情况,导致未获取到 IPv6。
如果上面的步骤都没有发现问题,那么此时你的网关/主路由器设备应该已经可以通过IPv6访问公网了。若该设备支持命令行或者终端操作,可以进行 ping 测试:
ping6 -c 5 2400:3200::1
如果没有出现错误,能ping通,则说明网关/主路由器设备已经成功启用 IPv6。
启用终端设备的 IPv6
当前的消费级终端设备(你的手机,电脑等)中的绝大部分,会自动尝试获取IPv6地址。这一步中不需要额外的设置,一般情况下只需要断开网络接入,然后重新连接网络即可,
- 对于无线网络,关闭Wi-Fi开关,等待一分钟,然后重启打开。
- 对于有线网络,可以禁用有线网络接口,等待一分钟,然后重新启用。
重新连接网络后,查看系统的网络状态来检查是否设备已经被分配IPv6。
- Windows和Apple系产品系统可以在系统设置的网络区域查看到是否被分配 IPv6
- Linux系统可以使用终端命令:
ip a | grep inet6
和上一节内容提到的相同,设备取得的IPv6地址应该包含一个全球单播地址(24
开头)。当然也可以使用ping6命令来检查连通情况。
经过上面的一通折腾你的设备就可以通过IPv6访问公网了。如果还需要HTTP over IPv6,打开尝试打开这个地址:https://6.ipw.cn/,如果能够打开则说明已经能够打开纯IPv6网站,其网页会显示访问设备的IPv6地址。
到这里,家庭网络启用IPv6的步骤已经全部完成。
笔者的个人经验。
以下内容为笔者认为值得记录的主观感受和经验,可能不正确,这里笔者分享出来,仅供读者参考。
检查你的防火墙!
计算机有三个主题很重要,第一个是安全,第二个是安全,第三个还是安全。如果读者成功配制了IPv6,那么务必开启IPv6的防火墙;如果没有成功,或者想渐进式接入,笔者建议在其余时间直接禁用IPv6,等待需要设置时再启用,避免风险。
如果有条件,笔者更进一步地建议使用一台有公网访问条件的VPS,在家庭设备和VPS之间进行IPv6连通测试,来确认家庭内部设备端口不可到达。
再次检查你的防火墙!
代理软件问题
在默认情况下,现代操作系统会优先使用IPv6网络栈。举例来说,如果一个网站同时支持IPv6和IPv4,那么系统会默认连接IPv6地址,而不使用IPv4。若读者有使用网络代理软件(如Clash,Surge等),代理软件可能会变更这种行为。
以Clash为例,若请求连接的地址同时包含v4和v6,那么Clash客户端会同时尝试握手两个地址,然后连接至响应最快的地址。这种策略在绝大部分情况下是最优的,但可能会带来一些小问题。例如:读者想测试仅使用IPv6网络,但在使用代理软件的情况,可能还是会走IPv4。
如果读者使用代理软件,笔者建议进一步查看代理的配制文件和手册,来确认本问题不会影响到日常使用。