zerotier初体验

  |   0 评论   |   0 浏览

背景

希望在手机上,访问家里的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主机。

  1. 安装zerotier

在自建的主机上,安装zerotier。

  1. 生成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端口。

  1. 生成配置文件
zerotier-idtool genmoon moon.json
mv 000000xxxxxxxxxx.moon moons.d/
  1. 重新启动服务
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中,

  1. 增加一个network。
  2. 在network的easy setup中,增加一个网段。
  3. 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

参考

  1. 异地网络远程访问指北(上)
  2. zero tier官网
  3. 搭建zerotier moon中转服务器实现虚拟局域网稳定快速互访
  4. Zerotier 非官方安卓客户端发布:支持自建 Moon 节点
  5. 聊聊云服务器 篇五:私有化部署zerotier planet服务器
  6. 5分钟穿透内网,连通公司和家
  7. ZeroTier network controller user interface in a Docker container
  8. 内网穿透 篇二:借助第三方控制器ztncui私人化zerotier one,打造安全的内网穿透环境
  9. ZeroTier Planet 行星服务器,一键私有部署,可突破 50 台设备限制
  10. ztncui Introduction
  11. ztncui@github
  12. 解决群晖 NAS 无法使用 TUN / TAP 的问题