Netmaker 介绍
Netmaker 是一个用来配置 WireGuard 全互联模式的可视化工具,它的功能非常强大,不仅支持 UDP 打洞、NAT 穿透、多租户,还可以使用 Kubernetes 配置清单来部署,客户端几乎适配了所有平台,包括 Linux, Mac 和 Windows,还可以通过 WireGuard 原生客户端连接 iPhone 和 Android。
其最新版本的基准测试结果显示,基于 Netmaker 的 WireGuard 网络速度比其他全互联模式的 VPN(例如 Tailscale 和 ZeroTier)网络速度快 50% 以上。
Netmaker 架构

Netmaker 使用的是 C/S 架构,即客户端/服务器架构。Netmaker Server 包含两个核心组件:用来管理网络的可视化界面,以及与客户端通信的 gRPC Server。你也可以可以选择部署DNS服务器(CoreDNS)来管理私有DNS。
客户端(netclient)是一个二进制文件,可以在绝大多数 Linux 客户端以及 macOS 和 Windows 客户端运行,它的功能就是自动管理 WireGuard,动态更新 Peer 的配置。
注意:Netmaker Server 只是用来存储虚拟网络的配置并管理各个 Peer 的状态,Peer 之间的网络流量并不会通过 Netmaker Server。
Netmaker 还有一个重要的术语叫签到,客户端会通过定时任务来不断向 Netmaker Server 签到,以动态更新自身的状态和 Peer 的配置,它会从 Netmaker Server 检索 Peer 列表,然后与所有的 Peer 建立点对点连接,即全互联模式。所有的 Peer 通过互联最终呈现出来的网络拓扑结构就类似于本地子网或 VPC。
Netmarker 部署
Netmaker 支持多种部署方式,包括二进制部署和容器化部署,容器化部署还支持 docker-compose 和 Kubernetes。个人推荐使用docker-compose来部署,简单易维护。
主要的部署步骤都是参考的官方部署文档,因为官方文档使用的是traefik来做的反向代理和负载,但是我个人的服务器上的其他服务已经使用了Caddy来做代理,所以此处就修改了下YAML文件,继续使用Caddy做代理。
1. 先决条件

主要的点:
- 开放服务器的443(tcp), 53(tcp & udp), 51821-518XX(udp)端口 
- 443 端口,Dashboard,REST API 和 gRPC
 - 53端口,CoreDNS
 - 51821-518XX,WireGuard,每一个网络需要一个端口,起始端口会使用 51821,可以根据自己的网络端数量需要设定端口范围
 
 - 如果有防火墙的话,需要开启防火墙的允许访问 ```bash sudo ufw allow proto tcp from any to any port 443 && sudo ufw allow 51821:51830/udp
 
iptables —policy FORWARD ACCEPT
- 如果是使用域名模式的话,还需要增加3条域名解析(如果只用IP访问,可以在配置文件中修改网络模式为:host,此处不做详细配置说明)- dashboard.domain- api.domain- broker.domain<a name="c23bce4b"></a>### 2. 依赖安装分别安装 `docker` 、`docker-compose`、`wireguard`,如果已经安装则略过```bashsudo apt-get isntall -y docker.io docker-compose wireguard
3. 安装 Netmarker
a. 从官方获取docker-compose的YAML文件,并修改其中的参数
# 获取docker-compose文件wget -O docker-compose.yml https://raw.githubusercontent.com/gravitl/netmaker/master/compose/docker-compose.traefik.yml# 修改域名sed -i 's/NETMAKER_BASE_DOMAIN/<your base domain>/g' docker-compose.yml# 修改公网IPsed -i 's/SERVER_PUBLIC_IP/<your server ip>/g' docker-compose.yml# 修改邮件地址sed -i 's/YOUR_EMAIL/<your email>/g' docker-compose.yml
b. 生成唯一的master key并写入yaml文件
tr -dc A-Za-z0-9 </dev/urandom | head -c 30 ; echo ''sed -i 's/REPLACE_MASTER_KEY/<your generated key>/g' docker-compose.yml
c. 拉取MQ配置文件
#从官方获取MQ配置文件,并存放于/root/目录wget -O /root/mosquitto.conf https://raw.githubusercontent.com/gravitl/netmaker/master/docker/mosquitto.conf
d. 增加Caddy的配置
在Caddyfile文件末尾增加netmarker的代理配置,然后并重启Caddy服务:
## netmarker conf## 替换下方的`NETMAKER_BASE_DOMAIN`和`YOUR_EMAIL`为你的真实信息# Dashboarddashboard.NETMAKER_BASE_DOMAIN {# Apply basic security headersheader {# Enable HTTP Strict Transport Security (HSTS)Strict-Transport-Security "max-age=31536000;"# Enable cross-site filter (XSS) and tell browser to block detected attacksX-XSS-Protection "1; mode=block"# Disallow the site to be rendered within a frame on a foreign domain (clickjacking protection)X-Frame-Options "SAMEORIGIN"# Prevent search engines from indexingX-Robots-Tag "none"# Remove the server name-Server}encode gzip#root * /usr/share/caddytls YOUR_EMAILreverse_proxy 127.0.0.1:8888}# APIapi.NETMAKER_BASE_DOMAIN {encode gziproot * /usr/share/caddytls YOUR_EMAILreverse_proxy 127.0.0.1:8081}
e. 启动服务
在docker-compose.yml文件目录执行下面的命令启动服务
sudo docker-compose up -d
然后浏览器访问 dashboard.example.com,即可打开netmarker页面,第一次登录会提示创建用户

最后贴上我自己的docker-compose.yml文件内容:
version: "3.4"services:netmaker:container_name: netmakerimage: gravitl/netmaker:v0.14.3cap_add:- NET_ADMIN- NET_RAW- SYS_MODULEsysctls:- net.ipv4.ip_forward=1- net.ipv4.conf.all.src_valid_mark=1- net.ipv6.conf.all.disable_ipv6=0- net.ipv6.conf.all.forwarding=1restart: alwaysvolumes:- dnsconfig:/root/config/dnsconfig- sqldata:/root/data- shared_certs:/etc/netmakerenvironment:SERVER_NAME: "broker.NETMAKER_BASE_DOMAIN"SERVER_HOST: "SERVER_PUBLIC_IP"SERVER_API_CONN_STRING: "api.nNETMAKER_BASE_DOMAIN:443"COREDNS_ADDR: "SERVER_PUBLIC_IP"DNS_MODE: "on"SERVER_HTTP_HOST: "api.NETMAKER_BASE_DOMAIN"API_PORT: "8081"CLIENT_MODE: "on"MASTER_KEY: "REPLACE_MASTER_KEY"CORS_ALLOWED_ORIGIN: "*"DISPLAY_KEYS: "on"DATABASE: "sqlite"NODE_ID: "netmaker-server-1"MQ_HOST: "mq"MQ_PORT: "443"HOST_NETWORK: "off"VERBOSITY: "1"MANAGE_IPTABLES: "on"PORT_FORWARD_SERVICES: "dns"ports:- "51821-51830:51821-51830/udp"expose:- "8081"ports: # 增加端口映射到容器外部,为了安全只开启本地访问- "127.0.0.1:8081:8081"netmaker-ui:container_name: netmaker-uiimage: gravitl/netmaker-ui:v0.14.3depends_on:- netmakerlinks:- "netmaker:api"restart: alwaysenvironment:BACKEND_URL: "https://api.NETMAKER_BASE_DOMAIN"expose:- "80"ports: # 增加端口映射到容器外部,为了安全只开启本地访问- "127.0.0.1:8888:80"coredns:container_name: corednsimage: coredns/corednscommand: -conf /root/dnsconfig/Corefiledepends_on:- netmakerrestart: alwaysvolumes:- dnsconfig:/root/dnsconfigmq:container_name: mqimage: eclipse-mosquitto:2.0.11-openssldepends_on:- netmakerrestart: unless-stoppedvolumes:- /root/mosquitto.conf:/mosquitto/config/mosquitto.conf- mosquitto_data:/mosquitto/data- mosquitto_logs:/mosquitto/log- shared_certs:/mosquitto/certsports:- "127.0.0.1:1883:1883"expose:- "8883"volumes:shared_certs: {}sqldata: {}dnsconfig: {}mosquitto_data: {}mosquitto_logs: {}
主要修改的内容:
- 删除
traefik相关配置 - 增加
api、netmaker容器的端口映射 
