V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sbilly
V2EX  ›  宽带症候群

五分钟自建 ZeroTier 的 Planet/Controller

  •  2
     
  •   sbilly · 2021-09-03 11:05:48 +08:00 · 21251 次点击
    这是一个创建于 937 天前的主题,其中的信息可能已经有所发展或是发生改变。

    官方的 roots 都不在大陆地区,ZT 穿越 NAT 成功率和时延、丢包率这些网络质量有关。现在 VPS 越来越便宜了,而且 ZT 的 controller 也不太要求大带宽,自建一个 ZT 的 controller 非常有利于 NAT 穿越,搞了一个容器化的 zerotier controller (github.com/sbilly/docker-zerotier-controller),五分钟内就可以让自己的 controller 上线

    目前使用的是 zero-ui 作为 controller 的 WEB 界面(缺省用户名 /密码是 admin/zero-ui),如下图。

    zero-ui.png

    自定义 planets

    github.com/sbilly/docker-zerotier-controller 的内容复制到本地,按照你自己的需求修改 patch/planets.json,然后构建容器镜像。

    {
      "planets": [
        {
          "Location": "Beijing", // planet 所在位置,其实可以是任何注释信息
          "Identity": "a4de2130c2:0:ab5257bb05cd2fb8044fe26483f6d27b57124ca7b350fb3e0f07d405c68c4416094dbc836bf62ed483072501aa3384dff3c74ac50050c1bfbb1dc657001ef6a1", // planet 使用的公钥
          "Endpoints": ["127.0.0.1/9993"] // 端点清单,使用 IP/port 格式,支持 IPv4/IPv6
        }
      ]
    }
    

    构建镜像

    docker build --force-rm . -t sbilly/zerotier-controller:latest
    

    运行

    可以根据实际需求启动容器镜像,下面是几个例子:

    # Run with default settings
    docker run --rm -ti -p 4000:4000 -p 9993:9993 -p 9993:9993/udp sbilly/zerotier-controller:latest
    
    # Run with custom envirments settings
    docker run --rm -ti -e ZU_SECURE_HEADERS=false -e ZU_CONTROLLER_ENDPOINT=http://127.0.0.1:9993/ -e ZU_DEFAULT_USERNAME=admin -e ZU_DEFAULT_PASSWORD=zero-ui -p 4000:4000 -p 3000:3000 -p 9993:9993 -p 9993:9993/udp sbilly/zerotier-controller:latest
    
    # Run with docker volumes
    docker run --rm -ti -v `pwd`/config/identity.public:/app/config/identity.public -v `pwd`/config/identity.secret:/app/config/identity.secret -v `pwd`/config/authtoken.secret:/app/config/authtoken.secret -p 3000:3000 -p 4000:4000 -p 9993:9993 -p 9993:9993/udp sbilly/zerotier-controller:latest
    
    • 缺省用户名 /密码是 admin/zero-ui,可以通过环境变量 ZU_DEFAULT_USERNAMEZU_DEFAULT_PASSWORD 来设置
    • 环境变量 ZT_PRIMARY_PORT 定义了 ZeroTierOne 的 local.conf 配置文件中 primaryPort 的设置
    • 其他环境变量可以参考 zero-ui 的相关说明

    其他的也可以看看 github.com/sbilly/docker-zerotier-controller

    第 1 条附言  ·  2021-09-04 15:38:25 +08:00

    增加客户端的相关配置

    客户端

    从控制器 WEB 界面下载 planet 文件,并保存到节点的配置文件所在的目录,例如:/var/lib/zerotier-one/planet。然后启动 zerotier-one

    # Download planet
    wget http://[IP_OF_CONTROLLER]:[PORT_OF_CONTROLLER]/app/static/planet -O /var/lib/zerotier-one/planet
    
    # Start ZeroTierOne
    zerotier-one -d /var/lib/zerotier-one/
    
    第 2 条附言  ·  2021-12-06 15:28:33 +08:00

    发文以后自建 ZeroTier Planet/Controller 的 docker 镜像和帖子都多了不少,甚至有一些提到了能不做任何修改光一个 UI 就可以自建 planet,这其实是有误导的。大家可以看一下自己机器上 zerotier-cli listpeers 的显示,如果你自己的节点都是 peer 或者 moon,则意味着并没有成为 planet

    ZeroTier 本身有几个概念:

    • root/planet:就是 zerotier-cli listpeers 看到的 planet。
    • controller:控制器,提供内部的 API,参与到 network 的寻址等一系列流程中。实际部署中不少其实也是 root/planet,也可以不部署在一起。
    • controller UI:控制器的 WEB 界面,提供用户层面的界面和 API。缺省可以和 root/planet、controller 在同一台机器上,但实际上是可以 不部署在一起。

    目前 github.com 上提供的和 controller 相关的开源项目基本都是 controller UI,包括:

    这几个项目主要是提供了界面,并绕过官方在界面上对节点数量的限制,但实际上对时延这些并无改善。

    56 条回复    2024-01-15 11:54:41 +08:00
    heqirong
        1
    heqirong  
       2021-09-03 11:39:47 +08:00
    自建 Planet 比搭个 moon 的优势有哪些?
    huawuya
        2
    huawuya  
       2021-09-03 11:56:13 +08:00
    以前自建的 moon,开始挺好用的,速度很快,可惜后来国内运营商对 UDP 的 Qos 丢包太严重,导致最后几乎没法用,只好改用 tinc 了,速度终于正常了,但是没有 zerotier 使用方便。
    sbilly
        3
    sbilly  
    OP
       2021-09-03 12:49:43 +08:00
    @heqirong 很多现象都和 丢包、时延 有关。比如如果你没遇到 a -> moon 正常 b -> moon 不正常,那就都差不多。印象中,moon 只是参与 NAT 穿越,其他的和 moon 无关。

    @huawuya 嗯嗯,ZT 是一个集程度比较高的,其他类似工具各有特点。够用就好。
    Ayahuasec
        4
    Ayahuasec  
       2021-09-03 13:34:43 +08:00 via Android
    同因为 udp 的运营商 qos 改用 tinc 的
    但是现在还是很怀念 zerotier 的面板,实在太方便了,tinc 虽然自定义程度高,但是每次修改都得连上去操作
    不知道 zerotier 有没有流量默认过 moon 中转的仅 tcp 模式了
    szxczyc
        5
    szxczyc  
       2021-09-03 13:52:24 +08:00 via iPhone
    我用的腾讯云➕frp 速度很快
    ifwangs
        6
    ifwangs  
       2021-09-03 16:10:19 +08:00
    搭建好了如何加入呢
    wszgrcy
        7
    wszgrcy  
       2021-09-03 16:25:12 +08:00
    我昨天也写了个文章...看来是撞车了 https://segmentfault.com/a/1190000040618153
    troilus
        8
    troilus  
       2021-09-03 17:08:26 +08:00
    支持 DDNS 吗? 搭了个 Moon 结果不支持 DDNS
    oneisall8955
        9
    oneisall8955  
       2021-09-03 17:50:23 +08:00
    小白一脸懵逼,有没有了解下上下文的资料?搭建了不知道要干嘛
    jousca
        10
    jousca  
       2021-09-03 21:33:16 +08:00
    @oneisall8955 你如果用 ZeroTier 的话就比较清楚。 类似 FRP 的内网穿透
    bclerdx
        11
    bclerdx  
       2021-09-03 23:20:54 +08:00 via Android
    @huawuya 怎么测试运营商 udp qos 严重?
    sbilly
        12
    sbilly  
    OP
       2021-09-03 23:41:19 +08:00
    @ifwangs 和官方一样,在 web 界面上创建了 network 以后,在客户端 `zerotier-cli join` 对应的 network 即可。
    @troilus 这个 moon 的概念和 ddns 无关,是 orbit 到一个 id 上去。如果 moon 没有公网地址,效果不好。
    @wszgrcy 哈哈,想到一起了
    @oneisall8955 可以用 zerotier 搜索下本站。是一个建立虚拟网络的软件。
    ifwangs
        13
    ifwangs  
       2021-09-03 23:47:25 +08:00 via iPhone
    @sbilly 直接 jion 的话会走自建 planet ?
    sbilly
        14
    sbilly  
    OP
       2021-09-04 15:39:53 +08:00
    @ifwangs 是的。不过对应的客户端也要做一定的配置。

    更新容器镜像,重新启动控制器。控制器启动后,从控制器 WEB 界面下载 planet 文件,并保存到节点的配置文件所在的目录,例如:/var/lib/zerotier-one/planet 。然后启动 zerotier-one 。
    Cassius
        15
    Cassius  
       2021-09-04 19:32:45 +08:00
    好家伙原来客户端不需要修改的么.
    太好了终于不用弄 moons 了
    oneisall8955
        16
    oneisall8955  
       2021-09-05 14:21:50 +08:00 via Android
    @jousca
    @sbilly

    知道是内网穿透可以异地组网,zerotier 经常用,也搭建过 moon 节点

    疑惑的是,项目里面有些参数不知道怎么自定义,如

    identify,planet 使用的公钥

    -p 端口需要多少个,这几个端口都用于什么的( 9993 好理解 4000/3000 就不懂)

    identify.public/identify.secret/authtoken.secret 这几个文件该如何自定义
    oneisall8955
        17
    oneisall8955  
       2021-09-05 14:23:20 +08:00 via Android
    @oneisall8955 另外,这是不是私有化部署 zerotier 服务端的意思?如果是,那客户端如何加入,需要做什么变动?
    sbilly
        18
    sbilly  
    OP
       2021-09-05 14:52:50 +08:00
    @oneisall8955

    1. identity.* 文件是 zeortier 运行时自动创建的,也可以用 zerotier-cli generate 来生成
    2. “planet 使用的公钥” 就是指 zerotier planet 的 identity.public 文件中的内容。项目里面 planet.json 对应的 identity 是 patch/planet.public 和 patch/planet.secret
    3. 9333 是 zerotier 的端口,3000/4000 都是 zero-ui 的端口(缺省配置的 zero-ui 只用了 4000 端口)
    4. authtoken.secret 文件是 zerotier 运行时自动创建
    5. 客户端加入方法可以参考一楼增加的 “客户端” 相关内容
    Cassius
        19
    Cassius  
       2021-09-05 17:57:42 +08:00
    修改了 Identity 为现在的 pub key,build 好了之后,启动没问题
    client 修改 plants 文件之后,连不上。。
    4000 和 9333 都是通的。Endpoints 用 127.0.0.1 和公网 IP 均这个情况。
    huanxianghao
        20
    huanxianghao  
       2021-09-05 23:39:30 +08:00
    谢谢,不过现在自建 moon 基本够用了,以后再折腾
    sbilly
        21
    sbilly  
    OP
       2021-09-06 08:39:25 +08:00
    @Cassius

    1. 确保 mkworld.cpp 和你希望的 pub key 和 ip/port 正确,并能正常编译
    2. 执行 mkworld 能输出的 world.c 和 world.bin ,把 wolrd.bin 重命名为 planet
    3. 确保 Toplogy.cpp 的相关内容与 world.c 一致
    4. 确保 peer 使用 正确的 planet,或者用上面的代码直接编译 peer
    5. 确保 peer 可以正常访问 Endpoints

    如果在同一台机器的容器环境测试 controller 和 peer,需要注意网络端口冲突、网络是否可达等问题
    yicong135
        22
    yicong135  
       2021-09-06 08:52:12 +08:00
    能突破 100 台设备限制么?
    hronro
        23
    hronro  
       2021-09-06 10:15:53 +08:00
    没用过 ZeroTier,对比起 Tailscale 之类的有什么优劣?
    ch8000
        24
    ch8000  
       2021-09-06 19:54:55 +08:00
    这个 docker 做的太大了, 存储个局域网信息,用 postgreSQL 大材小用,这个数据库是代替 Oracle 的。不知道有没用 sqlite 版本的
    ch8000
        25
    ch8000  
       2021-09-06 20:29:20 +08:00
    @yicong135 不是 100 个,后来官方改为 50 个了
    sbilly
        26
    sbilly  
    OP
       2021-09-06 21:02:48 +08:00
    @yicong135 自建的没有限制
    @ch8000 没有 pgsql
    @hronro 和 tailscale 一样都是工具,够用就好
    shanliang
        27
    shanliang  
       2021-09-11 04:47:18 +08:00
    有没有现成的镜像呀,因为考虑到 Planet 肯定放在国内,就用国内机编译过了很久去看发现失败了。。
    shanliang
        28
    shanliang  
       2021-09-11 04:57:06 +08:00
    @shanliang 哦我蠢了。。。可以直接用
    ch8000
        29
    ch8000  
       2021-09-11 10:01:26 +08:00
    Planet 能否建两个,能否加这部分内容?
    以便单点故障 或维护时容错? 这样只搭建一个,还是不如用国外的安心。只是免 moon 搭建而已。
    hw2ex
        30
    hw2ex  
       2021-09-12 15:50:27 +08:00
    @sbilly docker 运行起来之后,客户端连不上,而且 windows 下的 planet 放在哪个地方?另外,路由器里的 zerotier 配置文件一般都在 /tmp 下,重启之后 planet 就变为原来的了。楼主,有没有详细的步骤说明呀?没有一端能连接上的
    sbilly
        31
    sbilly  
    OP
       2021-09-12 22:51:52 +08:00
    @hw2ex Windows 下缺省在 `C:\ProgramData\ZeroTier\One\`; openwrt 配置文件都是持久化在 `/etc/config` 目录下。可以参考下这篇文章 https://v2ex.com/t/539919 方法差不多。
    @ch8000 多点这个对大多数用户来说要求更高了,还得数据库啥的 。。。
    ragnaroks
        32
    ragnaroks  
       2021-09-22 19:39:40 +08:00
    当创建一个没有 ipv4 自动分配的网络后,无法进入 zero-ui,控制台提示

    Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'ipRangeStart')

    其它兼容实现的控制器均支持完全手动分配,比如 key-networks 和 zerolite
    ragnaroks
        33
    ragnaroks  
       2021-09-22 19:40:59 +08:00
    问题在于如果不支持可以提醒用户并使用默认设置,而不是报错后直接白屏无法操作,虽然这是 zero-ui 的问题不是楼主的问题
    sbilly
        34
    sbilly  
    OP
       2021-09-23 12:29:07 +08:00
    @ragnaroks 你说的 zerolite 是开源的么?我在 github 和 google 上都没有找到对应的。
    ragnaroks
        35
    ragnaroks  
       2021-09-23 23:17:37 +08:00
    @sbilly 是 github 上的,还是 1.5.2 的时候,只有这个版本可以在铁威马正常运行,可能现在不维护就私有了
    bbsingao
        36
    bbsingao  
       2021-09-29 15:08:24 +08:00
    一年前就自己编译 planet 了。不过没什么用。因为移动设备的 planet 文件替换非常麻烦。
    EVJohn
        37
    EVJohn  
       2021-10-09 00:41:17 +08:00
    大佬好,想问下 planets.json 里的公钥,是自己生成还是要从哪儿取的。
    sbilly
        38
    sbilly  
    OP
       2021-10-09 10:45:56 +08:00
    @EVJohn 用 `zerotier-idtool` 生成,例如:

    `zerotier-idtool generate planet.secret planet.public`
    sbilly
        39
    sbilly  
    OP
       2021-10-09 10:46:50 +08:00
    @EVJohn 换言之,就是 planet 用的 identity.public
    TossPig
        40
    TossPig  
       2021-11-16 22:25:00 +08:00
    请问 planet 需要固定 ip 嘛?
    sbilly
        41
    sbilly  
    OP
       2021-11-17 09:39:47 +08:00
    @TossPig 需要
    Markxu0
        42
    Markxu0  
       2021-11-21 16:55:18 +08:00
    迫于楼主这个国内机器下载过慢,自己也写了一个 https://github.com/xubiaolin/docker-zerotier-planet
    sbilly
        43
    sbilly  
    OP
       2021-12-07 09:17:19 +08:00
    发文以后自建 ZeroTier Planet/Controller 的 docker 镜像和帖子都多了不少,甚至有一些提到了能不做任何修改光一个 UI 就可以自建 planet ,这其实是有误导的。大家可以看一下自己机器上 zerotier-cli listpeers 的显示,如果你自己的节点都是 peer 或者 moon ,则意味着并没有成为 planet 。

    ZeroTier 本身有几个概念:

    - root/planet:就是 zerotier-cli listpeers 看到的 planet 。
    - controller:控制器,提供内部的 API ,参与到 network 的寻址等一系列流程中。实际部署中不少其实也是 root/planet ,也可以不部署在一起。
    - controller UI:控制器的 WEB 界面,提供用户层面的界面和 API 。缺省可以和 root/planet 、controller 在同一台机器上,但实际上是可以 不部署在一起。

    目前 github.com 上提供的和 controller 相关的开源项目基本都是 controller UI (包括:zero-ui 、ztncui ),这几个项目主要是提供了界面,并绕过官方在界面上对节点数量的限制,但实际上对时延这些并无改善。
    tallest
        44
    tallest  
       2021-12-09 16:17:30 +08:00
    绝了,我不论是自己编译的镜像还是直接用你的,都连不上 planet ,客户端 join 之后 members 死活是空的。
    客户端执行 zerotier-cli peers 也只有一行,在你 issues 有个一样的问题,
    luo362722353
        45
    luo362722353  
       2021-12-12 19:49:52 +08:00
    @sbilly 冒昧问一下 ,openwrt 需要改动哪几个配置,Planet 建立后,客户端无法上线到 Planet
    documentzhangx66
        46
    documentzhangx66  
       2021-12-30 14:53:56 +08:00
    最近研究了一下 moon 到 plannet ,发现很多问题。

    1.这软件就是个傻子,当连接不上时,正常的 tracert 手段根本无法跟踪。

    2.这软件的开发也是个傻子,IP 与端口这些信息居然写死在源代码里。

    而且这软件基于 UDP ,很多企业环境里,网管直接把 udp 给禁了,这软件也废了。
    humbass
        47
    humbass  
       2022-05-19 23:38:22 +08:00
    新版本可以直接搭建 Planet 服务器,客户端都不用动,直接联网。
    modrich
        48
    modrich  
       2022-06-22 13:23:06 +08:00 via Android
    @humbass 请问有教程吗,怎么搞
    gam2046
        49
    gam2046  
       2022-06-29 10:49:44 +08:00
    大佬 想咨询一下,搭建私有的 controller 与 moon ,那么在客户端需要做哪些事情呢。
    CloudyKumori
        50
    CloudyKumori  
       2022-08-03 16:32:26 +08:00 via Android
    @humbass 客户端不用动是指调用官方 api 来连接服务器吗?这个办法好像已经不行了,运营商开始干扰 zerotier 的官方服务器通讯,必须得在服务器端和客户端修改 planet 文件替换才能正常使用了
    ZeroDu
        51
    ZeroDu  
       2022-08-04 17:03:48 +08:00
    直接用你的机箱运行
    ZeroDu
        52
    ZeroDu  
       2022-08-04 17:05:24 +08:00
    直接用你的镜像运行
    ```
    docker run --rm -ti -e ZU_SECURE_HEADERS=false -e ZU_CONTROLLER_ENDPOINT=http://127.0.0.1:9993/ -e ZU_DEFAULT_USERNAME=admin -e ZU_DEFAULT_PASSWORD=zero-ui -p 4000:4000 -p 3000:3000 -p 9993:9993 -p 9993:9993/udp sbilly/zerotier-controller:latest
    ```

    客户端设置 plannet 还是显示 leaf
    jqtmviyu
        53
    jqtmviyu  
       2022-09-20 00:11:13 +08:00
    @ZeroDu 构建镜像可能需要进一步处理, docker 容器里没有把官方的 planet 文件删掉, 需要自己手动替换 planet 配置文件.
    楼主在[issuecomment-1061609898]( https://github.com/sbilly/docker-zerotier-controller/issues/11#issuecomment-1061609898)里回复我了. (但我当时没看到换成 ztncui 控制器的镜像了)
    原作者的回复是[issuecomment-1062405242]( https://github.com/sbilly/docker-zerotier-controller/issues/11#issuecomment-1062405242) 你可以试下有没有效果, 有的话让楼主 fix 下

    你也可能参考下我的一些处理方式[issuecomment-1059961262]( https://github.com/Jonnyan404/zerotier-planet/issues/11#issuecomment-1059961262).
    Xiaosteven
        54
    Xiaosteven  
       225 天前
    @sbilly @Markxu0 因最近国内电信把 4 个官方节点都封了,只能走自建 planet 。请问有没有什么办法可以添加多个 planet?例如我有 3 个服务器,能把这 3 个服务器都添加进来吗?这样不管哪个服务器 ban ,都还有其他的备用。谢谢
    lxian
        55
    lxian  
       75 天前
    @tallest 我也遇到这个问题了。你现在有解决了吗?
    tallest
        56
    tallest  
       73 天前
    @lxian 没有,放弃了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5893 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 02:29 · PVG 10:29 · LAX 19:29 · JFK 22:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.