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

五分钟自建 ZeroTier 的 Planet/Controller

  •  1
     
  •   sbilly · 300 天前 · 10703 次点击
    这是一个创建于 300 天前的主题,其中的信息可能已经有所发展或是发生改变。

    官方的 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 条附言  ·  299 天前

    增加客户端的相关配置

    客户端

    从控制器 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 条附言  ·  206 天前

    发文以后自建 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,包括:

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

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

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

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

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

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

    identify,planet 使用的公钥

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

    identify.public/identify.secret/authtoken.secret 这几个文件该如何自定义
    oneisall8955
        17
    oneisall8955  
       298 天前 via Android
    @oneisall8955 另外,这是不是私有化部署 zerotier 服务端的意思?如果是,那客户端如何加入,需要做什么变动?
    sbilly
        18
    sbilly  
    OP
       298 天前
    @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  
       298 天前
    修改了 Identity 为现在的 pub key,build 好了之后,启动没问题
    client 修改 plants 文件之后,连不上。。
    4000 和 9333 都是通的。Endpoints 用 127.0.0.1 和公网 IP 均这个情况。
    huanxianghao
        20
    huanxianghao  
       298 天前
    谢谢,不过现在自建 moon 基本够用了,以后再折腾
    sbilly
        21
    sbilly  
    OP
       297 天前
    @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  
       297 天前
    能突破 100 台设备限制么?
    hronro
        23
    hronro  
       297 天前
    没用过 ZeroTier,对比起 Tailscale 之类的有什么优劣?
    ch8000
        24
    ch8000  
       297 天前
    这个 docker 做的太大了, 存储个局域网信息,用 postgreSQL 大材小用,这个数据库是代替 Oracle 的。不知道有没用 sqlite 版本的
    ch8000
        25
    ch8000  
       297 天前
    @yicong135 不是 100 个,后来官方改为 50 个了
    sbilly
        26
    sbilly  
    OP
       297 天前
    @yicong135 自建的没有限制
    @ch8000 没有 pgsql
    @hronro 和 tailscale 一样都是工具,够用就好
    shanliang
        27
    shanliang  
       293 天前
    有没有现成的镜像呀,因为考虑到 Planet 肯定放在国内,就用国内机编译过了很久去看发现失败了。。
    shanliang
        28
    shanliang  
       293 天前
    @shanliang 哦我蠢了。。。可以直接用
    ch8000
        29
    ch8000  
       292 天前
    Planet 能否建两个,能否加这部分内容?
    以便单点故障 或维护时容错? 这样只搭建一个,还是不如用国外的安心。只是免 moon 搭建而已。
    hw2ex
        30
    hw2ex  
       291 天前
    @sbilly docker 运行起来之后,客户端连不上,而且 windows 下的 planet 放在哪个地方?另外,路由器里的 zerotier 配置文件一般都在 /tmp 下,重启之后 planet 就变为原来的了。楼主,有没有详细的步骤说明呀?没有一端能连接上的
    sbilly
        31
    sbilly  
    OP
       291 天前
    @hw2ex Windows 下缺省在 `C:\ProgramData\ZeroTier\One\`; openwrt 配置文件都是持久化在 `/etc/config` 目录下。可以参考下这篇文章 https://v2ex.com/t/539919 方法差不多。
    @ch8000 多点这个对大多数用户来说要求更高了,还得数据库啥的 。。。
    ragnaroks
        32
    ragnaroks  
       281 天前
    当创建一个没有 ipv4 自动分配的网络后,无法进入 zero-ui,控制台提示

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

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

    `zerotier-idtool generate planet.secret planet.public`
    sbilly
        39
    sbilly  
    OP
       264 天前
    @EVJohn 换言之,就是 planet 用的 identity.public
    TossPig
        40
    TossPig  
       226 天前
    请问 planet 需要固定 ip 嘛?
    sbilly
        41
    sbilly  
    OP
       225 天前
    @TossPig 需要
    Markxu0
        42
    Markxu0  
       221 天前
    迫于楼主这个国内机器下载过慢,自己也写了一个 https://github.com/xubiaolin/docker-zerotier-planet
    sbilly
        43
    sbilly  
    OP
       205 天前
    发文以后自建 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  
       203 天前
    绝了,我不论是自己编译的镜像还是直接用你的,都连不上 planet ,客户端 join 之后 members 死活是空的。
    客户端执行 zerotier-cli peers 也只有一行,在你 issues 有个一样的问题,
    luo362722353
        45
    luo362722353  
       200 天前
    @sbilly 冒昧问一下 ,openwrt 需要改动哪几个配置,Planet 建立后,客户端无法上线到 Planet
    documentzhangx66
        46
    documentzhangx66  
       182 天前
    最近研究了一下 moon 到 plannet ,发现很多问题。

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

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

    而且这软件基于 UDP ,很多企业环境里,网管直接把 udp 给禁了,这软件也废了。
    humbass
        47
    humbass  
       42 天前
    新版本可以直接搭建 Planet 服务器,客户端都不用动,直接联网。
    modrich
        48
    modrich  
       8 天前 via Android
    @humbass 请问有教程吗,怎么搞
    gam2046
        49
    gam2046  
       1 天前
    大佬 想咨询一下,搭建私有的 controller 与 moon ,那么在客户端需要做哪些事情呢。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1295 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 23:15 · PVG 07:15 · LAX 16:15 · JFK 19:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.