在前言部分就提到了netmaker,官网首页口号就是你的统一的全互联网络平台,听着挺诱人的哈~综合考虑下来,其实同类的产品项目其实挺多的,比如OpenVPN、ZeroTier等~netmaker可以视作wireguard的管理层面的东西,所以这一套的mesh组网本质就是wireguard,因此wireguard的优势将完全保留。wireguard还是个年轻的项目,依然存在着争议与不足,但是几天使用下来确实还是挺香的~毕竟简介里面有for homelab口号加成!关于wg的介绍,不少都是从这里https://fuckcloudnative.io/了解的,有兴趣大家也去看看。

部署netmaker server

官方提供了多种部署方式,包括docker、裸金属服务器部署、集群部署,也有高可用的解决方案,本次计划只是homelab,所以直接选择一台服务器使用docker-compose进行部署。

部署基本需求

需求来自官方文档,有些不是必须的,推荐有的如下:

  1. 静态独立IP
  2. 至少1G内存,1核CPU
  3. 已备案域名(也不是必须,但是有最好)

安装

DNS设置

在服务器的云解析设置一个泛解析即可:*.netmaker.example.com ==> IP

软件

根据系统自行安装docker、docker-compose、wireguard

防火墙

开放443、53\tcp、53\udp、51821-51830\udp

安装netmaker

由于云服务器的IP一般是内网IP,获取实际ip,以供CoreDNS使用:

1
ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'
  • CoreDNS可以不部署,官网有说明,但是建议部署

获取docker-compose文件并进行修改:

1
2
3
4
wget -O docker-compose.yml https://raw.githubusercontent.com/gravitl/netmaker/develop/compose/docker-compose.caddy.yml
sed -i 's/NETMAKER_BASE_DOMAIN/<your base domain>/g' docker-compose.yml
sed -i 's/SERVER_PUBLIC_IP/<your server ip>/g' docker-compose.yml
sed -i 's/COREDNS_IP/<default interface ip>/g' docker-compose.yml
  • NETMAKER_BASE_DOMAIN就是上面的通配符域名,即netmaker.example.com
  • COREDNS_IP就是服务器的内网IP

删除这个docker-compose.yml文件里关于caddy的部分(包括两个卷申明),另外用docker-compose启动一个caddy容器对API进行代理。Caddyfile配置如下:

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

sed -i 's/NETMAKER_BASE_DOMAIN/<your base domain>/g' Caddyfile
sed -i 's/YOUR_EMAIL/<your email>/g' Caddyfile

如果不使用域名以及TLS,需要自己额外配置(将域名全部换成SERVER_PUBLIC_IP:PORT

建立网络并加入Client

建立网络

设置网络IP范围即可,可以选择IPv4和IPv6双栈,其他选择一般默认即可,列表里就有了新建的网络

image-20211106193942522

此时NODES里面只有一个节点,就是NETMAKER本身。

ACCESS KEYS内为这个网络新建一个KEY,记下生成的TOKEN

Client加入与配置

登陆Node节点,在https://github.com/gravitl/netmaker/releases/tag/latest/下载合适的netclient客户端,用如下命令加入网络

1
sudo ./netclient join -t TOKEN

显示成功就可以了,dashboard上也会出现对应节点

image-20211106194626106

对于具备静态公网IP的节点,需要如图修改设置

image-20211106195103944

对于无公网IP的节点,关闭Is Static,打开UDP Hole Punching即可。其他的IP等也可以按需求修改。

验证

  • m01-k3s:杭州机房阿里云节点,有公网IP
  • s01-k3s:上海机房腾讯云节点,有公网IP
  • s02-k3s:南京内网节点,无公网IP

两个具备公网IP之间的节点互相ping:

image-20211106200218545

内网节点ping公网节点:

image-20211106200340516

可以看到,与内网节点之间的通信确实还存在丢包现象,不过不是很明显,延迟还是挺漂亮的,毕竟低成本Homelab~并且后面在这些节点上配置k3s也并没有被网络影响。

注意事项

  1. 2C1G的服务器出现过一次OOM,导致netmaker全部被kill,平时内存占用一般也不过600M,为了防止再发生直接设置了2G的虚拟内存。
  2. netmaker容器重启后会新增一个netmaker节点,新的这个状态正常,老的那个还是重启前的节点信息并且一般是warning状态,直接把老的删除即可,感觉这是个bug?
  3. 如果netmaker挂了,似乎并不会影响已经加入网络的那些node的工作。
  4. 开启了UDP打洞的节点,wg会随机使用UDP端口进行内网穿透,所以防火墙需要注意。设置静态IP的节点,一般就用51821,即节点设置的Listen Port。