介绍

ZeroTier 网络管理程序是一个自包含的网络虚拟化引擎,它实现了一个类似于 VXLAN 的以太网虚拟化层,构建在加密安全的全局点对点网络之上。它提供了与企业SDN交换机相当的高级网络虚拟化和管理功能,但跨越局域网和广域网,并连接几乎任何类型的应用程序或设备。

microtik已经将ZeroTier作为一个单独的包添加到RouterOS v7.1rc2中,用于 ARM/ARM64 架构。

等等,那我能用它做什么?

  • 在家里托管一个游戏服务器(对局域网游戏很有用),或者和你的朋友一起创建一个局域网派对;

  • 直接访问NAT后的局域网设备;

  • 通过SSH访问局域网设备,而不打开连接互联网的端口;

  • 使用本地Pi-Hole设置从任何地方通过互联网;

视频教程

必要的网络配置

ZeroTier使用哪些端口?

它监听三个3 UDP端口:

  • 9993—默认值

  • 从您的零层地址中派生的随机高编号端口

  • 一个随机的高编号端口,用于UPnP/NAT-PMP映射

这意味着你的对等体可以在任何端口上监听。要直接与它们对话,您需要能够将它们发送到任何端口。

推荐配置本地网络和外网网关

这些ZeroTier推荐的指南与绝大多数使用商品网关和接入点的典型部署一致:

  • 不限制UDP出方向流量。

—在您的网络中支持UPnP或NAT- pmp可以通过允许ZeroTier端点映射外部端口并完全避免NAT穿越来极大地提高性能。

  • 建议使用IPv6协议,如果直连链路两端都支持IPv6协议,可以大大提高直连链路的可靠性。如果存在,它应该在没有NAT的情况下实现(NAT对于IPv6来说是完全不必要的,只会增加复杂性),并使用允许双向UDP会话的有状态防火墙。

  • 不要使用“对称”NAT。使用“全锥”或“端口限制锥”NAT。对称NAT对点对点流量非常不利,并且会降低VoIP,视频聊天,游戏,WebRTC和许多其他协议以及ZeroTier。

  • 零层端点与Internet之间的NAT不能超过一层。多层NAT由于不同层间状态和行为的混乱交互,导致连接不稳定。禁止双重NAT

  • nat的端口映射或连接超时时间不小于60秒。

  • 每个nat管理的外部IP地址后面的设备数量不超过16000台,以保证每个设备映射的端口数量充足。

  • 交换机和无线接入点应允许本地设备之间的直接本地通信。关闭任何“本地隔离”功能。有些交换机可能允许更细粒度的控制,在这些交换机上,允许本地UDP流量进出9993(或一般情况下)就足够了。

配置示例

缺省情况下,ZeroTier被设计为零配置。用户无需编写配置文件或提供其他节点的IP地址即可启动新的ZeroTier节点。它的设计也是为了快速。世界上任何两台设备都应该能够相互定位并几乎立即通信,所以下面的例子将在RouterOS设备上启用ZeroTier,并使用ZeroTier应用程序连接一台手机。

  1. 注册 my.zerotier.com 并创建网络,获取Network ID,本例中为:1d71939404912b40;

  1. 下载 并在RouterOS中安装ZeroTier NPK包,您可以在“Extra packages”下找到,将包上传到设备并重启设备;

  2. 启用默认的(官方的)ZeroTier实例:

[admin@mikrotik] > zerotier/enable zt1

  1. 添加一个新网络,指定你在ZeroTier云控制台中创建的网络ID:

[admin@mikrotik] zerotier/interface/add network=1d71939404912b40 instance=zt1

  1. 验证ZeroTier配置:

[admin@MikroTik] > zerotier/interface/print
Flags: R - RUNNING
Columns: NAME, MAC-ADDRESS, NETWORK, NETWORK-NAME, STATUS
#   NAME       MAC-ADDRESS        NETWORK           NETWORK-NAME     STATUS
0 R zerotier1  42:AC:0D:0F:C6:F6  1d71939404912b40  modest_metcalfe  OK
  1. 现在需要允许从ZeroTier接口连接到路由器,以及可选连接到其他局域网接口:

/ip firewall filter add action=accept chain=forward in-interface=zerotier1 place-before=0
/ip firewall filter add action=accept chain=input in-interface=zerotier1 place-before=0
  1. 在您的智能手机或计算机上安装ZeroTier客户端,按照ZeroTier手册了解如何从那里连接到相同的网络。

  2. 当Access Control设置为Private时,需要对节点进行授权才能成为成员:

[admin@MikroTik] > ip/address/print where interface~"zero"
Flags: D - DYNAMIC
Columns: ADDRESS, NETWORK, INTERFACE
#   ADDRESS             NETWORK        INTERFACE
3 D 192.168.192.105/24  192.168.192.0  zerotier1

[admin@MikroTik] > ping 192.168.192.252 count=3
SEQ HOST                                     SIZE TTL TIME       STATUS
0 192.168.192.252                            56  64 407us
1 192.168.192.252                            56  64 452us
2 192.168.192.252                            56  64 451us
sent=3 received=3 packet-loss=0% min-rtt=407us avg-rtt=436us max-rtt=452us

您应该在 ZeroTier云控制台 中指定到特定内部子网的路由,以确保从其他设备连接时可以访问这些网络。

zerotier/peer/

ZeroTier的peer是一个信息部分,其中包含您的节点所知道的节点列表。节点之间不能相互通信,除非它们在同一网络上加入并获得授权。

[admin@Home] > zerotier/peer/print
Columns: INSTANCE, ZT-ADDRESS, LATENCY, ROLE, PATH
# INSTANCE  ZT-ADDRESS  LATENCY  ROLE    PATH
0 zt1       61d294b9cb  186ms    PLANET  active,preferred,50.7.73.34/9993,recvd:4s526ms
1 zt1       62f865ae71  270ms    PLANET  active,preferred,50.7.252.138/9993,recvd:4s440ms,sent:9s766ms
2 zt1       778cde7190  132ms    PLANET  active,preferred,103.195.103.66/9993,recvd:4s579ms,sent:9s766ms
3 zt1       992fcf1db7  34ms     PLANET  active,preferred,195.181.173.159/9993,recvd:4s675ms,sent:4s712ms
4 zt1       159924d630  130ms    LEAF    active,preferred,34.121.192.xx/21002,recvd:3s990ms,sent:3s990ms

参数

[admin@MikroTik] > zerotier/

属性 说明
name (s_tring_;default:zt1) 实例名。
port (number; default: 9993) 实例监听的端口号。
identity (string;default) 实例40位唯一地址。
interface (string;default: all) 使用ARP和IP类型连接发现零层对等体的接口列表。
route-distance (number;default:1) 从行星/月球服务器获得的路由距离。

[admin@MikroTik] > zerotier/interface/

属性 说明
allow-default (string;yes | no) 网络可以覆盖系统默认路由(强制VPN模式)。
allow-global (string;yes | no) ZeroTier IP地址和路由可以重叠。
allow-managed (string;yes | no) ZeroTier管理IP地址和路由分配。
arp-timeout (number;default: auto) ARP超时值。
comment (string;Default:) 接口的描述性注释。
copy-from 允许复制现有接口配置。
disable-running-check (string;yes | no) 强制界面处于“running”状态。
instance (string;Default:zt1) ZeroTier实例名。
name (s_tring_;default: zerotier1) 短名称。
network (string;Default) 16位网络ID。

控制器

RouterOS以节点的角色实现了ZeroTier功能,其中大多数网络配置必须在ZeroTier网页仪表板上完成。然而,在你希望在自己的设备上完成所有配置的情况下,RouterOS可以为你提供自己的控制器

一个常见的误解是将网络控制器与根服务器(行星和卫星)混为一谈。根服务器是在 VL1级别 运行的连接促进器。网络控制器是属于 VL2级别 的配置管理器和证书颁发机构。一般来说,根服务器不加入或控制虚拟网络,网络控制器也不是根服务器,尽管节点可以同时执行这两项任务。

/zerotier/controller/

每个ZeroTier实例都有一个可用于托管虚拟网络的自托管网络控制器。控制器负责允许成员进入网络,并发布包括证书在内的默认配置信息。理论上,控制器可以承载多达2^24个网络,并为数百万(或更多)设备提供服务,但出于负载平衡和容错的原因,我们建议将大量网络分布在许多控制器上。

参数

属性 说明
broadcast  ( yes| no; Default: yes) 允许接收广播(FF:FF:FF:FF:FF:FF)报文。
comment (string;Default:) 控制器的描述性注释。
copy-from (string;Default:) 复制现有项。它从另一个项目中获取新项目属性的默认值。如果不想进行精确的复制,可以为某些属性指定新值。当复制有名称的项时,通常需要为副本指定一个新名称。
instance (string;Default:zt1) ZeroTier实例名。
ip-range (ip;Default:) IP范围,例如,172.16.16.1-172.16.16.254。
ip6-6plane (yes | no;Default:no) 一个选项为/40网络中的每个成员提供/80,但使用NDP仿真将_all_ ip路由到该/80下的所有者。“6plane”模式对于像Docker这样的用例来说是非常好的,因为它允许每个成员在其/80范围内分配IPv6地址,这些地址在网络上即时和全局地工作。
ip6-rfc4193 (yes | no;Default:no) _rfc4193_模式在/88网络上为每个成员提供/128。
ip6-range (IPv6 ;Default:) IPv6范围,for example fd00:feed:feed:beef::-fd00:feed:feed:beef:ffff:ffff:ffff:ffff:ffff。
mtu (integer; Default:2800) 网络mtu。
multicast-limit (integer: Default: 32) 组播报文的最大接收方。
name (string;Default:) 该控制器的短名称。
network (string;Default) 16位网络ID。
private (yes | no;Default:yes) 启用访问控制。
routes (IP@GW; Default: ) 按以下格式推送路由:
Routes ::= Route[,Routes]
  Route ::= Dst[@Gw]

配置示例

在下面的示例中,将使用RouterOS内置的ZeroTier控制器向新网络主机发送适当的证书、凭据和配置信息。控制器将从“RouterOS Home”设备操作,我们将加入我们的网络3个单元:手机,笔记本电脑,RouterOS Office设备,理论上可以在一个网络中加入多达100个设备。

RouterOS Home

首先启用在 VL1 级别运行的默认实例:

[admin@Home] /zerotier> print
Columns: NAME, PORT, IDENTITY.PUBLIC
# NAME  PORT  IDENTITY.PUBLIC
;;; ZeroTier Central controller - https://my.zerotier.com/
0 zt1   9993  879c0b5265:0:d5fd2d17805e011d9b93ce8779385e427c8f405e520eea9284809d8444de0335a817xxb21aa4ba153bfbc229ca34d94e08de96d925a4aaa19b252da546693a28

现在通过控制器部分创建一个新的网络,该网络将在 VL2 级别上运行。每个网络都有自己的控制器,每个网络ID由控制器地址和控制器ID组合生成。

注意,使用 private=yes 选项来获得更安全的网络:

[admin@Home] /zerotier> controller/add name=ZT-private instance=zt1 ip-range=172.27.27.10-172.27.27.20 private=yes routes=172.27.27.0/24
[admin@Home] /zerotier> controller/print
Columns: INSTANCE, NAME, NETWORK, PRIVATE
# INSTANCE  NAME        NETWORK           PRIVATE
0 zt1       ZT-private  879c0b5265a99e4b  yes

在接口部分下添加新网络:

[admin@Home] /zerotier> interface/add network=879c0b5265a99e4b name=myZeroTier instance=zt1
[admin@Home] /zerotier> interface/print interval=1
Columns: NAME, MAC-ADDRESS, NETWORK, STATUS
# NAME        MAC-ADDRESS        NETWORK           STATUS
0 myZeroTier  4A:19:35:6E:00:6E  879c0b5265a99e4b  ACCESS_DENIED

每个新的对等体都要求一个控制器加入网络,在这种情况下,我们有ACCESS_DENIED状态,我们必须授权一个新的对等体,这是因为我们使用了 private=yes 选项。

授权后,网络中的每个成员从控制器接收到新的对等体的信息,并批准他们可以与它们交换数据包:

[admin@Home] /zerotier> controller/member/print
Columns: NETWORK, ZT-ADDRESS
#  NETWORK     ZT-ADDRESS
0  ZT-private  879a0b5265
[admin@Home] /zerotier> controller/member/set 0 authorized=yes

验证新配置的IP地址和路由:

[admin@Home] /zerotier> /ip/address/print where interface~"Zero"
Flags: D - DYNAMIC
Columns: ADDRESS, NETWORK, INTERFACE
#   ADDRESS          NETWORK      INTERFACE
4 D 172.27.27.15/24  172.27.27.0  myZeroTier

[admin@Home] /zerotier> /ip/route/pr where gateway~"Zero"
Flags: D - DYNAMIC; A - ACTIVE; c, y - COPY
Columns: DST-ADDRESS, GATEWAY, DISTANCE
    DST-ADDRESS     GATEWAY     DISTANCE
DAc 172.27.27.0/24  myZeroTier         0

RouterOS Office

Office设备侧配置。启用默认实例,并请求控制器加入879c0b5265a99e4b网络:

[admin@office] /zerotier> interface/add network=879c0b5265a99e4b instance=zt1 name=ZT-interface
[admin@office] /zerotier> interface/print interval=1
Columns: NAME, MAC-ADDRESS, NETWORK, STATUS
# NAME          MAC-ADDRESS        NETWORK           STATUS
0 ZT-interface  4A:40:1C:38:97:BA  879c0b5265a99e4b  ACCESS_DENIED

和前面一样,因为网络是私有的,必须通过“RouterOS主设备”来授权一个新的对等体。然后验证从控制器接收到的IP地址和路由:

[admin@Home] /zerotier> controller/member/print
Flags: A - AUTHORIZED
Columns: NETWORK, ZT-ADDRESS, IP-ADDRESS, LAST-SEEN
#    NETWORK     ZT-ADDRESS  IP-ADDRESS    LAST-SEEN
0 A  ZT-private  879a0b5265  172.27.27.15
1 A  ZT-private  554a914c7f  172.27.27.17
2 A  ZT-private  a83ac6032a  172.27.27.10
3    ZT-private  deba5dc5b1  172.27.27.13  3s348ms
[admin@Home] /zerotier> controller/member/set 3 authorized=yes
[admin@Home] /zerotier> controller/member/print
Flags: A - AUTHORIZED
Columns: NETWORK, ZT-ADDRESS, IP-ADDRESS, LAST-SEEN
#    NETWORK     ZT-ADDRESS  IP-ADDRESS    LAST-SEEN
0 A  ZT-private  879a0b5265  172.27.27.15
1 A  ZT-private  554a914c7f  172.27.27.17
2 A  ZT-private  a83ac6032a  172.27.27.10
3 A  ZT-private  deba5dc5b1  172.27.27.13  4s55ms

通过ZeroTier验证获得的IP地址和路由:

[admin@office] /zerotier> /ip/address/print where interface~"ZT"
Flags: D - DYNAMIC
Columns: ADDRESS, NETWORK, INTERFACE
#   ADDRESS          NETWORK      INTERFACE
0 D 172.27.27.13/24  172.27.27.0  ZT-interface

[admin@office] /zerotier> /ip/route/print where gateway~"ZT"
Flags: D - DYNAMIC; A - ACTIVE; c, y - COPY
Columns: DST-ADDRESS, GATEWAY, DISTANCE
    DST-ADDRESS     GATEWAY       DISTANCE
DAc 172.27.27.0/24  ZT-interface         0

其他设备

为您的手机或电脑 下载ZeroTier应用程序 ,并加入新创建的网络:

  1. 通过Laptop ZeroTier应用程序,加入了879c0b5265a99e4b网络;

  2. 用户Zerotier手机app加入879c0b5265a99e4b网络;

此外,必须在 /zerotier/controller/member/ 下授权所有其他新主机。