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