内网穿透笔记

内网穿透笔记

前提环境:

  1. 公司网络在接入大量VPN设备后,VPN网络环境差
  2. 外出办公需要访问家中设备
  3. 不想购入VPN、内网穿透等物理设备,出口光猫不好折腾

这种情况下,可以使用内网穿透技术,实现端口映射或者内部局域网。

frp 内网穿透

frp是一种用于在内网和外网之间建立安全通信的工具。它可以通过内网穿透技术,将内网服务暴露在外网上,实现远程访问。frp支持TCPUDPHTTP协议,并提供了多种认证方式和加密方式来保障通信安全。您可以访问Frp的官方网站了解更多信息。

github主页:https://github.com/fatedier/frp

官方文档:https://gofrp.org/docs/

release里下载最新版,里面包含服务端和客户端

原理

frp 主要由 客户端(frpc)服务端(frps) 组成,服务端通常部署在具有公网 IP 的机器上,客户端通常部署在需要穿透的内网服务所在的机器上。

内网服务由于没有公网 IP,不能被非局域网内的其他用户访问。

用户通过访问服务端的 frps,由 frp 负责根据请求的端口或其他信息将请求路由到对应的内网机器,从而实现通信。

配置

开机自启

在 Linux 系统下,使用systemd 可以方便地控制 frp 服务端 frps 的启动和停止、配置后台运行和开启自启。

要使用 systemd 来控制 frps,需要先安装 systemd,然后在 /etc/systemd/system 目录下创建一个 frps.service 文件。

  1. 如Linux服务端上没有安装 systemd,可以使用 yumapt 等命令安装 systemd

    1
    2
    3
    4
    # yum
    yum install systemd
    # apt
    apt install systemd
  2. 使用文本编辑器,如 vim 创建并编辑 frps.service 文件。

    1
    vim /etc/systemd/system/frps.service

    写入内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [Unit]
    # 服务名称,可自定义
    Description = frp server
    After = network.target syslog.target
    Wants = network.target

    [Service]
    Type = simple
    # 启动frps的命令,需修改为您的frps的安装路径
    ExecStart = /path/to/frps -c /path/to/frps.ini

    [Install]
    WantedBy = multi-user.target
  3. 使用 systemd 命令,管理 frps。

    1
    2
    3
    4
    5
    6
    7
    8
    # 启动frp
    systemctl start frps
    # 停止frp
    systemctl stop frps
    # 重启frp
    systemctl restart frps
    # 查看frp状态
    systemctl status frps
  4. 配置 frps 开机自启。

    1
    systemctl enable frps

日志默认会记录到/var/log/messages

端口映射

服务端

服务端一般选择具有固定公网IP地址的服务器,例如腾讯云、阿里云、华为云、京东云、aws、谷歌云。

一般云厂商会有新人礼包,免费用三个月、一个月、七天等,例如

腾讯云:https://cloud.tencent.com/act/pro/seckill_season

京东云:https://www.jdcloud.com/

阿里云:https://www.aliyun.com/minisite/goods

另外aws可以白嫖一年,谷歌云通过绕过电话申请google账号,使用一张visa卡可以一直白嫖,相比而言香港的网络更好一些。

服务端启动开启端口监听即可

1
2
3
4
5
[common]
# 端口不使用默认,稍安全些
bind_port = 7001
# 日志等级调整为最小,方便debug
log_level = trace

内网设备

内网设备将端口映射出去,例如映射ssh端口

1
2
3
4
5
6
7
8
9
10
11
[common]
# 端口,或者域名,推荐使用域名,一年个位数,方便
server_addr = x.x.x.x
server_port = 7001

[ssh]
type = tcp
local_ip = 127.0.0.1
# 将本机22端口映射出去,映射成远端6000端口
local_port = 22
remote_port = 6000

其他设备即可通过公网地址的6000端口,ssh到内网服务器上。

一般云服务器厂商都带有默认防火墙,需要将上述70016000端口放开。

P2P

STCPSUDP 的 (S) 的含义是 Secret。其作用是为 TCPUDP 类型的服务提供一种安全访问的能力,避免让端口直接暴露在公网上导致任何人都能访问到。

这两种代理要求在被访问服务的机器上以及要访问的用户的机器上都部署上 frp 的客户端。被访问的服务所在机器叫做服务端,另一端叫做访问端。

frp 会在访问端监听一个端口和服务端的端口做映射。访问端的用户需要提供相同的密钥才能连接成功,从而保证安全性。

采用 P2P 的方式进行打洞穿透,如果成功,后续的流量将不会经过 frps,而是直接通信,不再受到 frps 所在服务器的带宽限制。

由于打洞成功率取决于所处网络的 NAT 类型,所以 XTCP 的可用性和稳定性无法保证。在需要可靠连接的情况下,建议使用 STCP 替代。

可以通过配置 fallbackstcp visitor 实现在打洞失败时,回退到 stcp 建立连接。

内网设备配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[common]
server_addr = x.x.x.x
server_port = 7001
# set up a new stun server if the default one is not available.
# nat_hole_stun_server = xxx

# 服务端名称
[p2p_ssh]
type = xtcp
sk = abc
local_ip = 127.0.0.1
local_port = 22

# stcp的服务名称
[stcp_ssh]
type = stcp
sk = abc
local_ip = 127.0.0.1
local_port = 22

客户端配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[common]
server_addr = x.x.x.x
server_port = 7001
# set up a new stun server if the default one is not available.
# nat_hole_stun_server = xxx

# 用于fallback
[stcp-visitor]
role = visitor
type = stcp
# 对应服务端stcp服务的名称
server_name = stcp_ssh
sk = abc
bind_port = -1

[xtcp-visitor]
role = visitor
type = xtcp
# 与服务端匹配
server_name = p2p_ssh
sk = abc
bind_addr = 127.0.0.1
# 客户端运行成功之后,通过ssh本地9002端口即可ssh到远端服务器上
bind_port = 9002
# 与上面的 stcp-visitor 匹配
fallback_to = stcp-visitor
fallback_timeout_ms = 200

当连接 127.0.0.1:9002 超过 200msp2p 打洞还未成功的话,会回退到使用 stcp-visitor 建立连接。fallback 后,之前触发的打洞操作仍然会继续,一般来说打洞完成需要的耗时会比较长。

如果打洞成功,下次建立新的连接时,将不需要再次打洞,会很快完成连接建立,不会触发 fallback

需要注意根据访问端和被访问端的延迟情况来合理设置超时时间,以避免超时时间太短,即使打洞成功连接也来不及建立,而一直触发 fallback

stcp-visitorbind_port 设置为 -1 表示不需要监听物理端口,只接受 fallback 的连接即可。

参考

总的来说,frp简单易用,高性能,支持多种平台。

更多使用姿势,可以参考 frp 官网。

https://gofrp.org/docs/reference/

如果映射ssh,最好关闭密码登录,仅保留密钥登录。

亲测,映射 mac 屏幕共享端口 5900 ,使用P2P无法成功连接,使用端口映射不安全。

来自 chatGPT

要屏蔽用户使用密码登录 SSH,并只允许使用密钥登录,你可以按照以下步骤进行设置:

  1. 使用超级用户或具有管理员权限的用户登录到 CentOS 服务器。

  2. 打开 SSH 配置文件 /etc/ssh/sshd_config,可以使用文本编辑器(如 vinano)进行编辑。

    1
    sudo vi /etc/ssh/sshd_config
  3. 在文件中找到 PasswordAuthentication 选项,并将其值改为 no,即禁用密码登录。

    1
    PasswordAuthentication no
  4. 确保 PubkeyAuthentication 选项的值为 yes,以启用密钥登录。

    1
    PubkeyAuthentication yes
  5. 保存并关闭文件。

  6. 重新加载 SSH 服务以应用更改。

    1
    sudo systemctl reload sshd

现在,只有配置了密钥的用户才能通过 SSH 登录到 CentOS 服务器,而密码登录将被禁用。

请确保在进行此操作之前,你已经为要允许的用户设置了 SSH 密钥,并且测试过密钥登录的功能。否则,你可能会被锁定在服务器上,无法通过 SSH 登录。

请注意,对于已经存在的用户,如果你想要禁用密码登录并只允许密钥登录,你可以在完成上述步骤后,确保这些用户的密码登录方式也被禁用。你可以使用以下命令将用户的密码字段设置为空,从而禁用密码登录:

1
sudo passwd -l <username>

<username> 替换为要禁用密码登录的用户的用户名。

这样,你就成功地屏蔽了用户的密码登录,只允许通过密钥登录到 CentOS 服务器。

WireGuard

WireGuard 是一种现代的开源VPN协议,旨在提供高性能、低延迟和简单易用的虚拟私人网络(VPN)解决方案。它被设计为轻量级、快速且安全的协议,适用于各种操作系统和设备。

以下是关于 WireGuard 的一些重要特点:

  1. 简单易用: WireGuard的设计目标之一是简化配置和使用过程。它采用了较少的代码和简洁的配置选项,使得部署和管理VPN变得更加容易。

  2. 高性能: WireGuard被设计为高性能的VPN协议。它采用了现代密码学算法和高效的内核实现,以提供快速的加密和解密操作,减少了网络延迟和资源消耗。

  3. 安全可靠: WireGuard使用了最新的加密算法,如Curve25519ChaCha20Poly1305HKDF,以提供强大的安全性。它还通过避免复杂的配置和减少攻击面来增加安全性。

  4. 跨平台支持: WireGuard可以在多个操作系统和设备上运行,包括LinuxWindowsmacOSAndroid和iOS等。这使得它非常适合用于构建跨平台的VPN解决方案。

  5. 动态路由: WireGuard支持动态路由,可以自动处理网络路由表的更新。这使得网络配置更加灵活,可以方便地添加或删除对等节点。

总的来说,WireGuard是一种简单、高效和安全的VPN协议,适用于构建虚拟私人网络。它已经得到了广泛的采用,并且在网络安全领域受到了积极的评价。

https://www.wireguard.com/

原理

WireGuardでVPNサーバーを構築してスマホやPCから接続する手順 | virtualiment

原理直白点说,就是通过服务端,将客户端1、客户端2使用channel连接成一个局域网,实现客户端1和客户端2之间P2P。

WireGuard - RouterOS - MikroTik Documentation

也可以在两台网关设备之间,通过P2P打通通道,实现两个内部局域网通过网关互联。一般家中有软路由担任网关的角色。

配置

对应平台有不同的安装方式,推荐查看官网:https://www.wireguard.com/install/

例如Centos 7 ,最简单的使用 RPM 安装

1
2
3
yum install epel-release elrepo-release
yum install yum-plugin-elrepo
yum install kmod-wireguard wireguard-tools

安装过程

推荐直接按照官网上的安装流程,生成 key,然后添加网口,copy and run

官网还有视频,真的很详细。

https://www.wireguard.com/quickstart/

image-20230824161159104

总结

WireGuard也是一个非常简单的P2P工具,支持多平台,相比 frp 安装稍微有些复杂。

frpWireGuard虽然都可以实现VPN,都有内网穿透的能力,但是实际上,在P2P上都不够好用,毕竟公网服务器增加带宽之后的价格很贵。

ZeroTier

ZeroTier是一种虚拟网络技术,它提供了一种简单、安全和高效的方式来创建和管理全球范围内的虚拟私有网络(VPN)。ZeroTier的主要优点包括以下几个方面:

  1. 简单易用: ZeroTier的配置和使用非常简单。只需在需要连接的设备上安装ZeroTier客户端,并加入相同的网络,即可实现设备之间的安全通信。与传统的VPN解决方案相比,ZeroTier的配置和管理更加简便。

  2. 全球覆盖: ZeroTier的网络可以跨越全球范围,无论设备位于何处,只要连接到互联网,就可以加入相同的ZeroTier网络。这使得ZeroTier非常适合需要跨地域连接的场景,如远程办公、分布式团队和多地点的服务器部署等。

  3. 安全性: ZeroTier使用端到端的加密来保护数据传输的安全性。所有的通信都经过加密,防止数据被窃听或篡改。此外,ZeroTier还提供了身份验证和访问控制机制,可以限制只有授权设备可以加入网络,增强网络的安全性。

  4. 低延迟: ZeroTier采用了一种优化的路由算法,可以在全球范围内实现低延迟的通信。这对于需要实时通信、对延迟敏感的应用程序(如游戏、视频会议等)非常重要。

  5. 跨平台支持: ZeroTier支持多个操作系统和平台,包括WindowsMacLinuxiOSAndroid等。这使得ZeroTier可以在各种设备上使用,并实现设备之间的互通。

总的来说,ZeroTier提供了一种简单、安全和高效的方式来创建全球范围内的虚拟私有网络。它的简单易用性、全球覆盖、安全性、低延迟和跨平台支持等优点使得ZeroTier成为一个受欢迎的虚拟网络解决方案。

相比较WireGuard而言,ZeroTier在使用上差别不大,但是ZeroTier有个优势,可以通过Moon节点优化网络,某些情况下可以让两个节点直接通过P2P通信

原理

ZeroTier - RouterOS - MikroTik Documentation

ZeroTier由以下几个组成部分构成,每个部分都扮演着特定的角色:

  1. ZeroTier Central: ZeroTier Central是ZeroTier的中央服务器,负责协调和管理ZeroTier网络。它维护了网络拓扑信息、设备身份验证和访问控制规则等。当设备加入ZeroTier网络时,它们会向ZeroTier Central注册,并获取网络配置信息。

  2. ZeroTier Node: ZeroTier Node是运行在每个设备上的ZeroTier客户端。它负责与ZeroTier Central进行通信,并处理网络连接和流量转发。ZeroTier Node会在设备上创建虚拟网络接口,将设备与ZeroTier网络连接起来。

  3. ZeroTier Network: ZeroTier Network是由ZeroTier Central管理的虚拟私有网络。它是一个全局唯一的网络标识符,由一个64位的网络ID表示。ZeroTier Network可以跨越全球范围,设备只需加入相同的ZeroTier Network,就可以在网络中进行通信。

  4. ZeroTier Address: ZeroTier Address是分配给设备的唯一标识符,类似于IP地址。ZeroTier Address由网络ID和设备ID组成,用于在ZeroTier网络中唯一标识设备。设备可以使用ZeroTier Address进行直接通信。

ZeroTier的工作原理如下:

  1. 设备加入网络: 设备上运行的ZeroTier Node会向ZeroTier Central注册,并请求加入特定的ZeroTier网络。ZeroTier Central会验证设备的身份,并分配一个唯一的ZeroTier Address给设备。

  2. 网络拓扑建立: ZeroTier Central维护了ZeroTier网络的拓扑信息,包括设备之间的连接关系。当设备加入网络后,ZeroTier Central会将设备的连接信息广播给其他设备,建立网络拓扑。

  3. 路由和转发: 当设备需要与其他设备通信时,ZeroTier Node会根据网络拓扑信息进行路由选择,并将数据包转发到目标设备。数据包在设备之间通过ZeroTier网络传输,保证了安全和加密。

  4. 加密和安全: ZeroTier使用端到端的加密来保护数据传输的安全性。数据包在设备之间进行加密和解密,防止数据被窃听或篡改。ZeroTier还提供了身份验证和访问控制机制,只有授权设备可以加入网络。

总的来说,ZeroTier通过ZeroTier Central协调和管理设备的连接,并通过ZeroTier Node在设备之间建立安全的虚拟网络通信。它的分布式架构和加密保护使得设备可以安全地在全球范围内进行通信。

节点类型:

  1. PLANET:PLANET节点是指ZeroTier网络中的中央服务器节点,也就是ZeroTier Central。它负责协调和管理整个ZeroTier网络,包括设备的注册、网络拓扑维护、身份验证和访问控制等。PLANET节点是ZeroTier网络的核心组成部分。

  2. MOON:MOON节点是指ZeroTier网络中的中继节点。MOON节点用于帮助设备在网络中建立连接,特别是在存在NAT(Network Address Translation)的情况下。MOON节点位于公共互联网上,可以充当设备间的中继,帮助数据包在设备之间进行转发。

  3. LEAF:LEAF节点是指ZeroTier网络中的终端设备节点。LEAF节点是最常见的节点类型,它可以是计算机、服务器、移动设备等各种终端设备。LEAF节点通过ZeroTier Node与ZeroTier网络连接,并参与网络通信。LEAF节点可以直接与其他LEAF节点通信,也可以通过MOON节点进行中继通信。

这些术语主要用于描述ZeroTier网络中不同节点的角色和功能。PLANET节点作为中央服务器负责管理整个网络,MOON节点提供中继功能,而LEAF节点则是网络中的终端设备节点。它们共同构成了ZeroTier网络的基础架构。

安装

为了优化网络,使用云主机作为中央服务器节点,因此需要在云主机上安装服务端。另外,Centos 7缺少库,推荐使用Debian/Ubuntu或者 Centos 8

CentOS 8 更换yum国内源

服务端安装zerotier

服务端一键安装

1
curl -s https://install.zerotier.com | sudo bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
#!/bin/bash
<<ENDOFSIGSTART=
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

ENDOFSIGSTART=

export PATH=/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin

#
# ZeroTier install script
#
# All this script does is determine your OS and/or distribution and then add the correct
# repository or download the correct package and install it. It then starts the service
# and prints your device's ZeroTier address.
#

# Base URL for download.zerotier.com tree; see https://github.com/zerotier/download.zerotier.com if you want to mirror.
# Some things want http, some https, so we must specify both. Must include trailing /
ZT_BASE_URL_HTTPS='https://download.zerotier.com/'
ZT_BASE_URL_HTTP='http://download.zerotier.com/'

echo
echo '*** ZeroTier Service Quick Install for Unix-like Systems'
echo
echo '*** Tested OSes / distributions:'
echo
echo '*** MacOS (10.13+) (just installs ZeroTier One.pkg)'
echo '*** Debian Linux (7+)'
echo '*** RedHat/CentOS Linux (6+)'
echo '*** Fedora Linux (16+)'
echo '*** SuSE Linux (12+)'
echo '*** Mint Linux (18+)'
echo
echo '*** Supported architectures vary by OS / distribution. We try to support'
echo '*** every system architecture supported by the target.'
echo
echo '*** Please report problems to [email protected] and we will try to fix.'
echo

SUDO=
if [ "$UID" != "0" ]; then
if [ -e /usr/bin/sudo -o -e /bin/sudo ]; then
SUDO=sudo
else
echo '*** This quick installer script requires root privileges.'
exit 0
fi
fi

# Detect MacOS and install .pkg file there
if [ -e /usr/bin/uname ]; then
if [ "`/usr/bin/uname -s`" = "Darwin" ]; then
echo '*** Detected MacOS / Darwin, downloading and installing Mac .pkg...'
$SUDO rm -f "/tmp/ZeroTier One.pkg"
curl -s ${ZT_BASE_URL_HTTPS}dist/ZeroTier%20One.pkg >"/tmp/ZeroTier One.pkg"
$SUDO installer -pkg "/tmp/ZeroTier One.pkg" -target /

echo
echo '*** Waiting for identity generation...'

while [ ! -f "/Library/Application Support/ZeroTier/One/identity.secret" ]; do
sleep 1
done

echo
echo "*** Success! You are connected to port `cat '/Library/Application Support/ZeroTier/One/identity.public' | cut -d : -f 1` of Earth's planetary smart switch."
echo

exit 0
fi
fi

# Detect already-installed on Linux
if [ -f /usr/sbin/zerotier-one ]; then
echo '*** ZeroTier appears to already be installed.'
exit 0
fi

rm -f /tmp/zt-gpg-key
echo '-----BEGIN PGP PUBLIC KEY BLOCK-----' >/tmp/zt-gpg-key
cat >>/tmp/zt-gpg-key << END_OF_KEY
Comment: GPGTools - https://gpgtools.org

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
=JgAv
END_OF_KEY
echo '-----END PGP PUBLIC KEY BLOCK-----' >>/tmp/zt-gpg-key

echo '*** Detecting Linux Distribution'
echo

if [ -f /etc/debian_version ]; then
dvers=`cat /etc/debian_version | cut -d '.' -f 1 | cut -d '/' -f 1`
$SUDO rm -f /tmp/zt-sources-list

if [ -f /etc/lsb-release -a -n "`cat /etc/lsb-release 2>/dev/null | grep -F -i LinuxMint`" ]; then
# Linux Mint -> Ubuntu 'xenial'
echo '*** Found Linux Mint, creating /etc/apt/sources.list.d/zerotier.list'
echo "deb ${ZT_BASE_URL_HTTP}debian/xenial xenial main" >/tmp/zt-sources-list
elif [ -f /etc/lsb-release -a -n "`cat /etc/lsb-release 2>/dev/null | grep -F trusty`" ]; then
# Ubuntu 'trusty'
echo '*** Found Ubuntu, creating /etc/apt/sources.list.d/zerotier.list'
echo "deb ${ZT_BASE_URL_HTTP}debian/trusty trusty main" >/tmp/zt-sources-list
elif [ -f /etc/lsb-release -a -n "`cat /etc/lsb-release 2>/dev/null | grep -F wily`" ]; then
# Ubuntu 'wily'
echo '*** Found Ubuntu, creating /etc/apt/sources.list.d/zerotier.list'
echo "deb ${ZT_BASE_URL_HTTP}debian/wily wily main" >/tmp/zt-sources-list
elif [ -f /etc/lsb-release -a -n "`cat /etc/lsb-release 2>/dev/null | grep -F xenial`" ]; then
# Ubuntu 'xenial'
echo '*** Found Ubuntu, creating /etc/apt/sources.list.d/zerotier.list'
echo "deb ${ZT_BASE_URL_HTTP}debian/xenial xenial main" >/tmp/zt-sources-list
elif [ -f /etc/lsb-release -a -n "`cat /etc/lsb-release 2>/dev/null | grep -F zesty`" ]; then
# Ubuntu 'zesty'
echo '*** Found Ubuntu, creating /etc/apt/sources.list.d/zerotier.list'
echo "deb ${ZT_BASE_URL_HTTP}debian/zesty zesty main" >/tmp/zt-sources-list
elif [ -f /etc/lsb-release -a -n "`cat /etc/lsb-release 2>/dev/null | grep -F precise`" ]; then
# Ubuntu 'precise'
echo '*** Found Ubuntu, creating /etc/apt/sources.list.d/zerotier.list'
echo "deb ${ZT_BASE_URL_HTTP}debian/precise precise main" >/tmp/zt-sources-list
elif [ -f /etc/lsb-release -a -n "`cat /etc/lsb-release 2>/dev/null | grep -F artful`" ]; then
# Ubuntu 'artful'
echo '*** Found Ubuntu, creating /etc/apt/sources.list.d/zerotier.list'
echo "deb ${ZT_BASE_URL_HTTP}debian/artful artful main" >/tmp/zt-sources-list
elif [ -f /etc/lsb-release -a -n "`cat /etc/lsb-release 2>/dev/null | grep -F bionic`" ]; then
# Ubuntu 'bionic'
echo '*** Found Ubuntu, creating /etc/apt/sources.list.d/zerotier.list'
echo "deb ${ZT_BASE_URL_HTTP}debian/bionic bionic main" >/tmp/zt-sources-list
elif [ -f /etc/lsb-release -a -n "`cat /etc/lsb-release 2>/dev/null | grep -F yakkety`" ]; then
# Ubuntu 'yakkety'
echo '*** Found Ubuntu, creating /etc/apt/sources.list.d/zerotier.list'
echo "deb ${ZT_BASE_URL_HTTP}debian/yakkety yakkety main" >/tmp/zt-sources-list
elif [ -f /etc/lsb-release -a -n "`cat /etc/lsb-release 2>/dev/null | grep -F disco`" ]; then
# Ubuntu 'disco'
echo '*** Found Ubuntu, creating /etc/apt/sources.list.d/zerotier.list'
echo "deb ${ZT_BASE_URL_HTTP}debian/disco disco main" >/tmp/zt-sources-list
elif [ -f /etc/lsb-release -a -n "`cat /etc/lsb-release 2>/dev/null | grep -F focal`" ]; then
# Ubuntu 'focal'
echo '*** Found Ubuntu, creating /etc/apt/sources.list.d/zerotier.list'
echo "deb ${ZT_BASE_URL_HTTP}debian/focal focal main" >/tmp/zt-sources-list
elif [ -f /etc/lsb-release -a -n "`cat /etc/lsb-release 2>/dev/null | grep -F hirsute`" ]; then
# Ubuntu 'hirsute'
echo '*** Found Ubuntu, creating /etc/apt/sources.list.d/zerotier.list'
echo "deb ${ZT_BASE_URL_HTTP}debian/bionic bionic main" >/tmp/zt-sources-list
elif [ -f /etc/lsb-release -a -n "`cat /etc/lsb-release 2>/dev/null | grep -F impish`" ]; then
# Ubuntu 'impish'
echo '*** Found Ubuntu, creating /etc/apt/sources.list.d/zerotier.list'
echo "deb ${ZT_BASE_URL_HTTP}debian/bionic bionic main" >/tmp/zt-sources-list
elif [ -f /etc/lsb-release -a '(' -n "`cat /etc/lsb-release 2>/dev/null | grep -F jammy`" -o -n "`cat /etc/lsb-release 2>/dev/null | grep -F kinetic`" ')' ]; then
# Ubuntu 'jammy' or 'kinetic'
echo '*** Found Ubuntu, creating /etc/apt/sources.list.d/zerotier.list'
echo "deb ${ZT_BASE_URL_HTTP}debian/jammy jammy main" >/tmp/zt-sources-list
elif [ "$dvers" = "6" -o "$dvers" = "squeeze" ]; then
# Debian 'squeeze'
echo '*** Found Debian, creating /etc/apt/sources.list.d/zerotier.list'
echo "deb ${ZT_BASE_URL_HTTP}debian/squeeze squeeze main" >/tmp/zt-sources-list
elif [ "$dvers" = "7" -o "$dvers" = "wheezy" ]; then
# Debian 'wheezy'
echo '*** Found Debian, creating /etc/apt/sources.list.d/zerotier.list'
echo "deb ${ZT_BASE_URL_HTTP}debian/wheezy wheezy main" >/tmp/zt-sources-list
elif [ "$dvers" = "8" -o "$dvers" = "jessie" ]; then
# Debian 'jessie'
echo '*** Found Debian, creating /etc/apt/sources.list.d/zerotier.list'
echo "deb ${ZT_BASE_URL_HTTP}debian/jessie jessie main" >/tmp/zt-sources-list
elif [ "$dvers" = "9" -o "$dvers" = "stretch" ]; then
# Debian 'stretch'
echo '*** Found Debian, creating /etc/apt/sources.list.d/zerotier.list'
echo "deb ${ZT_BASE_URL_HTTP}debian/stretch stretch main" >/tmp/zt-sources-list
elif [ "$dvers" = "10" -o "$dvers" = "buster" -o "$dvers" = "parrot" ]; then
# Debian 'buster'
echo '*** Found Debian, creating /etc/apt/sources.list.d/zerotier.list'
echo "deb ${ZT_BASE_URL_HTTP}debian/buster buster main" >/tmp/zt-sources-list
elif [ "$dvers" = "11" -o "$dvers" = "bullseye" ]; then
# Debian 'bullseye'
echo '*** Found Debian, creating /etc/apt/sources.list.d/zerotier.list'
echo "deb ${ZT_BASE_URL_HTTP}debian/bullseye bullseye main" >/tmp/zt-sources-list
elif [ "$dvers" = "12" -o "$dvers" = "bookworm" ]; then
# Debian 'bookworm'
echo '*** Found Debian, creating /etc/apt/sources.list.d/zerotier.list'
echo "deb ${ZT_BASE_URL_HTTP}debian/bookworm bookworm main" >/tmp/zt-sources-list
elif [ "$dvers" = "testing" -o "$dvers" = "sid" ]; then
# Debian 'testing', 'sid', and 'bookworm' -> Debian 'bookworm'
echo '*** Found Debian, creating /etc/apt/sources.list.d/zerotier.list'
echo "deb ${ZT_BASE_URL_HTTP}debian/bookworm bookworm main" >/tmp/zt-sources-list
else
# Use Debian "buster" for unrecognized Debians
echo '*** Found Debian or Debian derivative, creating /etc/apt/sources.list.d/zerotier.list'
echo "deb ${ZT_BASE_URL_HTTP}debian/buster buster main" >/tmp/zt-sources-list
fi

$SUDO apt-get update -y
$SUDO apt-get install -y gpg
$SUDO mv -f /tmp/zt-sources-list /etc/apt/sources.list.d/zerotier.list
$SUDO chown 0 /etc/apt/sources.list.d/zerotier.list
$SUDO chgrp 0 /etc/apt/sources.list.d/zerotier.list

$SUDO chmod a+r /tmp/zt-gpg-key
if [ -d /etc/apt/trusted.gpg.d ]; then
$SUDO gpg --dearmor < /tmp/zt-gpg-key > /etc/apt/trusted.gpg.d/zerotier-debian-package-key.gpg
else
$SUDO apt-key add /tmp/zt-gpg-key
fi
$SUDO rm -f /tmp/zt-gpg-key

echo
echo '*** Installing zerotier-one package...'

# Pre-1.1.6 Debian package did not properly enumerate its files, causing
# problems when we try to replace it. So just delete them to force.
if [ -d /var/lib/zerotier-one ]; then
$SUDO rm -f /etc/init.d/zerotier-one /etc/systemd/system/multi-user.target.wants/zerotier-one.service /var/lib/zerotier-one/zerotier-one /usr/local/bin/zerotier-cli /usr/bin/zerotier-cli /usr/local/bin/zero
fi

cat /dev/null | $SUDO apt-get update
cat /dev/null | $SUDO apt-get install -y zerotier-one
elif [ -f /etc/SuSE-release -o -f /etc/suse-release -o -f /etc/SUSE-brand -o -f /etc/SuSE-brand -o -f /etc/suse-brand ]; then
echo '*** Found SuSE, adding zypper YUM repo...'
cat /dev/null | $SUDO zypper addrepo -t YUM -g ${ZT_BASE_URL_HTTP}redhat/el/7 zerotier
cat /dev/null | $SUDO rpm --import /tmp/zt-gpg-key

echo
echo '*** Installing zeortier-one package...'

cat /dev/null | $SUDO zypper install -y zerotier-one
elif [ -d /etc/yum.repos.d ]; then
baseurl="${ZT_BASE_URL_HTTP}redhat/el/7"
if [ -n "`cat /etc/redhat-release 2>/dev/null | grep -i fedora`" ]; then
echo "*** Found Fedora, creating /etc/yum.repos.d/zerotier.repo"
fedora_release="`cat /etc/os-release | grep -F VERSION_ID= | cut -d = -f 2`"
if [ -n "$fedora_release" ]; then
baseurl="${ZT_BASE_URL_HTTP}redhat/fc/$fedora_release"
else
baseurl="${ZT_BASE_URL_HTTP}redhat/fc/22"
fi
elif [ -n "`cat /etc/redhat-release 2>/dev/null | grep -i centos`" -o -n "`cat /etc/redhat-release 2>/dev/null | grep -i enterprise`" -o -n "`cat /etc/redhat-release 2>/dev/null | grep -i rocky`" -o -n "`cat /etc/redhat-release 2>/dev/null | grep -i alma`" ]; then
echo "*** Found RHEL/CentOS/Rocky, creating /etc/yum.repos.d/zerotier.repo"
baseurl="${ZT_BASE_URL_HTTP}redhat/el/\$releasever"
elif [ -n "`cat /etc/system-release 2>/dev/null | grep -i amazon`" ]; then
echo "*** Found Amazon (CentOS/RHEL based), creating /etc/yum.repos.d/zerotier.repo"
if [ -n "`cat /etc/system-release 2>/dev/null | grep -F 'Amazon Linux 2'`" ]; then
baseurl="${ZT_BASE_URL_HTTP}redhat/el/7"
else
baseurl="${ZT_BASE_URL_HTTP}redhat/amzn1/2016.03"
fi
else
echo "*** Found unknown yum-based repo, using el/7, creating /etc/yum.repos.d/zerotier.repo"
fi

$SUDO rpm --import /tmp/zt-gpg-key

$SUDO rm -f /tmp/zerotier.repo
echo '[zerotier]' >/tmp/zerotier.repo
echo 'name=ZeroTier, Inc. RPM Release Repository' >>/tmp/zerotier.repo
echo "baseurl=$baseurl" >>/tmp/zerotier.repo
echo 'enabled=1' >>/tmp/zerotier.repo
echo 'gpgcheck=1' >>/tmp/zerotier.repo

$SUDO mv -f /tmp/zerotier.repo /etc/yum.repos.d/zerotier.repo
$SUDO chown 0 /etc/yum.repos.d/zerotier.repo
$SUDO chgrp 0 /etc/yum.repos.d/zerotier.repo

echo
echo '*** Installing ZeroTier service package...'

if [ -e /usr/bin/dnf ]; then
cat /dev/null | $SUDO dnf install -y zerotier-one
else
cat /dev/null | $SUDO yum install -y zerotier-one
fi
fi

$SUDO rm -f /tmp/zt-gpg-key

if [ ! -e /usr/sbin/zerotier-one ]; then
echo
echo '*** Package installation failed! Unfortunately there may not be a package'
echo '*** for your architecture or distribution. For the source go to:'
echo '*** https://github.com/zerotier/ZeroTierOne'
echo
exit 1
fi

echo
echo '*** Enabling and starting ZeroTier service...'

if [ -e /usr/bin/systemctl -o -e /usr/sbin/systemctl -o -e /sbin/systemctl -o -e /bin/systemctl ]; then
$SUDO systemctl enable zerotier-one
$SUDO systemctl start zerotier-one
if [ "$?" != "0" ]; then
echo
echo '*** Package installed but cannot start service! You may be in a Docker'
echo '*** container or using a non-standard init service.'
echo
exit 1
fi
else
if [ -e /sbin/update-rc.d -o -e /usr/sbin/update-rc.d -o -e /bin/update-rc.d -o -e /usr/bin/update-rc.d ]; then
$SUDO update-rc.d zerotier-one defaults
else
$SUDO chkconfig zerotier-one on
fi
$SUDO /etc/init.d/zerotier-one start
fi

echo
echo '*** Waiting for identity generation...'

while [ ! -f /var/lib/zerotier-one/identity.secret ]; do
sleep 1
done

echo
echo "*** Success! You are ZeroTier address [ `cat /var/lib/zerotier-one/identity.public | cut -d : -f 1` ]."
echo

exit 0
-----BEGIN PGP SIGNATURE-----

iQJJBAEBCAAzFiEEdKXpxFjhpDHx2lenFlcZiCPlKmEFAmSIt9YVHGNvbnRhY3RA
emVyb3RpZXIuY29tAAoJEBZXGYgj5SphFWIP/3krOq4kW89uYB/USiqbxeM7MRpu
7E6dy1UeM1EdtWs5u0m1XOY7W372/1KB5HF+DNM9PnsMGtwdnI5XQWEAIZU06SIg
p52n15ODeHkmK1tTXuNkKrIOT47UMvmygZei0MafgxtxXduRSPJKbYhuoSGU3gQN
5zOYZqPzuMqQTYun25tHJ40OouXdMzg14vt+c5NudcF3caxM+kqbXTEoufM/7gP0
eP1hM6e3lR+WeCrV89uOfDEUVuMkkaPohlbzwpWzY/46xHnSfkPi8BH4/sEpuNOc
YaV4ChBjNlcMgPlIYliCbJzmP/I0vegIS4AoEqRAlSF5ofrDBNGq6TsDek+qCHXr
dyXxfvdCPOcOL3xMWlNF3fl7yqPRxHdBQiZvIjTwhSI+zFmF4gMU2kuqZMbVycd6
QQfer7SlquABI9AE5lWBggn8pIG/kotge8rCKyfMWmggzAVvVGJA+uqfBtDgk+lv
Xafc+ZlNeE1TwB34b/m+S4oWIaVCG/mqHXGNq/Ngyl1uSUDCSY9fwyHBdzIGgZGC
t9vNvnmxJEsu6dlGRy5vAn9gnbxuradKQBIF2sPgin6GiG9txALVRWNoz/seGqFp
eGN0+AUfNTe1+f3CfzbUooiv6S+tdxNibTYZucWFPn1WJUGBKV36knhCoR64RZF1
Q2lrixzZnvjukh0w
=Uw+D
-----END PGP SIGNATURE-----

Centos 7可以直接安装。不同版本安装可能会有报错,通过脚本可以看到安装过程和步骤,可以根据实际情况手动执行脚本中的代码。

登录完之后,会显示,其中2aaxxx3就是本节点id

1
*** Success! You are ZeroTier address [ 2aaxxx3 ].

创建moon服务器

安装好了之后,导出moon配置文件

1
2
cd /var/lib/zerotier-one/
zerotier-idtool initmoon identity.public >> moon.json

修改配置文件,增加监听端口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vi moon.json

{
"id": "2aaxxx3",
"objtype": "world",
"roots": [
{
"identity": "2aaxxx3:0:3fba63xxxxxxxxxxxxeae818de0c2f0f75d6c6b2f6b9dd033",
"stableEndpoints": ["117.72.1x.xx/9993"], // 将公网IP写入,给外部访问
}
],
"signingKey": "e8264a853201808xxxxxxxxxxxxxxxxxxx3b2be0a75897c60e9",
"signingKey_SECRET": "13cb03exxxxxxxxxxxxxxxxa74d67c0e2e6",
"updatesMustBeSignedBy": "e8264axb2bxxxxxxxxxxxxxxxxxxxxxxxxxxxxe0a75897c60e9",
"worldType": "moon"
}

生成moon配置文件

1
zerotier-idtool genmoon moon.json
1
wrote 00002aaxxx3.moon (signed world with timestamp 1692869091229)

生成的00002aaxxx3.moon即是配置文件。

创建moons文件夹,并且将配置文件移动进去。

1
2
mkdir moons.d
cp 00002aaxxx3.moon moons.d/

重启服务

1
systemctl restart zerotier-one

查看当前zerotier状态

1
2
3
4
5
6
7
# zerotier-cli peers
200 peers
<ztaddr> <ver> <role> <lat> <link> <lastTX> <lastRX> <path>
62f865ae71 - PLANET 384 DIRECT -1 55388 50.7.252.138/9993
778cde7190 - PLANET 233 DIRECT -1 55539 103.195.103.66/9993
cafe04eba9 - PLANET 227 DIRECT -1 55545 84.17.53.155/9993
cafe9efeb9 - PLANET 159 DIRECT 764 55613 104.194.8.134/9993

rolePLANET代表这个节点是中央服务器节点,分布在公网。

加入到moons节点中

1
zerotier-cli orbit  2aaxxx3 2aaxxx3
1
200 orbit OK

重启服务

1
systemctl restart zerotier-one

再次查看,罗列moon

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# zerotier-cli listmoons
[
{
"id": "0000002axxx73",
"roots": [
{
"identity": "2axxx73:0:3fba6xxxc6b2f6b9dd033",
"stableEndpoints": [
"117.xx.xx.xx/9993"
]
}
],
"signature": "b8219xxxxx7e0bd2691c5bf",
"timestamp": 1692934814188,
"updatesMustBeSignedBy": "7ad27bx4fb973163969ff744e",
"waiting": false
}
]

服务端安装ztncui

控制节点往往网络状况不佳,因此需要搭建自己的控制器节点,并且配置moon

https://key-networks.com/ztncui/

按照官网脚本安装即可

1
2
3
4
5
6
7
8
9
10
curl -O https://s3-us-west-1.amazonaws.com/key-networks/deb/ztncui/1/x86_64/ztncui_0.8.13_amd64.deb
apt install ./ztncui_0.8.13_amd64.deb
sh -c "echo ZT_TOKEN=`sudo cat /var/lib/zerotier-one/authtoken.secret` > /opt/key-networks/ztncui/.env"
sh -c "echo HTTPS_PORT=3443 >> /opt/key-networks/ztncui/.env" // 开启HTTPS页面,可以忽略
sh -c "echo HTTP_ALL_INTERFACES=yes >> /opt/key-networks/ztncui/.env" // 监听所有网口,不加只能通过127.0.0.1:3000访问管理页面
sh -c "echo NODE_ENV=production >> /opt/key-networks/ztncui/.env"
chmod 400 /opt/key-networks/ztncui/.env
chown ztncui.ztncui /opt/key-networks/ztncui/.env
systemctl restart ztncui
systemctl enable ztncui

/var/log/messages里面会显示日志,Centos 7环境中可能会有以下报错,是由于没有GLIBCXX_3.4.20

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Aug 24 18:02:57 packer-tool1024 systemd: ztncui.service holdoff time over, scheduling restart.
Aug 24 18:02:57 packer-tool1024 systemd: Stopped ztncui - ZeroTier network controller user interface.
Aug 24 18:02:57 packer-tool1024 systemd: Started ztncui - ZeroTier network controller user interface.
Aug 24 18:02:58 packer-tool1024 ztncui: pkg/prelude/bootstrap.js:1876
Aug 24 18:02:58 packer-tool1024 ztncui: throw error;
Aug 24 18:02:58 packer-tool1024 ztncui: ^
Aug 24 18:02:58 packer-tool1024 ztncui: Error: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by /opt/key-networks/ztncui/node_modules/argon2/build/Release/argon2.node)
Aug 24 18:02:58 packer-tool1024 ztncui: at process.dlopen (pkg/prelude/bootstrap.js:2255:28)
Aug 24 18:02:58 packer-tool1024 ztncui: at Object.Module._extensions..node (node:internal/modules/cjs/loader:1189:18)
Aug 24 18:02:58 packer-tool1024 ztncui: at Module.load (node:internal/modules/cjs/loader:981:32)
Aug 24 18:02:58 packer-tool1024 ztncui: at Function.Module._load (node:internal/modules/cjs/loader:822:12)
Aug 24 18:02:58 packer-tool1024 ztncui: at Module.require (node:internal/modules/cjs/loader:1005:19)
Aug 24 18:02:58 packer-tool1024 ztncui: at Module.require (pkg/prelude/bootstrap.js:1855:31)
Aug 24 18:02:58 packer-tool1024 ztncui: at require (node:internal/modules/cjs/helpers:102:18)
Aug 24 18:02:58 packer-tool1024 ztncui: at bindings (/snapshot/src/node_modules/bindings/bindings.js:112:48)
Aug 24 18:02:58 packer-tool1024 ztncui: at Object.<anonymous> (/snapshot/src/node_modules/argon2/argon2.js:3:37)
Aug 24 18:02:58 packer-tool1024 ztncui: at Module._compile (pkg/prelude/bootstrap.js:1930:22) {
Aug 24 18:02:58 packer-tool1024 ztncui: code: 'ERR_DLOPEN_FAILED'
Aug 24 18:02:58 packer-tool1024 ztncui: }
Aug 24 18:02:58 packer-tool1024 systemd: ztncui.service: main process exited, code=exited, status=1/FAILURE
Aug 24 18:02:58 packer-tool1024 systemd: Unit ztncui.service entered failed state.
Aug 24 18:02:58 packer-tool1024 systemd: ztncui.service failed.
Aug 24 18:02:58 packer-tool1024 systemd: ztncui.service holdoff time over, scheduling restart.
Aug 24 18:02:58 packer-tool1024 systemd: Stopped ztncui - ZeroTier network controller user interface.
Aug 24 18:02:58 packer-tool1024 systemd: start request repeated too quickly for ztncui.service
Aug 24 18:02:58 packer-tool1024 systemd: Failed to start ztncui - ZeroTier network controller user interface.
Aug 24 18:02:58 packer-tool1024 systemd: Unit ztncui.service entered failed state.
Aug 24 18:02:58 packer-tool1024 systemd: ztncui.service failed.

解决方案:

  1. 自己编译,https://www.cnblogs.com/juedingsheng/p/15643394.html (解决过程需要编译,可能需要几个小时)

  2. 直接使用别人编译好的,https://oswu.cc/post/2022/09/hugo_libstdc/

    包地址:http://www.vuln.cn/wp-content/uploads/2019/08/libstdc.so_.6.0.26.zip,`wget`即可

查看服务状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# systemctl status ztncui
● ztncui.service - ztncui - ZeroTier network controller user interface
Loaded: loaded (/usr/lib/systemd/system/ztncui.service; enabled; vendor preset: disabled)
Active: active (running) since Fri 2023-08-25 09:59:23 CST; 3s ago
Docs: https://key-networks.com
Main PID: 6138 (ztncui)
CGroup: /system.slice/ztncui.service
└─6138 /opt/key-networks/ztncui/ztncui


Aug 25 09:59:23 lavm-8wb0f24x4j systemd[1]: Started ztncui - ZeroTier network controller user interface.
Aug 25 09:59:24 lavm-8wb0f24x4j ztncui[6138]: Warning: connect.session() MemoryStore is not
Aug 25 09:59:24 lavm-8wb0f24x4j ztncui[6138]: designed for a production environment, as it will leak
Aug 25 09:59:24 lavm-8wb0f24x4j ztncui[6138]: memory, and will not scale past a single process.
Aug 25 09:59:24 lavm-8wb0f24x4j ztncui[6138]: Listening for HTTP requests on port 3000 on localhost
Aug 25 09:59:24 lavm-8wb0f24x4j ztncui[6138]: Listening for HTTPS requests on port 3443 on all interfaces

从日志里面可以看到默认HPPT端口是3000,在云主机页面将3000端口开放防火墙,然后进入管理页面

默认用户名 admin,默认密码 password,登录之后,会默认 Set password

点击Add network

image-20230825103746719

点击 Easy setup,设置局域网内部IP

image-20230825103837954

直接随机生成内部网络配置,其实就是一个局域网。

踩坑:zerotier-one-1.12.0 版本有BUG,生成网络地址会出现BUG,会出现”Error resolving detail for network”之类的报错,使用次版本1.10.6即可。包可以在脚本中寻找对应链接,例如Centos 7地址:http://download.zerotier.com/redhat/el/7/。建议先跑完安装脚本,然后卸载`zerotier-one-1.12.0-1.el8.x86_64.rpm`,然后手动安装 zerotier-one-1.10.6-1.el7.x86_64.rpm,保持安装脚本的一致性。

网络正常的情况如下

image-20230825205928495

客户端加入网络

通过网络id,在客户端上加入到网络中

1
zerotier-cli join ebxxx0ef

查看网络

1
2
3
~ zerotier-cli listnetworks
200 listnetworks <nwid> <name> <mac> <status> <type> <dev> <ZT assigned ips>
200 listnetworks ebxxxxfc60ef ee:03:0d:8e:7d:1e ACCESS_DENIED PRIVATE feth4155 -

可以看到,现在状态是ACCESS_DENIED,网络类型是PRIVATE,网络设备是feth4155,通过命令也可以看到网络状态

1
2
3
4
5
6
7
~ ifconfig

feth4155: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 5000 mtu 2800
ether ee:03:0d:8e:7d:1e
peer: feth9155
media: autoselect
status: active

页面上点击授权

image-20230825210308076

再查看状态

1
2
3
4
5
6
7
8
9
10
~ ifconfig
feth4155: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 5000 mtu 2800
ether ee:03:0d:8e:7d:1e
inet 10.140.174.83 netmask 0xffffff00 broadcast 10.140.174.255
peer: feth9155
media: autoselect
status: active
~ zerotier-cli listnetworks
200 listnetworks <nwid> <name> <mac> <status> <type> <dev> <ZT assigned ips>
200 listnetworks ebcxxxxcef zero ee:03:0d:8e:7d:1e OK PRIVATE feth4155 10.140.174.83/24

客户端加入moon

客户上查看moons状态

1
2
~ zerotier-cli listmoons
[]

与节点命令一样,通过moon id,加入moon

1
zerotier-cli orbit ebxxxc93 ebxxxxec93

查看moon状态

1
~ zerotier-cli listmoons

与服务端上结果一致。

客户端上查看网络状态,与服务端一致,有互联上上公用的PLANET,也有搭建的MOON,客户端自身也作为LEAF在网络中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 服务端
# zerotier-cli peers
200 peers
<ztaddr> <ver> <role> <lat> <link> <lastTX> <lastRX> <path>
62f865ae71 - PLANET 376 DIRECT 11107 10734 50.7.252.138/9993
63xxxxxxd8 1.10.6 LEAF 35 DIRECT 4838 4838 117.143.173.43/12158
778cde7190 - PLANET 216 DIRECT 11107 10891 103.195.103.66/9993
cafe04eba9 - PLANET 242 DIRECT 11107 236125 84.17.53.155/9993
cafe9efeb9 - PLANET 154 DIRECT 1099 10953 104.194.8.134/9993

# 客户端
~ zerotier-cli peers
200 peers
<ztaddr> <ver> <role> <lat> <link> <lastTX> <lastRX> <path>
62f865ae71 - PLANET -1 RELAY
778cde7190 - PLANET 286 DIRECT 59080 211054 2605:9880:400:c3:254:f2bc:a1f7:19/9993
a8xxxxxx0a 1.12.0 LEAF 526 DIRECT 142826 142826 35.209.124.127/63767
cafe04eba9 - PLANET 247 DIRECT 59080 58558 2a02:6ea0:d405::9993/9993
cafe9efeb9 - PLANET -1 RELAY
exxxxxxx93 1.10.6 MOON 34 DIRECT 1444 1444 117.72.12.252/9993

其他

zerotier支持全平台,各个平台安装和配置在官网有详细教程,另外B站也有视频教程展示更多玩法。

推荐:https://www.bilibili.com/video/BV1Vh411F7Mr/

包含上述步骤,以及加入moon不成功时手动放置moon配置文件等方案。

这里补充一个,避免ztncui被外网访问,可以将ztncui也作为节点加入到网络,关闭云主机防火墙,这样只能内部访问,大大增加安全性。

在服务端,直接加入本网络

1
# zerotier-cli join ebxxxxxx60ef

总结

云平台使用内网穿透对比

穿透方案 阿里云1M杭州 京东云4M北京
frp 连接失败 正常,ssh也很快
WireGuard 都正常,但不快 都正常,但不快
ZeroTier 都正常,不快 都正常,有时候正常(怀疑此时建立P2P)

穿透方案对比

穿透方案 优势 劣势
frp 搭建部署简单 不安全,不支持vnc级别P2P
WireGuard UDP,安全 搭建有点麻烦
ZeroTier UDP,支持网页管理,小概率支持P2P 搭建麻烦,(有BUG,不稳定)

相比较而言,现在运营商对UDP约束挺大的,很容易触发QoS,因此最好的方式还是物理机VPN设备,直接连入家庭或者公司。