如何在部署机器集群时自动化WireGuard中的密钥交换

94次阅读
没有评论

问题描述

假设您希望在Hetzner Cloud上部署一组机器集群。为了简单起见,我们将它们称为worker1worker2worker3。它们需要与名为master的服务器通信,该服务器将在与工作机不同的账户上运行。理想情况下,整个设置不应向互联网开放。不幸的是,Hetzner只支持同一账户内的私有网络。

为了使其工作,您可以使用WireGuard设置自己的VPN。从概念上讲,这并不困难。您需要设置三个连接(在master和每个worker之间)。棘手的部分是如何自动化密钥交换。理想情况下,如果您部署额外的工作机(例如100个而不是3个工作机),工作量不应增加。

设置这样的VPN集群听起来像是一个常见的问题,但我找不到关于如何设置1对nn对m连接的建议,只有关于如何连接两台机器的教程。我考虑使用Ansible自动化密钥交换(生成密钥,收集它们,安装到master上),但我想首先检查是否有我遗漏的更简单的解决方案。

在SSH中,工作机可以共享密钥,这将简化问题。而在WireGuard中,据我了解,密钥无法共享。您如何自动设置带有WireGuard的VPN,以便每个工作机都能访问主服务器?或者WireGuard对这个问题来说是否不是正确的选择?

澄清:
– 在我的情况下,将工作机和主服务器移动到同一个账户是不可能的;否则,Hetzner网络将是设置私有网络的直接解决方案。
– 如果您不熟悉Hetzner Cloud,也没有问题。您可以假设您获得了普通的Linux机器,但之后您将独自操作(它不支持像AWS那样的跨账户VPC对等连接)。但是您可以使用所有可用于创建VPN设置的Linux工具。WireGuard将是我的首选,但我也愿意尝试其他技术。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1:使用Ansible自动化WireGuard密钥交换

您可以考虑使用Ansible自动化WireGuard密钥交换,以便每个工作机都可以与主服务器通信。以下是一个可能的方案:

  1. 安装Ansible:确保您的系统上安装了Ansible。
  2. 编写Ansible Playbook:创建一个Ansible Playbook,其中包含以下步骤:
  3. 为主服务器生成WireGuard密钥对。
  4. 将主服务器的公钥分发给所有工作机。
  5. 为每个工作机生成WireGuard密钥对。
  6. 将每个工作机的公钥分发给主服务器。
  7. 自动化WireGuard配置:使用Ansible Playbook自动在每台机器上配置WireGuard,包括生成配置文件、设置网络接口等。
  8. 测试连接:确保工作机可以通过WireGuard连接到主服务器,并确保通信正常。

以下是可能的Ansible Playbook示例(仅供参考):

- name: Automate WireGuard Key Exchange
  hosts: all
  tasks:
    - name: Generate WireGuard Key Pair for Master
      command: wg genkey | tee /path/to/master_private_key | wg pubkey > /path/to/master_public_key
      delegate_to: master_server

    - name: Distribute Master's Public Key to Workers
      copy:
        src: /path/to/master_public_key
        dest: /tmp/master_public_key

    - name: Generate WireGuard Key Pair for Each Worker
      command: wg genkey | tee /tmp/worker_{{ inventory_hostname }}_private_key | wg pubkey > /tmp/worker_{{ inventory_hostname }}_public_key

    - name: Distribute Worker's Public Key to Master
      copy:
        src: /tmp/worker_{{ inventory_hostname }}_public_key
        dest: /path/to/worker_public_keys/{{ inventory_hostname }}.pub

    - name: Configure WireGuard on Each Machine
      template:
        src: templates/wg_config.j2
        dest: /etc/wireguard/wg0.conf

    - name: Start WireGuard Interface
      command: wg-quick up wg0

请根据您的环境和需求进行适当的调整。在这个示例中,我们假设您有一个名为templates/wg_config.j2的模板文件,用于生成WireGuard配置文件。

方案2:使用现有的Ansible Role

如果您不希望自己编写Ansible Playbook,您还可以考虑使用现有的Ansible Role来自动化WireGuard密钥交换。以下是一个可能的步骤:

  1. 安装所需的Ansible Role:根据您的需求,选择一个适合的Ansible Role,例如githubixx/ansible-role-wireguardconsensus/wireguard_cloud_gateway
  2. 遵循Role文档:按照所选Ansible Role的文档,设置Role所需的变量和配置。
  3. 运行Ansible Playbook:运行包含所选Role的Ansible Playbook,以自动执行WireGuard密钥交换、配置和启动。

这样,您可以使用现有的解决方案来自动化WireGuard的密钥交换,从而使每个工作机能够与主服务器建立安全的连接。

结论

在部署Hetzner Cloud上的机器集群时,使用WireGuard自动化密钥交换是一个不错的选择。您可以选择使用Ansible来管理密

正文完