Featured image of post 内网穿透-异地组网

内网穿透-异地组网

配置zerotier,添加moon节点来稳定穿透服务

  最初打算用公网服务器+Frp来实现内网穿透,这是稳定的方案,但使用下来会有几个问题。

  1. mstsc走公网ip+端口号的方式,在我理解里是三根水管相连,数据要通过云服务器上传,不只是端口映射,木桶效应在于云服务器的带宽限制(2~3M过于卡顿).
  2. Frp会一直扫公网ip的端口号,尽管可以添加SSL,但是远程桌面走的是tcp服务,stcp不能成功打开udp的远程桌面,也可能是我没配置正确,暂时还在寻找原因.
  3. 宿舍用moonlight串流工位电脑,用zerotier会比较方便和管理.

  之前不喜欢zerotier的原因是因为planet的服务器在国外,用户多的时候会打洞失败,而且延迟巨高!遇到过好几次了,但是现在我有了国内的云服务器,那就可以类似frp的方式做个端口映射,就变成"两根水管相连",这样的话就是木桶效应是工位网络的上行带宽。

服务器配置Zerotier+Moon

安装zerotier

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# Linux 下载安装
curl -s https://install.zerotier.com/ | sudo bash

# 验证安装情况
zerotier-cli info

# 启动并设置开机自启动
systemctl start zerotier-one.service
systemctl enable zerotier-one.service

# 加入到个人的虚拟局域网
zerotier-cli join Network-ID

  安装成功后显示的信息:200 info 39a50xxxxx 1.14.2 ONLINE,其中39a50xxxxx为该设备的zerotier-id,1.14.2是zerotier的版本号。

配置moon

1
2
3
4
5
# 进入配置目录
cd /var/lib/zerotier-one

# 生成初始配置。读取 identity.public 中的公钥信息,生成初始的 moon 节点配置的 JSON 文件:
zerotier-idtool initmoon identity.public > moon.json

  moon.json包含了设备的id信息等等,同时需要额外配置ip地址和节点信息,在stableEndpoints一栏添加公网ip和端口号(默认是9993),注意格式问题Ipv4 Addr/9993以及在云服务器放开9993端口(udp协议)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
{
 "id": "39a50xxxxx",
 "objtype": "world",
 "roots": [
  {
   "identity": "39a50xxxxx:0:90bc7bf3e1d39a2df373f3fcfc5fc103c6b333226f0949d47906b1c613ff6441850ad3217184277b5b65e381b59289d17561978393fd77ee5ff9d36c37xxxxx",
   "stableEndpoints": ["Ipv4 Addr/9993"]
  }
 ],
 "signingKey": "883bbd62ba065db9879c6bad1ba874b567ff8f7d25349e811669270c0dcb7e4e2989e02cc2ebc6681da2f5b9b7037c3c66a68eb5b6843d5067e4db3c1dxxxxx",
 "signingKey_SECRET": "4a72efbf7da50602ba01e413588badb9294a64f27bdc600c297f2e591d7b437ac856cfa4ded3e5478fb914054df5d96ef2ed4ce667e5603669f4c7799e1xxxxx",
 "updatesMustBeSignedBy": "883bbd62ba065db9879c6bad1ba874b567ff8f7d25349e811669270c0dcb7e4e2989e02cc2ebc6681da2f5b9b7037c3c66a68eb5b6843d5067e4db3c1ddxxxxx",
 "worldType": "moon"
}

  配置完毕,保存并退出,最后基于moon.json文件生成最终的moon配置文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 新建文件夹,方便管理
mkdir moons.d 

# 生成最终配置文件。基于 moon.json 配置文件,生成最终的 moon 配置文件(通常命名为 000000xxxx.moon):
zerotier-idtool genmoon moon.json

# 移动moon配置文件
mv 000000xxxx.moon moons.d/

# 重启服务
systemctl restart zerotier-one

  最终会生成带zerotier-id的moon配置文件,文件名就是moon-id,在老版本是16位的,新版本(1.12.2ver后)都是10位的,即不含前面的6个数字0;

  000000xxxx.moon是个二进制文件,不可读,而且带加密签名,将这个文件下载到服务端电脑上。

客户端添加moon

  以我的PC为例,Christina - win1123H2 - Zerotier 1.14.2 & moon的配置文件

  进入zerotier的配置路径,默认是C:\ProgramData\ZeroTier\One,新建一个moons.d文件夹并将000000xxxx.moon文件放置其中(需要管理员权限),在services.msc中重启zerotier服务。

  以管理员身份启动powershell:

1
2
3
4
cd C:\ProgramData\ZeroTier\One

# 检查路由
zerotier-cli listpeers

  listpeers可以看到虚拟局域网下的各个节点信息和连接情况:

1
2
3
4
5
6
7
8
200 listpeers <ztaddr> <path> <latency> <version> <role>
200 listpeers 39a50xxxxx 1.95.xxxxxx/9993;2904;2808 96 1.14.2 MOON
200 listpeers 778cdxxxxx - -1 - PLANET
200 listpeers bbd67xxxxx 192.168.5.8/22591;2906;2896 9 1.14.0 LEAF
200 listpeers cafe0xxxxx - -1 - PLANET
200 listpeers cafe8xxxxx - -1 - PLANET
200 listpeers cafefxxxxx - -1 - PLANET
200 listpeers d2f9cxxxxxb 192.168.5.5/9993;8190;8184 5 1.14.2 LEAF

  其中,<ztaddr>代表zerotier-id,<path>代表路由,<latency>代表延迟,<role>代表节点的身份信息

  • PLANET就是zerotier官方的中转节点,-1基本上就是官方的节点挂了….
  • MOON是自建的zerotier的节点,延迟96ms
  • LEAF是虚拟局域网的各个设备节点

  一些额外的指令:

1
2
3
4
5
# 加入moon节点
zerotier-cli orbit <world ID> <seed>

# 取消加入moon节点
zerotier-cli deorbit <moon-id>

  这样基本就配置成功了,走虚拟路由也方便异地串流;

Done
2025.02.27 17:39

“普通”とか”あたりまえ”ってなんだろう?
使用 Hugo 构建
主题 StackJimmy 设计
本博客已稳定运行