Featured image of post 使用Netmaker构建WireGuard全球大内网

使用Netmaker构建WireGuard全球大内网

Cloudflare环境下的Netmaker踩坑过程。谁不喜欢全球大内网呢?

Netmaker作为WireGuard组网工具,支持快速构建full mesh架构网络,
快速设置流量出入口,动态更新WireGuard配置文件等各种功能。

系统环境: Ubuntu 20.04 LTS + 5.15.0-40-generic

需要对外开放的接口:

  • TCP 23333 (MQ)
  • UDP 51821-51830 (WireGuard)

关于WEB相关的80 443端口,
本文写于Cloudflare ZeroTrust环境,
因此WEB相关端口直接通过Cloudflare Tunnel连接至Docker内网,
不需要对外开放。

安装Netmaker

准备环境

1
apt install -y docker-compose wireguard

新增docker network:

1
docker network create AkkiaNet --subnet 172.18.0.0/16

获取docker-compose.yml并进行修改:

官方配置文件

修改后的配置文件

配置相关参数

在修改后的配置文件中搜索并替换下列参数:

NETMAKER_BASE_DOMAIN: 域名后缀,比如akkia.network
SERVER_PUBLIC_IP: 公网IP地址
YOUR_EMAIL: 邮箱地址,申请证书时使用
CF_DNS_API_TOKEN: Cloudflare API Token,申请证书时使用
REPLACE_MASTER_KEY: 密钥,随意填写

完成docker-compose.yml的修改后,执行

1
docker-compose up -d

等待镜像拉取-容器运行-SSL证书申请完成后,
访问设置的公网域名,查看是否能够访问到Netmaker的首页并注册管理员账户。
可能出现的问题是SSL证书申请不通过,具体可以查看traefix的日志。

对官方配置文件作出修改的原因

对于使用Cloudflare

  1. 正如Netmaker文档中提到的,使用Cloudflare作为DNS可能会出现一些问题。
    一个实际的问题是Cloudflare不会对超过二层的子域名(比如api.netmaker.akkia.network)发放免费的证书,
    因此如果你希望使用Cloudflare保护你的netmaker REST API
    你需要对docker-compose.yml中的相关域名做出更改。

  2. 另一个问题在于Netmaker通过Caddy|traefik的acme模块验证并从 Let’s Encrypt 申请TLS证书,
    因此对于使用Cloudflare Tunnel的用户(比如我)
    提前为Netmaker设置好Public Hostname是必要的,
    不过在我修改的配置中,我选择了通过DNS验证的方式申请证书。

对于Netmaker本身

  1. 我并不打算使用自建的DNS服务器,
    因此我修改了docker-compose.yml中于coredns有关的配置。
1
2
      CLIENT_MODE: "off"
      PORT_FORWARD_SERVICES: ""
  1. 为了方便后续的备份与迁移,
    我将所有使用volume的配置均改为了映射本地文件夹。

  2. 为了方便调试网络,
    我将所有涉及到的容器均放置在一个固定的外部bridge中,
    并为traefik分配了固定的IP地址。

1
2
3
    networks:
      default:
        ipv4_address: 172.18.0.10

注意在Cloudflare Tunnel配置中使用该IP地址+HTTPS协议进行连接。

Cloudflare Tunnel

1
2
3
4
networks:
  default:
    external:
      name: AkkiaNet
  1. 由于前端部署在Cloudflare Tunnel之后,
    我将traefik申请证书的验证方式改为了dns验证(#1)
    这将需要配置在docker-compose中设置Cloudflare API Token

labels:

1
2
3
4
      - "--certificatesresolvers.http.acme.email=YOUR_EMAIL"
      - "--certificatesresolvers.http.acme.storage=/letsencrypt/acme.json"
      - "--certificatesresolvers.http.acme.dnschallenge=true"
      - "--certificatesresolvers.http.acme.dnschallenge.provider=cloudflare"

environment:

1
      CF_DNS_API_TOKEN: "CF_DNS_API_TOKEN"
  1. Cloudflare CDN端目前并不支持MQTT,
    虽然接入Tunnel的好处是可以使用Access访问TCP资源,
    但是对于目前的需求来说(减少对外暴露端口并防止源IP泄漏)
    我还是选择了直接对外开放MQTT端口。
    你可以看到在修改后的配置文件中暴露了23333端口用于MQTT
1
      MQ_PORT: "23333"

配置全球大内网

登录到Netmaker的网页控制台,

设置第一个network区域

netmaker network

按照需求填写相关信息获直接点击autofill按钮自动填写

create network

保存后即设置好了第一个network区域

创建Access Key

Access Key用于后续添加节点时的验证

create access key

create access key

添加节点

安装netclient

这一步可以参照官方文档

ssh连接至各个服务器,以ubuntu 22.04为例:
运行

1
2
3
4
curl -sL 'https://apt.netmaker.org/gpg.key' | sudo tee /etc/apt/trusted.gpg.d/netclient.asc
curl -sL 'https://apt.netmaker.org/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/netclient.list
sudo apt update
sudo apt install netclient

加入网络

等待安装完成后,从Access Key页面获取安装命令

join command

将该命令复制到服务器ssh终端执行,

1
2
3
4
root@master01:~/netmaker# netclient join -t TOKEN
[netclient] 2022-06-28 20:02:33 joining us-west at api.example.com:443
[netclient] 2022-06-28 20:02:33 starting wireguard
[netclient] 2022-06-28 20:02:35 sent a node update to server for master01 ,  A-B-C-D

在各个服务器上重复上述步骤,直到所有服务器都加入网络。

后续步骤

参考官方文档
你可以为各个区域创建不同的网络,并通过ingress、egress等方式路由流量
组建你的全球大内网。

参考资料

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计