I'm starting to provide Chinese / English versions of some posts, switch with the Language menu above. 我开始提供部分文章的中文、英文翻译,请使用顶部语言菜单切换。

使用 ZeroTier One 建立自己的 IPv6 隧道

前言

天朝绝大多数 ISP 均不为用户提供 IPv6 地址,除了教育网。但是教育网的 IPv6 很不稳定(可能和我的学校有关),而且一旦离开学校就没有 IPv6 了,很不爽。

有一种方法是使用 HE.NET 的隧道服务。在 SixXS 关闭之后,他们是目前仅存的最大的 IPv6 隧道提供者,而且他们的服务完全免费。但是他们的服务并不适用于天朝的家庭网络环境,因为家庭网络普遍是动态 IP,并且部分运营商为了节省成本已经开始使用大内网,用户无法获取独立 IP,在同一内网就会产生冲突。

好消息是,我有好几台 VPS,均由 VPS 提供商或者 HE.NET 的隧道服务提供了 IPv6。这意味着我可以使用 VPN 方案。但是 Open_VPN 早就无法正常跨境使用了,其它 VPN 方案或多或少都有一些问题。

之前我拿来 Docker 组网的 ZeroTier One VPN 倒是能很好的解决这个问题。有中心管理面板,配置简单;跨境使用目前没有问题;官方甚至提供了详细的教程。

准备

ZeroTier One 的注册安装和加入网络,请参见这篇文章。本文假定 VPS 已经有了一个 IPv6 地址块,并且已经和你需要 IPv6 的设备加入了同一个网络,已经能够互通。

如果你之前有像这篇文章一样开启了整个地址块,必须把它先关闭。你应该在 /etc/rc.local 之类的地方添加过这样的指令:

ip -6 route add local 2333:3333:3333:3333:3333::/80 dev lo

把它删了并重启 VPS。

设置转发

本文假定 IPv6 地址池是 2333:3333:3333:3333:3333::/80 ,并且 ZeroTier One 生成的虚拟网卡是 zt0,请注意替换。

登陆你的 VPS,向 /etc/sysctl.conf 添加如下指令:

net.ipv6.conf.default.forwarding=1
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.all.proxy_ndp=1
net.ipv6.conf.all.accept_ra=2

保存后运行 sysctl -p 生效。

如果你有配置 iptables 防火墙,向配置中添加如下两行,并保存生效:

ip6tables -A FORWARD -i zt0 -s 2333:3333:3333:3333:3333::/80 -j ACCEPT
ip6tables -A FORWARD -i henet -d 2333:3333:3333:3333:3333::/80 -j ACCEPT

ZeroTier 管理页面设置

登陆 ZeroTier 管理界面,点击进入你已经创建好的网络,找到 IPv6 Auto Assign(应该在屏幕右下角):

IPv6 Auto Assign

勾上 Auto Assign from Range(从地址池中自动分配)选项。

Auto Assign from Range

它会要求输入你的地址池的开始与结束地址。对于我们用做演示的 2333:3333:3333:3333:3333::/80,其配置如图所示:

输入地址之后

你会发现 ZeroTier One 还没有给网络内的设备在这个地址池内分配 IPv6 地址,因为你还没有设置这个地址池的路由。看到屏幕右上角的 Managed Routes 选项,在第一个框输入要用的地址池 2333:3333:3333:3333:3333::/80,第二个框留空,如图。

添加地址池

然后,我们要告诉设备,将 ZeroTier 的虚拟网卡默认用于 IPv6 连接。继续添加,在第一个框输入 ::0/0,第二个输入你的 VPS 的内网 IPv6 地址,就是 ZeroTier RFC4193 分配的地址,类似如图:(记得替换地址)

添加默认路由

保存。这时页面下方应该已经显示你的设备拥有了一个公网 IPv6 地址。

ZeroTier 客户端设置

但是当你到你的电脑上查看,会发现看不到分配的公网 IPv6。这是由于 ZeroTier 的安全策略所致。为了防止用户不知情地将所有流量转发到一个 ZeroTier 网络上(即不知情地将 ZeroTier 作为全局 VPN 使用),并允许该网络的管理员为所欲为,你必须手动在每台设备上允许该功能。

在 Windows 和 Mac 设备上,通过 GUI 界面就能打开。打开 Network Details 界面:

ZeroTier 菜单

找到你的网络,打开 Allow Global 和 Allow Default 选项即可,立即生效。

打开两个选项

在 Linux 设备上,假设你的网络 ID 是 2333333333333333,运行如下命令:

zerotier-cli set 2333333333333333 allowGlobal=true
zerotier-cli set 2333333333333333 allowDefault=true

立即生效。如此配置后,你就建好了自己的、在动态 IP 下也可方便使用的 IPv6 隧道了。

« 上一篇文章
加入 DN42 实验网络

本站使用运行在 Vercel 上的 Waline 评论系统,中国大陆访问可能不稳定。