WireGuard 系列文章(五):Netmaker 简介 - 创建和管理 WireGuard 网络的平台

本文最后更新于:2024年7月24日 晚上

系列文章前情提要:

  1. WireGuard 系列文章(一):什么是 VPN
  2. WireGuard 系列文章(二):WireGuard 简介 - 快速、现代、安全的 VPN 隧道
  3. WireGuard 系列文章(三):WireGuard 安装
  4. WireGuard 系列文章(四):WireGuard 快速上手

Netmaker 是一个使用 WireGuard 创建和管理快速、安全和动态虚拟 overlay 网络的平台。

关于 Netmaker

什么是 Netmaker?

Netmaker 是创建和管理虚拟 overlay 网络的工具。如果您至少有两台机器与互联网接入,您需要连接到一个安全的隧道,Netmaker 将为您服务。如果您有成千上万的服务器分布在多个位置、数据中心或云上,Netmaker 也适合您。无论机器在哪里,Netmaker 都能安全地连接它们。

Netmaker 使用这些机器并创建了一个平面(flat)网络,这样它们就可以轻松安全地相互通话。如果你熟悉 AWS,它就像一个 VPC,但是由任意的计算机组成。从机器的角度来看,所有这些其他的机器都在同一个街区,即使它们分布在世界各地。

让 Netmaker 与众不同的是它的速度和灵活性。Netmaker 更快,因为它使用内核 WireGuard。它更加动态,因为服务器和代理是完全可配置的,这使您可以处理各种不同的用例。

如何使用 Netmaker?

依靠 WireGuard 在机器之间创建通道。Netmaker 的核心是管理跨机器的 WireGuard,以创建合理的网络。从技术上讲,Netmaker 是两个东西:

  • 管理服务器,称为 Netmaker
  • Agent,称为 Netclient

作为网络管理服务器,您与服务器交互以创建和管理网络和设备。服务器持有这些网络和设备的配置,这些配置可以由 netclients (agent) 检索。

Netclient 安装在任何你想添加到给定网络的机器上,无论这台机器是虚拟机、服务器还是物联网设备。Netclient 与服务器联系,服务器告诉它应该如何配置网络。通过在许多机器上同时进行这些操作,我们创建了一个动态的、完全可配置的虚拟网络。

Netmaker 服务器通常不路由流量。否则,这将是一个中心辐射(hub-and-spoke)模型,这是非常慢的。相反,Netmaker 只是告诉网络上的机器它们如何能够直接到达彼此。这就是所谓的 全网状(full mesh)网络,速度要快得多。即使服务器宕机,只要现有的机器没有实质性的改变,你的网络仍然可以正常运行。

🧠 备注

Netmaker 之于 WireGuard,类似于 Istio 之于 Envoy。
Netmaker 是控制面,负责帮你创建、管理和控制 Wireguard 的所有复杂的网络配置。
WireGuard 是数据面,负责具体的网络流量路由。

而这也是我们决定使用 Netmaker 的原因:帮助我们从管理 WireGuard 配置,使我们从复杂的 WireGuard 配置中解放出来。

Netmaker 架构

Netmaker 架构

Netmaker 核心概念

WireGuard

就不用过多介绍了。这是真正的工作核心。

Mesh 网络

即 Full mesh:

Netmaker Full Mesh

更多细节参见:全网状网络(Full mesh)

网状网络通常比其他拓扑结构更快,但是建立起来也更复杂。WireGuard 本身提供了在设备之间创建加密隧道的方法,但是它没有提供建立完整网络的方法。这就是 Netmaker 的用武之地。

Netmaker

Netmaker 是一个基于 WireGuard 的平台,它允许用户在他们的设备之间创建网状网络。Netmaker 可以根据用例创建 完全 部分的网状网络

Netmaker 做了很多工作来为您设置配置,这样您就不必设置配置了。这包括像 WireGuard 端口 (port)、端点 (endpoint)、公共 ip(public ip)、密钥和对等节点(peer)之类的内容。Netmaker 的工作就是尽可能抽象网络管理,这样你就可以简单地点击创建网络,点击添加机器到网络就可以完成网络的创建工作。也就是说,每台机器(节点)是不同的,可能需要特殊的配置。这就是为什么 Netmaker 设置了实用的默认设置,而 Netmaker 中的所有内容都是完全可配置的。

Node

Netmaker 网络中由 Netclient 管理的机器称为 Node,正如您将在 UI 中看到的那样。Node 可以是一个虚拟机、一个裸机服务器、一台台式计算机、一台物联网设备,或者安装了 netclient 的任何其他连接到互联网的机器。节点只是网络中的一个端点,它可以向所有其他节点发送流量,并接收来自所有其他节点的流量。

🧠 备注

Netmaker 的 node 就是 WireGuard 的 Peer/Node/Device,只不过在该 node 上,除了安装有 wireguard 之外,还会安装有 netclient。

SystemD

就是 Linux 系统中常见的 SystemD。

Netmaker 的 netclient (控制所有节点上的网络的 agent) 可以作为 CLI 或系统守护进程运行。在 Linux 上,默认情况下它作为守护进程运行,这需要 systemd。随着 Netmaker 的发展,systemd 将成为可能的服务管理选项之一,允许 netclient 在更广泛的设备上运行。但是,就目前而言,netclient 应该在不运行 systemd 的系统上运行「 unmanaged」(netclient join-daemon=off) ,其他一些方法可以像 cron job 或自定义脚本一样使用。

🧠 备注

比如我的 NAS 没有 SystemD,那么就需要 netclient join-daemon=off,同时需要配置 crontab 以实现定时 checkin

在 0.8 版本中,Mac 和 Windows 都得到了支持。在这些操作系统上,netclient 分别使用 LaunchD 和 windowsservice 启动守护进程,而不是使用 SystemD。

Netmaker 组件

Netmaker Server

Netmaker 服务器的核心是一个 golang 二进制文件。源代码可以在 GitHub 上找到。二进制文件本身可以为大多数系统编译。如果您需要在一个特定的系统上运行 Netmaker 服务器,那么它很可能可以正常工作。在典型的部署中,它作为一个 Docker 容器运行。它也可以作为一个 systemd 服务运行。

Netmaker 服务器充当前端的 API,以及网络中计算机的 GRPC 服务器。GRPC 比标准的 API 调用更快、更高效,这提高了事务的速度。出于这个原因,Netmaker 服务器公开了两个端口:API 的默认端口是 8081,GRPC 的默认端口是 50051。

Netmaker 网络模式包括客户端模式和 dns 模式。这两者中的任何一个都可以被禁用,但默认情况下是启用的。客户端模式允许您将 Netmaker 主机(操作系统)视为网络节点,安装 netclient 并控制主机网络。DNS 模式具有 coreddns 的服务器写配置设置,这是一个单独的组件和 nameserver,它选择配置设置来管理节点 DNS。

Netmaker 服务器与 sqlite (默认)、 postgres 或者作为其数据库的分布式版本 sqlite 进行交互。这个 DB 保存有关节点、网络、用户和其他重要数据的信息。此数据是配置数据。在大多数情况下,Netmaker 向 Nodes 提供配置数据,告诉它们应该如何配置自己。Netclient 是实际执行该配置的 agent。

Netclient

Netclient 的核心是一个 golang 二进制文件。源代码可以在 Netmaker GitHub Repository 的 netclient 文件夹 中找到。二进制文件本身可以为大多数系统编译。但是,这个二进制文件被设计用来管理一定数量的操作系统。从 0.8 版本开始,netclient 可以作为 linux 发行版上使用 systemd 的系统守护进程运行,也可以作为非 systemd 发行版上的「 unmanaged」客户端运行。Windows 和 Mac 的 netclient 将分别作为 Windows 服务或 LaunchDaemon 运行。

Netclient 通过一个简单的 bash 脚本安装,该脚本提取最新的二进制文件并运行 registerjoin 命令。

命令将一个 WireGuard 隧道直接添加到 netmaker server,用于所有后续的通信。

join 命令试图使用合理的默认值将机器添加到 Netmaker 网络中,可以使用配置文件或环境变量覆盖默认值。假设 netclient 有一个有效的密钥(或者网络允许手动注册节点) ,它将被注册到 Netmaker 网络,并返回必要的配置细节,以便如何设置其本地网络。

Netclient 然后设置系统守护进程(如果在守护进程模式下运行) ,并配置 WireGuard。所以首先应该 安装好 Wireguard

如果在守护进程模式下运行,netclient 将定期执行 check in (签到或签入)。它将通过服务器进行身份验证,并检查网络中是否有任何更改。如果有的话,它也会发布关于它自己的本地配置的更改。如果发生了更改,服务器将返回新的配置,netclient 将重新配置网络。如果不在守护进程模式下运行,则由操作人员手动执行签入 (netclient checkin-n <network name>)。

签入过程允许 Netmaker 创建动态网状网络。在网络上添加、删除和修改节点时,会通知其他节点,并进行适当的更改。

数据库 (sqlite、 rsqlite、 postgres)

在 v0.8 中,Netmaker 默认使用 sqlite 作为数据库。它也可以使用 PostgreSQL 或 rsqlite,一个分布式 (RAFT 共识)数据库。Netmaker 与此数据库交互,以存储和检索关于节点、网络和用户的信息。

对于特殊用例,额外的数据库支持(除了 sqlite 和 rsqlite) 非常容易实现。Netmaker 使用简单的 键值 查找来运行网络,而且数据库设计为可扩展的,因此可以通过更改单个文件来支持键值存储和其他基于 sql 的数据库。

Netmaker UI

Netmaker UI 是一个基于 reactjs 的静态网站,可以在标准的 web 服务器上运行,比如 Nginx 或 Caddy。源代码可以在 这里 找到。在典型的配置中,Netmaker UI 作为 Docker 容器在 Caddy 上运行。

🧠 备注

Caddy 是一个新流行的基于 go 的 web server,自动化(比如自动申请并配置 SSL 证书)、简单、好用,这里挖个坑,后续有空补个 Caddy 的介绍文章。

Netmaker 可以在没有用户界面的情况下完全使用,但是用户界面使得大多数用户的使用变得更加容易。它有一个合理的流程和布局,用于管理网络、节点、访问密钥和 DNS。

CoreDNS

Netmaker 允许用户为他们的节点提供和管理私有 DNS。这需要一个 nameserver,而 coredns 是被选中作为 nameserver。coredns 是轻量级的,可扩展的。coredns 从一个由 Netmaker 管理的简单文件加载 DNS 设置,并为托管节点提供 DNS 信息。DNS 可能很复杂,目前只有少数设备支持 DNS 管理,特别是那些运行 systemd-resolved 的设备。但是,Netmaker CoreDNS 实例可以手动作为 nameserver 添加到其他设备。DNS 模式也可以关闭。

External Client 外部客户端

外部客户端只是一个手动配置的到你的网络的 WireGuard 连接,Netmaker 帮助管理。

大多数机器都能运行 WireGuard。建立到单个端点的 WireGuard 连接相当简单。但是建立网状网络和其他拓扑,如站点到站点变得复杂。

Mac、 Windows 和 Linux 由 Netclient 直接处理。

Netmaker 可以发出「外部客户端」来处理当前与 netclient 不兼容的任何设备,包括 iPhone、 Android 和一些 Unix 发行版。随着时间的推移,这个列表将被删除,甚至可能不需要外部客户端。

外部客户端通过「入口网关」(Ingress Gateway,可以简单理解为 WireGuard 的中继服务器)连接到 Netmaker 网络,该网关为给定的节点配置,允许流量流入网络。

Netmaker 技术流程

下面是 Netmaker 内部通信流程的一个 high level、一步一步的概述(假设 Netmaker 已经安装) :

  1. 管理员创建一个带有子网的新网络,例如 10.10.10.0/24
  2. 管理员创建一个用于注册新节点的访问密钥
  3. 上述两个请求都是通过前端的 API 调用路由到服务器的
  4. 管理员在任何给定的节点 (机器) 上运行 netclient 安装脚本
  5. Netclient 解码密钥,其中包含 GRPC 服务器位置和端口
  6. Netclient 使用信息注册并连接到 GRPC 服务器的 WireGuard 通道
  7. Netclient 检索 / 设置本地信息,包括用于 WireGuard 的开放端口、公共 IP 和为对等节点生成密钥对
  8. Netclient 通过访问密钥向 GRPC 服务器提供此信息进行身份验证。
  9. Netmaker 服务器验证信息并创建节点,为任何缺失的信息设置默认值。
  10. 为网络设置时间戳(参见 #16)。
  11. Netmaker 返回设置作为对 netclient 的响应。可以根据网络添加或修改某些设置。
  12. Netclient 接收响应。如果成功,它将从 Netmaker 返回任何附加信息并配置本地系统 /WireGuard
  13. Netclient 向 Netmaker 的 GRPC 服务器发送另一个请求,这次是为了检索对等点列表(网络中的所有其他客户端)。
  14. Netmaker 发回节点列表,包括网络中所有节点的当前已知配置。
  15. Netclient 使用这些信息配置 WireGuard。此时,节点已经完全配置为网络的一部分,应该能够通过私有地址到达其他节点。
  16. Netclient 启动守护进程 (system timer) 来运行到服务器的签入。它等待更改,报告本地更改,并从网络中的任何其他节点检索更改。
  17. 网络上的其他 netclients 在与 Netmaker 服务器签入时,将看到时间戳已经更新,它们将检索一个新的对等点列表,完成更新周期。

参考链接