真没想到,Zerotier的玩法还是挺多的。
由于翻墙不顺的原因来折腾这个软件,不过这对于公司组网啥的也都有帮助,只拿来翻墙属实有点大材小用了。
可以把本文作为一个思路,大佬们可以沿着这个思路继续折腾,为了便于查看,我就不加权限了,这又不是翻墙教程XD

之前发过一个帖子,在本地是v4单栈,服务器是4+6双栈的情况下,可以把服务器多余的公网IPv6分给本地设备,并且无需NAT即可上网。
https://www.nodeseek.com/post-3384-1

而这次,由于我想的是,墙目前不管UDP,且很多人反映IPv6+$$裸奔无事,这两个原因,我打算尝试着让本地和VPS通过v6连接,zerotier组网,然后由远程服务器负责转发本机所有的流量。
如果要经过NAT还好,如果要直接把公网IP分配到远端,则服务器端需要静态公网IP,否则IP一变就不通了(如果拿来代理上网的话),只需要远程访问/组网的话可以不在乎这个,ZT面板上分配内网IP即可。

优点:方便,开机即用,不想用可以一键关闭,还省了其他软件。
缺点:全局路由,不能灵活分流;速度取决于运营商是否对UDP包QoS;底层用v6容易环路。


先看效果:
本地电脑Win10,服务器美国,v4走CF,v6走HE。服务器和客户端之间走的是v4+UDP(强制指定v6可以通一小会,但很快就会环路,原因不明。这套方法理论上是可行的,强制最外层用v6通信,但是不知道是因为我服务器v6是HE隧道的原因?还是什么,反正强制指定后,过一会就会环路。表现是Zerotier网卡跑满一千兆无意义数据包,会导致电脑上不了网。不知道是不是Windows自身的问题。当然,可能和ipv6非原生也有关系,因为我为了继续划分子网,接入的是HE的v6隧道。服务器上执行zerotier-cli peers看到连接到的所有客户端都是走的v4)


首先创建Zerotier账号和网络,记下16位网络号,然后把两个设备都加入网络。
zerotier-cli join <你的16位ZT网络号> #加入网络
zerotier-cli set <你的16位ZT网络号> allowDefault=1 #允许覆写默认路由
zerotier-cli set <你的16位ZT网络号> allowGlobal=1 #允许全球IP地址转发

然后进ZT后台面板批准,并且分配IP。我因为要把v6公网IP分配过来,所以用的v6是公网,不用开NAT。
v4的话,如果你是壕,拥有一个段的公网v4的话,也可以直接分配公网IP,就省了NAT了。

我选择的内网IP段是:100.64.0.0/10,2001:db8:0000::/48
可以在Zerotier面板的Auto-Assign中设置分配范围,新加入的客户端可以自动获取IP。

服务器IP手动分配:100.64.23.40,2001:db8::dd1c
客户端IP自动分配。

Managed Routes中添加:
::/0 经由 2001:db8::dd1c
0.0.0.0/0 经由 100.64.23.40

100.64.0.0/10 经由 LAN
2001:db8:0000::/48 经由 LAN
(经由LAN是写好Destination直接提交即可)

客户端这边,打勾allowManaged(默认勾选),allowGlobal,allowDefault,
第一个是允许内网IP,第二个允许全球IP,第三个允许覆写默认路由。还有个DNS没搞明白,不用动。
如果不勾选第二个,那么设置的公网IP不会分配下去。
如果不勾选第三个,则不会改变默认路由。不需要全局路由时,关掉它即可,相当于总开关(或者禁用网卡也行。

然后需要在sysctl.conf里面开启Linux内核的数据包转发:
(粘贴到命令行即可,一键生效)

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.default.forwarding = 1" >> /etc/sysctl.conf

sysctl -p #生效更改

此时发现客户端v6已经通了,但是v4没有网。这是因为v4是内网IP,无法直接路由(v4也分配公网的壕到这就不用看下去了,双栈已经通了,直接上网冲浪吧)。

登录服务器,执行命令:iptables -t nat -A POSTROUTING -s 100.64.0.0/10 -j MASQUERADE为v4开启NAT。我之前试着指定网卡,但是会有问题,比如不支持Warp,那么就按照源IP来NAT吧。
如果v6分配的是内网IP,则也无法上网,需要开启NAT:ip6tables -t nat -A POSTROUTING -s fd00:0101:64::/48 -j MASQUERADE(假如IP段是fd00:101:64::/48,换成自己的)
PS,如果把:101:换成💯貌似还会变成emoji,tg也有这个问题……
之前就是因为【v6可以直接分配,v4不是公网IP】的原因所以无法通信,我就说嘛,到现在才反应过来是NAT的锅。

然后路由跟踪就通了,把ZT网卡里添加两个国外DNS,因为流量是路由出去的,所以不会被污染。

总结:开启IPv4的NAT,实现网卡级全局路由。
貌似不支持桥接,也不知道是不是设置有误。

记录今天折腾的内容,仅供参考。