ZeroTier

ZeroTier 是 MikroTik RouterOS 的网络虚拟化引擎,通过以太网虚拟化和加密的点对点网络实现安全的跨网络设备连接。它支持游戏、LAN 访问、NAT 穿透和远程 Pi-Hole 管理,同时需要正确的 UDP 端口配置、NAT 类型选择以及最少的 NAT 层数才能实现可靠连接。

ZeroTier

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

MikroTik 已在 RouterOS v7.1rc2 中将 ZeroTier 作为面向 ARM/ARM64 架构的独立软件包添加。

使用场景

  • 在家中托管游戏服务器(适合仅限 LAN 的游戏)或与朋友创建 LAN 聚会。
  • 直接访问 NAT 后面的 LAN 设备。
  • 无需向互联网开放端口即可通过 SSH 访问 LAN 设备。
  • 通过互联网从任何地方使用你本地的 Pi-Hole 设置。

信息

ZeroTier 功能可能会被 device-mode 阻止。在配置 ZeroTier 之前,请确保在 system/device-mode 中已启用它。(更多信息)

视频教程

所需的网络配置

ZeroTier 使用哪些端口?

它监听 3 个 UDP 端口:

  • 9993 - 默认端口
  • 一个由你的 ZeroTier 地址派生出的随机高位端口
  • 一个用于 UPnP/NAT-PMP 映射的随机高位端口

这意味着你的 peers 可能监听任何端口。要直接与它们通信,你需要能够向它们的任意端口发送数据。

推荐的本地网络和互联网网关配置

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

  • 不要限制出站 UDP 流量。
  • 在网络中支持 UPnP 或 NAT-PMP 可以极大地提升性能,因为它允许 ZeroTier endpoint 映射外部端口并完全避免 NAT 穿透。
  • 推荐使用 IPv6,如果直连链路两端都支持,它可以极大地提高直接连接的可靠性。如果存在 IPv6,请在不使用 NAT 的情况下实现它(IPv6 不需要 NAT,且 NAT 会增加复杂性),并使用允许双向 UDP 会话的有状态防火墙。
  • 不要使用 "symmetric"(对称)NAT。请使用 "full cone" 或 "port restricted cone" NAT。对称 NAT 对点对点流量极为不利,会劣化 VoIP、视频聊天、游戏、WebRTC 以及许多其他协议,ZeroTier 也不例外。
  • ZeroTier endpoint 与互联网之间不应存在超过一层的 NAT。多层 NAT 会因不同层级之间状态和行为的混乱交互而引入连接不稳定性。不要使用双重 NAT。
  • NAT 设备的端口映射或连接超时不应短于 60 秒。
  • 每个 NAT 管理的外部 IP 地址后面的设备不应超过 16,000 台,以确保每台设备都能映射足够数量的端口。
  • 交换机和无线接入点应允许本地设备之间的直接本地流量。关闭任何 "local isolation"(本地隔离)功能。如果交换机允许更细粒度的控制,请允许与端口 9993 之间的本地 UDP 流量。

配置示例

ZeroTier 的设计目标是零配置 —— 你可以在不编写配置文件或不提供其他节点 IP 地址的情况下启动一个新节点。世界上任意两台设备几乎都能立即找到彼此并通信。以下示例在 RouterOS 设备上启用 ZeroTier,并将一部手机与 ZeroTier 应用程序连接起来。

  1. 在 my.zerotier.com 上注册并 Create A Network,获取 Network ID,在本例中为:1d71939404912b40。

  2. 下载并安装 ZeroTier NPK 软件包。你可以在 "Extra packages" 下找到它。将软件包上传到设备并重启。

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

    [admin@MikroTik] > /zerotier/enable zt1
    
  4. 添加一个新网络,指定你在 ZeroTier 云控制台中创建的网络 ID:

    [admin@mikrotik] /zerotier/interface/add network=1d71939404912b40 instance=zt1
    
  5. 验证 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   
    
  6. 你可能需要允许从 ZeroTier 接口到你的路由器,以及可选的到其他 LAN 接口的连接:

    /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
    
  7. 在你的智能手机或计算机上安装 ZeroTier 客户端。按照 ZeroTier 手册连接到同一网络。

  8. 如果 "Access Control" 设置为 "Private",你必须在节点成为成员之前对其进行授权:

  9. [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 云控制台中指定到特定内部子网的路由,以确保你从其他设备连接时能够访问这些网络。

Controller

RouterOS 以实现节点的角色提供 ZeroTier 功能,其中大部分网络配置必须在 ZeroTier 网页仪表板上完成。但是,如果你希望在自己的设备上完成所有配置,RouterOS 也支持托管你自己的 controller。

一个常见的误解是把网络 controller 与 root servers(planet 和 moons)混为一谈。Root servers 是在 VL1 层 运行的连接促进者。网络 controller 是属于 VL2 层 的配置管理者和证书颁发机构。通常,root servers 不加入或控制虚拟网络,而网络 controller 不是 root servers,不过一个节点也有可能同时承担两者。

每个 ZeroTier 实例都有一个自托管的网络 controller,可用于托管虚拟网络。controller 负责接纳成员加入网络,并颁发包括证书在内的默认配置信息。理论上 controller 可以托管多达 2^24 个网络并服务数百万台设备,但你应该将大量网络分散到多个 controller 上,以实现负载均衡和容错。

Controller 在 /zerotier/controller 菜单中配置。

配置示例

本示例使用 RouterOS 内置的 ZeroTier controller 向新网络主机发送合适的证书、凭据和配置信息。controller 在 "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 层的 controller 部分创建一个新网络。每个网络都有自己的 controller,每个网络 ID 由 controller 地址和 controller 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

在 interface 部分下添加新网络:

[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

每个新 peer 都会请求 controller 加入网络。在这种情况下,状态为 ACCESS_DENIED,并且必须对 peer 进行授权,因为使用了 private=yes 选项。

授权后,网络中的每个成员都会从 controller 收到有关新 peer 的信息以及与它们交换数据包的批准:

[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 设备上的配置。启用默认实例并请求 controller 加入 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 Home" 设备上对新 peer 进行授权。之后,验证从 controller 收到的 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. 从笔记本电脑的 ZeroTier 应用程序加入 879c0b5265a99e4b 网络。
  2. 使用 ZeroTier 移动应用加入 879c0b5265a99e4b 网络。

警告

所有其他新主机也必须在 /zerotier/controller/member/ 部分中进行授权。