Netmaker 介绍

Netmaker 是一个用来配置 WireGuard 全互联模式的可视化工具,它的功能非常强大,不仅支持 UDP 打洞、NAT 穿透、多租户,还可以使用 Kubernetes 配置清单来部署,客户端几乎适配了所有平台,包括 Linux, Mac 和 Windows,还可以通过 WireGuard 原生客户端连接 iPhone 和 Android。

其最新版本的基准测试结果显示,基于 Netmaker 的 WireGuard 网络速度比其他全互联模式的 VPN(例如 Tailscale 和 ZeroTier)网络速度快 50% 以上。

Netmaker 架构

Netmarker 安装部署 - 图1

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. 先决条件

Netmarker 安装部署 - 图2

主要的点:

  • 开放服务器的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

  1. - 如果是使用域名模式的话,还需要增加3条域名解析(如果只用IP访问,可以在配置文件中修改网络模式为:host,此处不做详细配置说明)
  2. - dashboard.domain
  3. - api.domain
  4. - broker.domain
  5. <a name="c23bce4b"></a>
  6. ### 2. 依赖安装
  7. 分别安装 `docker` `docker-compose``wireguard`,如果已经安装则略过
  8. ```bash
  9. sudo apt-get isntall -y docker.io docker-compose wireguard

3. 安装 Netmarker

a. 从官方获取docker-compose的YAML文件,并修改其中的参数

  1. # 获取docker-compose文件
  2. wget -O docker-compose.yml https://raw.githubusercontent.com/gravitl/netmaker/master/compose/docker-compose.traefik.yml
  3. # 修改域名
  4. sed -i 's/NETMAKER_BASE_DOMAIN/<your base domain>/g' docker-compose.yml
  5. # 修改公网IP
  6. sed -i 's/SERVER_PUBLIC_IP/<your server ip>/g' docker-compose.yml
  7. # 修改邮件地址
  8. sed -i 's/YOUR_EMAIL/<your email>/g' docker-compose.yml

b. 生成唯一的master key并写入yaml文件

  1. tr -dc A-Za-z0-9 </dev/urandom | head -c 30 ; echo ''
  2. sed -i 's/REPLACE_MASTER_KEY/<your generated key>/g' docker-compose.yml

c. 拉取MQ配置文件

  1. #从官方获取MQ配置文件,并存放于/root/目录
  2. wget -O /root/mosquitto.conf https://raw.githubusercontent.com/gravitl/netmaker/master/docker/mosquitto.conf

d. 增加Caddy的配置

Caddyfile文件末尾增加netmarker的代理配置,然后并重启Caddy服务:

  1. ## netmarker conf
  2. ## 替换下方的`NETMAKER_BASE_DOMAIN`和`YOUR_EMAIL`为你的真实信息
  3. # Dashboard
  4. dashboard.NETMAKER_BASE_DOMAIN {
  5. # Apply basic security headers
  6. header {
  7. # Enable HTTP Strict Transport Security (HSTS)
  8. Strict-Transport-Security "max-age=31536000;"
  9. # Enable cross-site filter (XSS) and tell browser to block detected attacks
  10. X-XSS-Protection "1; mode=block"
  11. # Disallow the site to be rendered within a frame on a foreign domain (clickjacking protection)
  12. X-Frame-Options "SAMEORIGIN"
  13. # Prevent search engines from indexing
  14. X-Robots-Tag "none"
  15. # Remove the server name
  16. -Server
  17. }
  18. encode gzip
  19. #root * /usr/share/caddy
  20. tls YOUR_EMAIL
  21. reverse_proxy 127.0.0.1:8888
  22. }
  23. # API
  24. api.NETMAKER_BASE_DOMAIN {
  25. encode gzip
  26. root * /usr/share/caddy
  27. tls YOUR_EMAIL
  28. reverse_proxy 127.0.0.1:8081
  29. }

e. 启动服务

docker-compose.yml文件目录执行下面的命令启动服务

  1. sudo docker-compose up -d

然后浏览器访问 dashboard.example.com,即可打开netmarker页面,第一次登录会提示创建用户

Netmarker 安装部署 - 图3

最后贴上我自己的docker-compose.yml文件内容:

  1. version: "3.4"
  2. services:
  3. netmaker:
  4. container_name: netmaker
  5. image: gravitl/netmaker:v0.14.3
  6. cap_add:
  7. - NET_ADMIN
  8. - NET_RAW
  9. - SYS_MODULE
  10. sysctls:
  11. - net.ipv4.ip_forward=1
  12. - net.ipv4.conf.all.src_valid_mark=1
  13. - net.ipv6.conf.all.disable_ipv6=0
  14. - net.ipv6.conf.all.forwarding=1
  15. restart: always
  16. volumes:
  17. - dnsconfig:/root/config/dnsconfig
  18. - sqldata:/root/data
  19. - shared_certs:/etc/netmaker
  20. environment:
  21. SERVER_NAME: "broker.NETMAKER_BASE_DOMAIN"
  22. SERVER_HOST: "SERVER_PUBLIC_IP"
  23. SERVER_API_CONN_STRING: "api.nNETMAKER_BASE_DOMAIN:443"
  24. COREDNS_ADDR: "SERVER_PUBLIC_IP"
  25. DNS_MODE: "on"
  26. SERVER_HTTP_HOST: "api.NETMAKER_BASE_DOMAIN"
  27. API_PORT: "8081"
  28. CLIENT_MODE: "on"
  29. MASTER_KEY: "REPLACE_MASTER_KEY"
  30. CORS_ALLOWED_ORIGIN: "*"
  31. DISPLAY_KEYS: "on"
  32. DATABASE: "sqlite"
  33. NODE_ID: "netmaker-server-1"
  34. MQ_HOST: "mq"
  35. MQ_PORT: "443"
  36. HOST_NETWORK: "off"
  37. VERBOSITY: "1"
  38. MANAGE_IPTABLES: "on"
  39. PORT_FORWARD_SERVICES: "dns"
  40. ports:
  41. - "51821-51830:51821-51830/udp"
  42. expose:
  43. - "8081"
  44. ports: # 增加端口映射到容器外部,为了安全只开启本地访问
  45. - "127.0.0.1:8081:8081"
  46. netmaker-ui:
  47. container_name: netmaker-ui
  48. image: gravitl/netmaker-ui:v0.14.3
  49. depends_on:
  50. - netmaker
  51. links:
  52. - "netmaker:api"
  53. restart: always
  54. environment:
  55. BACKEND_URL: "https://api.NETMAKER_BASE_DOMAIN"
  56. expose:
  57. - "80"
  58. ports: # 增加端口映射到容器外部,为了安全只开启本地访问
  59. - "127.0.0.1:8888:80"
  60. coredns:
  61. container_name: coredns
  62. image: coredns/coredns
  63. command: -conf /root/dnsconfig/Corefile
  64. depends_on:
  65. - netmaker
  66. restart: always
  67. volumes:
  68. - dnsconfig:/root/dnsconfig
  69. mq:
  70. container_name: mq
  71. image: eclipse-mosquitto:2.0.11-openssl
  72. depends_on:
  73. - netmaker
  74. restart: unless-stopped
  75. volumes:
  76. - /root/mosquitto.conf:/mosquitto/config/mosquitto.conf
  77. - mosquitto_data:/mosquitto/data
  78. - mosquitto_logs:/mosquitto/log
  79. - shared_certs:/mosquitto/certs
  80. ports:
  81. - "127.0.0.1:1883:1883"
  82. expose:
  83. - "8883"
  84. volumes:
  85. shared_certs: {}
  86. sqldata: {}
  87. dnsconfig: {}
  88. mosquitto_data: {}
  89. mosquitto_logs: {}

主要修改的内容:

  • 删除traefik相关配置
  • 增加apinetmaker容器的端口映射