zerotier初体验
背景
希望在手机上,访问家里的NAS服务器。但是手机无法直连家里的IP。调研了一下,适合使用zerotier来中转[1]。
隧道协议类型 | 适用平台 | 安全性 | 速度 [注 1] | 连接稳定性 | 需要公网 IP | 防火墙友好度 |
---|---|---|---|---|---|---|
L2TP/IPsec [注 2] | 非常广泛 | 较高 | 中等 | 较稳定 | 是 | 中等 |
IKEv2/IPsec [注 3] | 非常广泛 | 较高 | 中等 | 较稳定 | 服务器侧需要 | 好 |
ZeroTier | 需要安装 | 较高 | 快 [注 4] | 稳定 | 否 | 好 |
WireGuard | 需要安装 | 高 | 非常快 | 稳定 | 是 | 较好 |
OpenConnect | 需要安装 | 高 | 中等 | 稳定 | 服务器侧需要 | 较好 |
基本体验
Linux安装
安装方式来自[2]。
curl -s https://install.zerotier.com | sudo bash
Android安装
安装方式来自[2]。
在Google Play上,安装ZeroTier One。
设置网络ID
在zerotier官网上,注册一个网络,得到网络ID xxx。
在Linux上,执行
zerotier-cli join xxx
zerotier moon体验
由于zerotier服务器在国外,导致延迟大,以及有时不稳定。所以可以自建一个zerotier server,即自建一个moon主机。
- 安装zerotier
在自建的主机上,安装zerotier。
- 生成moon配置文件
cd /var/lib/zerotier-one
zerotier-idtool initmoon identity.public > moon.json
修改配置文件中的ip,如果要公网访问,则填写VPS的IP。如果为内部网络使用,则填写内网IP。默认端口号为9993。
"stableEndpoints": ["192.168.xx.xx/9993"]
需要在VPS上,开放此UDP端口。
- 生成配置文件
zerotier-idtool genmoon moon.json
mv 000000xxxxxxxxxx.moon moons.d/
- 重新启动服务
service zerotier-one restart
Linux客户端使用Moon
在zerotier目录下,创建moons.d文件夹。将前面生成的0000xxxx.moon文件复制过来,最后重启服务。
确认加入成功
zerotier-cli peers
结果中有一行:
xxxx xxxx MOON xxxx DIRECT xxxx xxxx xxxx
角色为MOON,连接方式为DIRECT,就表明连接成功了。
Android客户端使用Moon
见[4]
自建controller
每一个客户端的电脑,是一个Leaf。Leaf之间,通过Planet知道其它人的存在。
但是我们会发现,默认会有一个国外的Leaf,官方解释没看懂。
通过自建controller,可以定制自己的网络,类似于自己管理家用路由器下面的节点。建好后,就看不到国外的Leaf了。同时,还有其它优点[5]:
- 解除官方 50 的设备连接数限制
- 提升手机客户端连接的稳定性
方法如下[9]:
git clone https://gitee.com/Jonnyan404/zerotier-planet
cd zerotier-planet
修改 docker-compose.yml
文件,将MYADDR
改为自己的公网IP。最后执行:
docker-compose up -d
访问:localhost:4000
,按照 docker-compose.yml
中默认账号登录。
最终效果如下:
zerotier-cli peers
200 peers
<ztaddr> <ver> <role> <lat> <link> <lastTX> <lastRX> <path>
xxxxxxxx001 - PLANET 206 DIRECT 6486 1275 50.7.x.x/9993
xxxxxxxx002 - PLANET 311 DIRECT 6486 1175 103.195.x.x/9993
xxxxxxxx003 - PLANET 164 DIRECT 6486 1299 84.17.x.x/9993
xxxxxxxx004 - PLANET 180 DIRECT 6487 1302 104.194.x.x/9993
xxxxxxxx005 1.8.7 MOON 5 DIRECT 4875 6481 101.x.x.x/9993
其中四个PLANET服务器,都是国外的,前两个是新加坡的,第三个是英国的,第四个是美国的。但是MOON服务器,是自己的。
纯内网
还有一种方式,建一个自己的planet,彻底不依赖官方的网络,见[4]中的评论和[8]。
安装ztncui管理后台
ztncui[11]是一个管理后台。本小节安装方法来自于[10]。
wget
https://s3-us-west-1.amazonaws.com/key-networks/deb/ztncui/1/x86_64/ztncui_0.8.6_amd64.deb
dpkg -i ztncui_0.7.1_amd64.deb
# 加入下面这行,支持从外网通过3443端口,进行https访问。
# echo 'HTTPS_PORT=3443' > /opt/key-networks/ztncui/.env
echo 'NODE_ENV=production' >> /opt/key-networks/ztncui/.env
systemctl restart ztncui
管理页面入口:http://localhost:3000/
默认用户:admin / password
进入后,请先新建一组用户,再把admin删除掉。
配置moon服务器
和前面的配置moon的过程是相同的。不再重复记录。
到这步为止,还是使用的官方的PLANET。
关联ztncui和moon服务器
如果 ztncui账号有读/var/lib/zerotier-one/authtoken.secret
的权限,则不用执行本小节的关联操作。
获取ZT_TOKEN为/var/lib/zerotier-one/authtoken.secret
的内容
编辑配置文件:/opt/key-networks/ztncui/.env,增加两行
ZT_TOKEN=xxxx
ZT_ADDR=127.0.0.1:9993
然后重启ztncui服务
service ztncui restart
原理是,ztncui会访问zerotier-one的接口,http://127.0.0.1:9993/status。
生成PLANET文件
下载工具,生产自己的planet文件。
wget https://github.com/kaaass/ZeroTierOne/releases/download/mkmoonworld-1.0/mkmoonworld-x86_64
执行生成文件指令, ./mkmoonworld-x86_64 moon.json
会得到下列文件:
current.c25519
previous.c25519
world.bin
覆盖掉zerotier中默认的planet文件,并且重启服务。
cp world.bin /var/lib/zerotier-one/planet
/etc/init.d/zerotier-one restart
再执行 zerotier-cli peers
,可以看到已经没有官方的PLANET了。
继续配置ztncui
在ztncui中,
- 增加一个network。
- 在network的easy setup中,增加一个网段。
- routes用于设置路由转发规则,这里先不设置。
客户端配置
自行把planet文件同步到各客户端上。
在zerotier上自定义路由
背景
节点A 192.168.10.10 和B 192.168.10.20 均在zerotier的虚拟网段 192.168.10.0/24 内。
节点A默认为直连网站 192.168.99.99;
期望节点A,通过节点B,来连接网站 192.168.99.99。
方法
在节点A中增加一条路由
route add -net 192.168.99.99 netmask 255.255.255.255 gw 192.168.10.20
效果检查
在A上发起ping (此时还ping不通)
ping 192.168.99.99
PING 192.168.99.99 (192.168.99.99) 56(84) bytes of data.
在B上抓包
ngrep host 192.168.99.99 -W byline
interface: eth0 (172.18.240.0/255.255.240.0)
filter: ( host 192.168.99.99 ) and ((ip || ip6) || (vlan && (ip || ip6)))
#
I 192.168.10.10 -> 192.168.99.99 8:0 #1
....&ywb.....c...................... !"#$%&'()*+,-./01234567
在节点B中,配置防火墙
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -d 192.168.99.99 -o eth0 -j MASQUERADE
效果检查
在A上发起ping (此时可以ping通)
ping 192.168.99.99
PING 192.168.99.99 (192.168.99.99) 56(84) bytes of data.
FAQ
报错
执行:zerotier-one -d
启动命令的时候就会报错
ERROR: unable to configure virtual network port: could not open TUN/TAP device: No such file or directory
解决:
检查tun模块状态
检查是否安装了 tun
模块:
lsmod | grep tun
如果结果为空,请尝试安装它:
insmod /lib/modules/tun.ko
参考
- 异地网络远程访问指北(上)
- zero tier官网
- 搭建zerotier moon中转服务器实现虚拟局域网稳定快速互访
- Zerotier 非官方安卓客户端发布:支持自建 Moon 节点
- 聊聊云服务器 篇五:私有化部署zerotier planet服务器
- 5分钟穿透内网,连通公司和家
- ZeroTier network controller user interface in a Docker container
- 内网穿透 篇二:借助第三方控制器ztncui私人化zerotier one,打造安全的内网穿透环境
- ZeroTier Planet 行星服务器,一键私有部署,可突破 50 台设备限制
- ztncui Introduction
- ztncui@github
- 解决群晖 NAS 无法使用 TUN / TAP 的问题