通过 Netmaker 配置 WireGuard 跨 VPC 组网

介绍

最近云服务商做活动,手里云主机又多了一个,国内的有三台了,可以组个 k8s 集群了。本文介绍如何跨 VPC 组网,机器情况如下。

hostname外网ip内网ipos
ten-162.234.xxx.xxx172.21.0.1CentOS 7.6
ten-282.156.xxx.xxx10.0.8.1CentOS 7.9
ten-381.70.xxx.xxx10.0.24.1CentOS 7.6
MacBook--Darwin 10.15.6
  • WireGuard 是由 C 语言写的开源 VPN 方案。概括来讲更快、更简单、更安全,Linux 内核 5.6 版本开始自带。且支持全平台。
  • Netmaker 是一个可视化操作工具,方便我们对 WrireGuard 的配置管理,相比于直接写配置,当节点多起来会便捷不少。

简单说下运行流程,Netmaker 分服务端和客户端,客户端是 netclient。我们在 Netmaker 上创建虚拟网络,然后在想要加入网络的节点上通过 netclient 加入。Netmaker 会对加入网络的节点自动同步 WireGuard 的配置信息,创建相应的路由规则,之后节点与节点之间的通信直接进行。
本文只是介绍了一部分 Netmaker 功能,更多内容请看 Netmaker 官方文档

为了方便 CentOS 内核都已升级至 5.16,自带了 WireGuard。升级内核教程很多就不多说了。

Netmaker 部署

ten-1 上先创建所需目录

1
2
$ mkdir -p /etc/netclient/config
$ mkdir -p /data/netmaker

直接容器化部署,compose yml 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
version: "3.4"

services:
netmaker:
container_name: netmaker
image: gravitl/netmaker:v0.9.4
volumes:
- /etc/netclient/config:/etc/netclient/config
- dnsconfig:/root/config/dnsconfig
- /usr/bin/wg:/usr/bin/wg
- /data/netmaker:/root/data
cap_add:
- NET_ADMIN
restart: always
network_mode: host
environment:
SERVER_HOST: "SERVER_PUBLIC_IP"
COREDNS_ADDR: "SERVER_PUBLIC_IP"
GRPC_SSL: "off"
DNS_MODE: "on" # dns 不需要直接 off 把下面 coredns 部分也注释
CLIENT_MODE: "on" # 开启 CLIENT_MODE 则默认将 netmaker server 也当做网络节点
API_PORT: "8081" # 记得在服务器安全策略或防火墙上对该端口放行
GRPC_PORT: "50051" # 记得在服务器安全策略或防火墙上对该端口放行
SERVER_GRPC_WIREGUARD: "off"
CORS_ALLOWED_ORIGIN: "*"
DATABASE: "sqlite"
netmaker-ui:
container_name: netmaker-ui
depends_on:
- netmaker
image: gravitl/netmaker-ui:v0.9.4
links:
- "netmaker:api"
ports:
- "127.0.0.1:8082:80" # 如果你没有域名直接用公网ip就改成 "80:80"
environment:
BACKEND_URL: "https://api.NETMAKER_BASE_DOMAIN" # 无证书用http,如果你没有域名直接用公网ip就改成 "http://SERVER_PUBLIC_IP:8081"
restart: always
coredns:
depends_on:
- netmaker
image: coredns/coredns
command: -conf /root/dnsconfig/Corefile
container_name: coredns
restart: always
network_mode: host
volumes:
- dnsconfig:/root/dnsconfig
volumes:
dnsconfig: {}

更多参数配置请参考

如果你是直接用公网ip方式访问 netmaker ui 那直接把注释说明的地方修改下跑起来就可以进入下一节了。

启动

如果你使用域名访问,可以参考下我的方案。
首先解析域名 api.NETMAKER_BASE_DOMAINdashboard.NETMAKER_BASE_DOMAINten-1
然后我使用 Traefik 将域名 dashboard.NETMAKER_BASE_DOMAIN 反代 netmaker ui 也就是 127.0.0.1:8082。你可以参考官网选择 Caddy 或 Nginx。
Traefik 配置就不贴了,之前文章写过很多次。

Netmaker 创建网络

打开 Netmaker UI,首次打开会创建一个用户,然后登录。

Dashboard

  • Networks 虚拟网络管理
  • Nodes 节点管理,Ingress 和 Egress 网关配置等。
  • Access Keys 密钥管理
  • External Clients 安卓或苹果端加入网络使用
  • DNS
  • Users 配置用户管理网络,支持多租户

然后进入 Networks 创建一个虚拟网络,比如 10.1.0.0/16

创建网络

  • 网络默认监听端口是 51821 记得对该端口放行(运行Netmaker的节点)

这样虚拟网络就创建成功了。

加入节点

加入节点有两种方式,先说第一种:

在网络里点 Access keys 创建 Key,获得 Token

Access Keys
Create Key

uses 代表这个 Key 可以用于几个节点

Success

然后去要加入网络的节点上执行 Install Commands 加入网络。执行的逻辑就是下载 netclient 然后通过 Token 加入网络,Token 里面包含了 Netmaker 的服务端配置信息。
所以你也可以从 这里 手动下载 netclient 执行:netclient join -t TOKEN

第二种是进入网络把 Without Keys 打开

Without Keys

然后在节点上执行

netclient join --dnson no --network ten --apiserver NETMAKE_DOMAIN_OR_IP:8081 --grpcserver NETMAKE_DOMAIN_OR_IP:50051

Nodes 下对刚加入的节点执行同意加入

approve

macOS 的加入

也是先下载 netclient,下载时候注意平台如果是 M1 芯片下载 darwin-arm64,之后安装 wireguard-tools:

1
$ brew install wireguard-tools

然后执行 netclient join 就行了。

查看节点

在节点上执行 wg 可以看到加入的虚拟网络和链接的节点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ wg
interface: nm-ten
public key: aH4j5K2TiYhhwI9Bz0tmxxxx
private key: (hidden)
listening port: 51821

peer: mbv8tihsqvvtgcejLGB+xxxxx
endpoint: 81.70.xxx.xxx:51821
allowed ips: 10.1.0.3/32
latest handshake: 35 seconds ago
transfer: 14.37 MiB received, 54.71 MiB sent
persistent keepalive: every 20 seconds

peer: WDEfuS8deFQyd6syZJNtaxxxx
endpoint: 82.156.xxx.xxx:51821
allowed ips: 10.1.0.2/32
latest handshake: 35 seconds ago
transfer: 36.74 MiB received, 542.48 MiB sent
persistent keepalive: every 20 seconds
  • 网络不通请检查 endpoint 端口的连通性

已经成功分配了ip,ping 一下试试。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ ping 10.1.0.2
PING 10.1.0.2 (10.1.0.2) 56(84) bytes of data.
64 bytes from 10.1.0.2: icmp_seq=1 ttl=64 time=8.69 ms
64 bytes from 10.1.0.2: icmp_seq=2 ttl=64 time=9.74 ms
64 bytes from 10.1.0.2: icmp_seq=3 ttl=64 time=51.0 ms
^C
--- 10.1.0.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 8.698/23.165/51.057/19.727 ms

$ ping 10.1.0.3
PING 10.1.0.3 (10.1.0.3) 56(84) bytes of data.
64 bytes from 10.1.0.3: icmp_seq=1 ttl=64 time=0.893 ms
64 bytes from 10.1.0.3: icmp_seq=2 ttl=64 time=0.948 ms
64 bytes from 10.1.0.3: icmp_seq=3 ttl=64 time=1.01 ms
^C
--- 10.1.0.3 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2032ms
rtt min/avg/max/mdev = 0.893/0.951/1.014/0.060 ms

网络已经打通了!

Ingress GateWay 和 External Clients

外部客户端,就是可以访问虚拟网络资源,但是虚拟网络内节点不能反过来访问该外部客户端。通过 Ingress GateWay 入口网关实现。
具体就是选择一个节点开启 Ingress GateWay 使其变成一个中继节点,然后在其上添加外部客户端 External Clients 生成配置文件及二维码。中继节点负责为外部客户端的流量请求进行转发。
LinuxmacOSWindows 可以通过 wg-quick up /path/to/config 命令接入网络。
AndroidiOS 下载 WireGuard App 通过扫描配置二维码就可以接入网络了。

  • 生成的配置是固定的,网络节点配置修改后需要重新生成配置

Egress GateWay

比如我现在的组网状态下,ten-2 节点私有局域网段是 10.0.8.0/22ten 网络内其它节点想要访问该私有局域网段的其它服务器,通过 Egress GateWay 出口网关可以实现。

ten-2 节点上创建出口网关后通过 wg 查看配置同步完成网络就打通了。另外通过逗号分隔可以支持多个网段。

Egress GateWay

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ wg
interface: nm-ten
public key: aH4j5K2TiYhhwI9Bz0tmxxxx
private key: (hidden)
listening port: 51821

peer: mbv8tihsqvvtgcejLGB+xxxxx
endpoint: 81.70.xxx.xxx:51821
allowed ips: 10.1.0.3/32
latest handshake: 55 seconds ago
transfer: 644.40 MiB received, 24.83 MiB sent
persistent keepalive: every 20 seconds

peer: WDEfuS8deFQyd6syZJNtaxxxx
endpoint: 82.156.xxx.xxx:51821
allowed ips: 10.1.0.2/32, 10.0.8.0/22
latest handshake: 44 seconds ago
transfer: 569.67 MiB received, 38.38 MiB sent
persistent keepalive: every 20 seconds

其它

组网成功后部署了 k8s 集群, 可以进一步折腾了。

另外推荐一个 k8s 可视化管理工具 Lens,号称是 k8s 的 IDE,操作 k8s 相当方便。

Lens Cluster

Lens Nodes