使用 Wireguard 很方便,但公网或端口封后就会无预备,安排下个工具 Zerotier。
工具有 Wireguard,Zerotier,Tailscale/Headscale(都基于 Wireguard),Nebula,Ngrok,Frp,nps,n2n/OmniEdge,rathole。
1. 介绍
通过 Zerotier 官方 planet 根服务器建立虚拟局域网
优点:
在没有自带公网 IP 的云服务器的情况下也可以异地组网,部署简单快捷,全地球都可以访问。
缺点:
① 免费版允许连接设备最大 25 台,个人够用。
② 数据不安全,外国的服务器无重要数据时可以使用。
③ 受网络波动影响,可能连接不稳定。
2. 名词
1.planet 官方的:
属于官方根服务器(行星服务器)控制端,但有人根据源码出了修改版。用于管理客户端验证、IP、router、DNS、备注等。在无法打洞建立 P2P 直连时,可作为中继服务器转发设备间流量,速度慢,数据在外,免费版最大支持 25 个设备连接。
2.moon 私人的:
属于私有根服务器(卫星服务器),可自建,可使用他人提供服务器,可作为客户端 P2P 打洞和中继服务器转发中心。moon 1.x 搁浅了,moon 2.0 据说还在进程中。
3.leaf 客户端:
连接到根服务器的网络节点,可以是 Windows、macOS、Android、iOS、Linux、NAS 等。
4.planet 私人的:
可搭建属于个人的后台控制端,管理全部。
* controller 是控制器,负责接入网络节点的管理,zerotier 本身自带命令行的控制器,但不怎么方便,做得比较好的管理界面是 ztncui(https://github.com/key-networks/ztncui);
* planet 行星,这个是网络中作为发现、发布的公共节点,简单点说就是当使用 zerotier-cli join xxxx 或者 zerotier-cli orbit xxxx xxxx 的时候,告诉客户端 xxxx 是哪台机器;
* moon 月球,这是 zerotier 网络中用于中转数据的服务器,它实现了两个无法点对点直连设备之间的中继传输;
* leaf 叶子,是网络中的末端节点,只作为客户端出现,不参与转发、管理的工作,一般情况下使用 zerotier-cli join xxxx 命令加入网络的设备都是 leaf。
* moon 可以通过 zerotier-idtool 生成相关配置文件,在 leaf 上执行 zerotier-cli orbit xxxx 命令将 moon 加入 leaf 节点的 moonlist。
* planet 必须通过修改源码并自行编译方式才能修改,且所有与之相连的 moon 和 leaf 都必须使用同样的 planet 才能正常互相发现。
3. 官方控制端
https://my.zerotier.com/network
创建好虚拟网络,获取官方 planet 的局域网 NETWORK ID,类型为 Private(手动授权),Public(自动授权)。
网络信息
1.在 zerotier 后台创建好虚拟局域网 IP 段为:
10.10.10.0/24
2.举例家庭/公司局域网 IP 段为:
192.168.0.0/24
192.168.1.0/24
4. Zerotier 客户端(官方)
docker rm -f Zerotier
docker run -d \
--name Zerotier \
--restart=always \
--net=host \
--cap-add=NET_ADMIN \
--cap-add=SYS_ADMIN \
--device /dev/net/tun \
zerotier/zerotier:latest 1c33666660666666
# NETWORK ID 是:1c33666660666666
1.查看加入虚拟网是否成功,状态会显示代码 200
Debian:~# docker exec Zerotier zerotier-cli listnetworks
--------------------------------------------------------
200 listnetworks <nwid> <name> <mac> <status> <type> <dev> <ZT assigned ips>
200 listnetworks 1c33666660666666 5e:fd:a7:36:xx:xx ACCESS_DENIED PRIVATE zt2lr3lsmn -
# docker 命令:加入/退出/列出网络
# docker exec Zerotier zerotier-cli join Network ID
# docker exec Zerotier zerotier-cli leave Network ID
# docker exec Zerotier zerotier-cli listnetworks
2.在后台授权客户端
进入后台页面,点击 NETWORK ID 栏,进入设置,勾选 Auth? 以下列表框同意授权,自动分配 IP 给客户端。
3.再次查看网络连接状态,会显示分配 IP 网段信息
docker exec Zerotier zerotier-cli listnetworks
----------------------------------------------
Debian:~# docker exec Zerotier zerotier-cli listnetworks
200 listnetworks <nwid> <name> <mac> <status> <type> <dev> <ZT assigned ips>
200 listnetworks 1c33666660666666 NetWorks-1 5e:fd:a7:36:xx:xx OK PRIVATE zt2lr3lsmn fccc:47c6:93fa:d3e6:de1f::1/40,10.10.10.116/24
4.ifconfig 查看网卡信息
ztxxxxxxxx 开头的虚拟网卡和相关 IP 信息
5. 测试组网
目前只部署了一个客户端,还需要一个客户端组网,下载 Windows 客户端:
https://www.zerotier.com/download
打开程序,输入上边虚拟网的 NETWORK ID ,再到后台授权该客户端即可。
Linux 端:
Debian:~# ping 10.10.10.130
PING 10.10.10.130 (10.10.10.130) 56(84) bytes of data.
64 bytes from 10.10.10.130: icmp_seq=1 ttl=128 time=151 ms
64 bytes from 10.10.10.130: icmp_seq=2 ttl=128 time=91.9 ms
64 bytes from 10.10.10.130: icmp_seq=3 ttl=128 time=93.2 ms
64 bytes from 10.10.10.130: icmp_seq=4 ttl=128 time=84.1 ms
64 bytes from 10.10.10.130: icmp_seq=5 ttl=128 time=109 ms
64 bytes from 10.10.10.130: icmp_seq=6 ttl=128 time=68.1 ms
64 bytes from 10.10.10.130: icmp_seq=7 ttl=128 time=116 ms
64 bytes from 10.10.10.130: icmp_seq=8 ttl=128 time=57.1 ms
Windows 端:
C:\Users\Administrator>ping 10.10.10.116 -t
正在 Ping 10.10.10.116 具有 32 字节的数据:
来自 10.10.10.116 的回复: 字节=32 时间=382ms TTL=64
来自 10.10.10.116 的回复: 字节=32 时间=68ms TTL=64
来自 10.10.10.116 的回复: 字节=32 时间=88ms TTL=64
来自 10.10.10.116 的回复: 字节=32 时间=70ms TTL=64
来自 10.10.10.116 的回复: 字节=32 时间=68ms TTL=64
来自 10.10.10.116 的回复: 字节=32 时间=74ms TTL=64
测试情况:
1.可看出通过官方(国外服务器) P2P 打洞直连成功,内网服务可以使用虚拟网 IP 访问。
2.如果 PING 值很高说明 P2P 失败,可以断开再连,或不理它直到打洞成功为止。
3.目前只能用虚拟网分配 IP 访问,跨网段方法在下面。
6. 跨网段访问
打开 管理端后台 增加路由;Advanced --> Add Routes
手动下发 router 给所有客户端。
Destination (Via)
192.168.1.0/24 10.10.10.116
# 说明:
# Destination,填写家庭/公司真实局域网 IP 段
# (via),填写 管理端后台 虚拟网分配的 IP,该设备必须在真实局域网内
测试情况:
192.168.x.x 无法访问,192.168.x.x:8888 可以访问。
可能的解决方式:
1.真实局域网机器的 Docker 作为网关跳板失败,待解决。
2.打开 IP 路由数据包转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
3.打洞隧道失败,断开虚拟网再次连接。
4.防火墙:
# 在 ssh 环境中用 zerotier-cli listnetworks 或者 ifconfig 查询 zt 开头网卡名称
iptables -I FORWARD -i ztxxxxxxxx -j ACCEPT
iptables -I FORWARD -o ztxxxxxxxx -j ACCEPT
iptables -t nat -I POSTROUTING -o ztxxxxxxxx -j MASQUERADE
# 防火墙规则持久化
iptables-save
5.对于 RDP 远程桌面,在对应 Windows 安装客户端,使用虚拟 IP 远程访问。
7. 端口信息
9993/tcp/udp,Zerotier 穿透要用到的端口
3000/4000,zero-ui 端口
8. tun 设备
Debian tun
执行:cat /dev/net/tun
返回:cat: /dev/net/tun: File descriptor in bad state
支持的,说明模块安装正确。
群辉 tun
# 写入内容/自启
cat <<EOF > /usr/local/etc/rc.d/tun.sh
!/bin/sh -e
insmod /lib/modules/tun.ko
EOF
# 使其可执行
chmod a+x /usr/local/etc/rc.d/tun.sh
9. 搭建 planet 私人控制端
https://www.mrdoc.fun/doc/443/
https://juejin.cn/post/7154383527109197837
http://124.222.129.205/?p=351
其他:
https://juejin.cn/post/7161224755519946759
https://www.modb.pro/db/410432