Lxn-Chan!

(~ ̄▽ ̄)→))* ̄▽ ̄*)o

基于 Wireguard 的广域网组网工具 Netmaker。

目前发现了更好的方案,Netmaker 这篇文章将有可能不再更新。
如果有问题可以在下方留言。
新的方案:【Headscale】自部署 Tailscale 服务端

Netmaker 是什么

Netmaker 是一个开源的、基于 WireGuard 的网络(overlay network) 控制工具,可以非常快速的用来组建 WireGuard 网络。

如果你有两台连接互联网的设备,那么 Netmaker 可以组建一个安全的网络,并打通一个安全的隧道提供给两台机器通信。而如果你有数千台机器分布在不同的地区,不同的数据中心,不同的网络中,那么 Netmaker 也可以组建一个网络来提供给这些不同的节点通信。

如果熟悉 AWS,那么 Netmaker 就像 VPC 一样,不过 Netmaker 可以应用在任意的机器中。从 Netmaker 网络中的机器来看,同一个网络中的机器尽管在世界各地,但其相互通信就像是在同一个局域网中一样。

Netmaker 和其他一些产品非常相似,比如 Tailscale, ZeroTier,Nebula 但不同于这些产品的是,Netmaker 连接更快,更加灵活。Netmaker 使用 WireGuard 所以更快,Netmaker 中的节点不管是服务端还是Agent都完全可配置,所以提供了更大的灵活性。

Netmaker 优于 Tailscale 的地方还在于 ,Netmaker 不需要 Google, Microsoft 或者 GitHub 账号。Netmaker 可以认为是一个可以自行托管的 Tailscale。

总述

  1. 本文基于Ubuntu 20.04 LTS版本(特殊说明除外),架构x86_64,无论是服务端还是客户端都需要拥有完全的root权限。
  2. 请以官方文档为主要参考对象,跨多个版本的 Netmaker 可能有不同的配置方法,本文更新时间请看标题下方,截至本文发出时间最新版本为Netmaker 0.12.0
  3. Netmaker 默认需要占用80/443/53/51821-518XX端口,请尽量不要在该服务器上再配置HTTP服务,可能会造成端口冲突和部署失败。
  4. 本文是快速入门的解决方法,需要用到Docker,当然也有直装版本的,如果之后有时间会再写一篇直装版 应该是不会再写了,目前Headscale足够稳定了。
  5. 请先通篇阅读本文并基本熟知操作流程后(或在虚拟机等环境上实际操作后)再应用到生产环境!
  6. 受限于网络问题,中国大陆可能无法正确配置,原因可能是无法访问部分API,该问题官方已经在处理中,若有新动向会在此更新。

准备

官方文档中对 Netmaker 服务端要求如下:

  1. 静态公网IP;
  2. 最低1C1G(推荐2C4G,本文实验配置2C2G),2G空闲存储空间;
  3. Ubuntu 20.04;
  4. Oracle Cloud 不行(具体原因自行查询官方文档)。

另外还要求有一个能更改 DNS 记录的域名。

配置域名

将服务器的IP解析到你域名的通配符上。

主机记录记录类型记录值TTL
A你的服务器IP*.你的域名
A1.1.1.1*.netmaker.yourdomain.com

Caddy会创建三个子域名:dashboard.netmaker.yourdomain.com / api.netmaker.yourdomain.com /
grpc.netmaker.yourdomain.com

原则上讲应该直接将如上三个域名直接解析到服务器IP也是可行的,但是我没试过。

安装服务端

准备

最好准备一个新的文件夹用于存放 Netmaker 的相关安装和配置文件。

安装Docker

1
apt update&&apt install -y docker.io docker-compose wireguard

有关Docker换源相关内容可以查看本人之前的内容镜像加速源

开通防火墙

类型端口号来源作用
TCP80ALL申请R3证书
TCP443ALL控制台、API、gRPC
UDP51821-51830ALL业务端口
从51821开始,你想有几条隧道就到多少
TCP+UDP53ALLCoreDNS(可选)

获取必要信息

  1. 服务器 Interface IP(通常是个局域网IP);
  2. 你刚才绑定的域名:例如你做的通配符解析是*.netmaker.yourname.com,则这一步获取的值为netmaker.yourname.com
  3. 服务器的公网IP;
  4. 随机获取一段随机字符串:
1
tr -dc A-Za-z0-9 </dev/urandom | head -c 30 ; echo ''

准备 Netmaker

获得docker-compose.yml文件:

1
wget -O docker-compose.yml https://raw.githubusercontent.com/gravitl/netmaker/master/compose/docker-compose.contained.yml

修改信息:

1
2
3
4
sed -i 's/COREDNS_IP/<Interface IP(1)>/g' docker-compose.yml
sed -i 's/NETMAKER_BASE_DOMAIN/<域名(2)>/g' docker-compose.yml
sed -i 's/SERVER_PUBLIC_IP/<公网IP(3)>/g' docker-compose.yml
sed -i 's/REPLACE_MASTER_KEY/<随机字符串(4)>/g' docker-compose.yml

准备 Caddy

1
2
3
4
wget -O /root/Caddyfile https://raw.githubusercontent.com/gravitl/netmaker/master/docker/Caddyfile

sed -i 's/NETMAKER_BASE_DOMAIN/<域名(2)>/g' /root/Caddyfile
sed -i 's/YOUR_EMAIL/<你的E-mail地址>/g' /root/Caddyfile

准备 MQ 配置文件

1
wget -O /root/mosquitto.conf https://raw.githubusercontent.com/gravitl/netmaker/master/docker/mosquitto.conf

运行

1
sudo docker-compose up -d

然后打开dashboard.<域名(2)>以便在WebUI上新建管理员账户和设置密码并自动完成剩余操作。

第一个在WebUI创建的账户会被默认分配管理员权限并可控制全部Mesh网络。
如担心安全问题可以在创建完第一个管理员账户后再将443端口开放。

如果遇到错误可以执行docker logs netmaker查看log。

创建网络

进入控制台后在主页点击Networks,然后默认会有创建好一个网络,不建议直接用。

右上角点击Create Network,输入Network Name(网路名称)和Address Range(IPv4)(IPv4地址范围),打开下方的UDP Hole Punching(UDP打洞),其余保持默认,千万不要打开Is Point to Site,如果有双栈需求可以把双栈也打开。

如果你没有很多设备在该网络内组网且不知道如何配置子网范围,可以采用官方文档建议的地址范围:

  • 10.11.12.0/24
  • 10.20.30.0/24
  • 100.99.98.0/24

关于子网地址查询,可以使用由V2ex提供的实用小工具:IPv4 子网查询

创建 Access Key

点进刚才创建的网络,上方切换到Access Key选项卡,右上角Create Access Key创建新Key,左侧输入可选的名称,右侧输入Key的使用次数。

之后会跳出来Viewing your New Access Key Details展示你的Key和Token等信息,千万不要直接点其他的地方关闭该窗口,也不要泄露这些信息,将Access KeyAccess Token妥善保存后方可关闭。

根据官方文档描述该Key窗口仅显示一次,之后不会再显示,但是经过测试可以通过点击Key的名字重新展示。

配置客户端(官方文档方案)

这部分内容仅摘引官方文档并简单翻译,可能不具备实际可操作性。

Windows

在刚才创建Access Key的窗口中将Windows (PowerShell Admin)项的内容复制出来,然后在Windows系统上以管理员权限运行PowerShell,在PowerShell中运行刚才复制出来的命令即可自动安装Netclient。

macOS/Linux

在刚才创建Access Key的窗口中将Linux, FreeBSD, Mac项的内容复制出来,然后在Linux或MacOS上以root权限运行该命令即可自动安装。

Docker

适用于Linux操作系统

在刚才创建Access Key的窗口中将Docker项的内容复制出来,然后在Linux上运行该命令即可自动应用镜像。

卸载客户端

  • 离开Mesh网络:
1
2
3
4
# Linux & macOS
sudo netclient leave -n default
# Windows (Powershell)
netclient leave -n default
  • 彻底卸载Netclient:
1
sudo rm -rf /etc/netclient

手动配置客户端

由于中国大陆区域网络环境和网络政策造成的通信不良,可能以上的客户端配置方案全部或部分失效。
经过测试确认失效的包括:Windows(未知错误)、Mac(没有支持)。

基本的思路就是先安装Systemd(Linux)和Wireguard(全平台),然后运行 netclient 的二进制文件进行自动配置。

macOS

Release 页面下载含有darwin字样的二进制文件到本地;然后安装 Wireguard 。

输入chmod +x netclient-darwin附加可执行属性。

取出上上步保存的Access Token,并在Terminal输入:

1
sudo ./netclient-darwin join -t <Access Token>

Windows

【提示】:该小节的所有操作都是在管理员权限模式的PowerShell下进行的,并非命令提示符!

首先也是需要安装 WireGuard ,然后正常安装即可。

接下来下载 netclient 二进制文件,下载地址

然后在PowerShell中输入:

1
.\netclient join -t <Access Token>

然后回到 Dashboard ,查看“Nodes”项目是否有新增的设备并且后面有绿色的HEALTHY字样。

Linux

这一小节的操作以 Ubuntu 22.04 LTS Server Edition 为例;
Linux 内核版本:5.15.0-25-generic

也适用于OpenWRT等嵌入式系统,下载二进制文件时注意架构即可。

安装Systemd和Wireguard:

1
sudo apt install -y wireguard systemd

接下来下载 netclient 二进制文件,下载地址 ,复制链接然后使用curlwget下载到客户机上。

然后运行即可:

1
2
3
4
# 附加可执行属性
chmod +x netclient
# 会自动安装 Service
sudo ./netclient join -t <Access Token>

将不支持的客户端连接到 Mesh 网络

在 Netmaker 中的 Mesh Network 框架中,所有的设备都应该是一个 Node (节点),但目前仍然有部分设备不被 Netmaker 官方所支持,这些不被支持的操作系统包括iOS、Android等,但仍有“曲线救国”的方式连接到 Mesh 网络。

基本的思路就是通过把某个 Node 作为出口,然后不支持的设备通过连接到某个 Node 从而连接到整个 Mesh Network 。这个方案还挺不 Mesh 的,因为其余 Node 无法和通过某一 Node 连接的设备进行通信(参考NAT)。官方说将来会更新以上不支持设备的客户端,但目前还是不支持的。

创建 Node 出口和外部设备

任一 Node 均可,出口可以不止一个,一般来说要求有公网IP即可。

在 Dashboard 首页点击Nodes,然后找到你想作为出口的 Node ,再找到Ingress Status列,点击后会显示询问是否将该 Node 作为出口,点接受后查看对应列是否有变成绿色对号即可。

再打开侧边栏,选择Ext.Clients,上方选择 Mesh 网络,然后找到某一出口 Node ,点击对应行的加号,右侧Client就会新增一行,此时再按照下面不同操作系统配置即可。一个Client对应一个客户端

Android

在 Google Play 下载 Wireguard 客户端,打开后在右下角点击加号,点击扫描二维码,在刚才新创建的Client条目上点击QR Code,在手机上扫描这个二维码即可将网络添加到 Android 设备上。

iOS

在 App Store 下载 Wireguard 客户端,右上角加号,扫描二维码,在刚才新创建的Client条目上点击QR Code,在手机上扫描这个二维码即可将网络添加到 iOS 设备上。

Windows/macOS

这里并不是 Netmaker 官方不支持,而是另外的一种连接方式
强烈不建议通过这种方式连接,原因上面已经说过了。

在刚才创建Client后右侧点击Download Client Configuration,打开 Wireguard 主界面后在左下角点击新建隧道或加号右侧的小箭头,选择从文件导入隧道,导入刚才下载的conf文件即可。

总结

Wireguard 是一个非常新但非常有前景的隧道穿透和加密技术。Netmaker 现在的平台稳定性总体不如 Tailscale ,某些操作系统目前也不被官方所支持,总的来说配置很繁琐,在中国大陆区域还有可能因为网络问题导致无法下载必要的文件。目前不建议实际应用于生产环境。

除错

Node 界面显示“ERROR”或“WARNING”

按照规则,如果某个设备5分钟未向服务器发送心跳包则变为“WARNING”,30分钟以上未发送心跳包则变为“ERROR”。

在 Wireguard 中查看日志,一般都是因为心跳包发送失败造成的,在WiFi环境下就很容易心跳包发送失败。官方文档中特别提到此处不显示Healthy不代表实际设备连接的稳定性。

无法连接后端

配置Docker的时候就有问题,重装即可。

网络问题

由于中国大陆区域无法访问部分文件和部分API,因此在此列出可能需要提前下载或采取措施的文件列表。

Docker换源不在此列表内

【因CDN问题暂不更新,视情况开放】。

位置或作用源地址代理地址
未开放未开放未开放

版权声明

本文由本站作者所创作,未经许可请勿转载

“转载”包括全文转载或部分转载,如需要引用请联系我。

这篇文章真的耗费了我很多心血、时间和财力物力,在中文互联网几乎没有关于 Netmaker 的参考资料,就算有也是很旧的版本了。如果还对您有那么一点帮助,请帮助我推广一下我的小站就好,如果财力雄厚也可以看一下网站侧栏的赞助,非常感谢。

参考内容

排名不分先后;
以下文章在引用时均已被 Internet Archive 收录留档。

 简单说两句



联系站长 | 安装证书 | 友情链接

备案号:辽ICP备19013963号

萌ICP备 20219421 号

中国互联网违法和不良信息举报中心

架构版本号:8.0.10 | 本站已全面支持IPv6

本站由又拍云提供CDN加速服务和存储服务

正在载入运行数据(1/2)请稍后...
正在载入运行数据(2/2)请稍后...

Copyright 2022 LingXuanNing, All rights reserved.