问题描述
假设您希望在Hetzner Cloud上部署一组机器集群。为了简单起见,我们将它们称为worker1
、worker2
和worker3
。它们需要与名为master
的服务器通信,该服务器将在与工作机不同的账户上运行。理想情况下,整个设置不应向互联网开放。不幸的是,Hetzner只支持同一账户内的私有网络。
为了使其工作,您可以使用WireGuard设置自己的VPN。从概念上讲,这并不困难。您需要设置三个连接(在master
和每个worker
之间)。棘手的部分是如何自动化密钥交换。理想情况下,如果您部署额外的工作机(例如100个而不是3个工作机),工作量不应增加。
设置这样的VPN集群听起来像是一个常见的问题,但我找不到关于如何设置1对n
或n对m
连接的建议,只有关于如何连接两台机器的教程。我考虑使用Ansible自动化密钥交换(生成密钥,收集它们,安装到master
上),但我想首先检查是否有我遗漏的更简单的解决方案。
在SSH中,工作机可以共享密钥,这将简化问题。而在WireGuard中,据我了解,密钥无法共享。您如何自动设置带有WireGuard的VPN,以便每个工作机都能访问主服务器?或者WireGuard对这个问题来说是否不是正确的选择?
澄清:
– 在我的情况下,将工作机和主服务器移动到同一个账户是不可能的;否则,Hetzner网络将是设置私有网络的直接解决方案。
– 如果您不熟悉Hetzner Cloud,也没有问题。您可以假设您获得了普通的Linux机器,但之后您将独自操作(它不支持像AWS那样的跨账户VPC对等连接)。但是您可以使用所有可用于创建VPN设置的Linux工具。WireGuard将是我的首选,但我也愿意尝试其他技术。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1:使用Ansible自动化WireGuard密钥交换
您可以考虑使用Ansible自动化WireGuard密钥交换,以便每个工作机都可以与主服务器通信。以下是一个可能的方案:
- 安装Ansible:确保您的系统上安装了Ansible。
- 编写Ansible Playbook:创建一个Ansible Playbook,其中包含以下步骤:
- 为主服务器生成WireGuard密钥对。
- 将主服务器的公钥分发给所有工作机。
- 为每个工作机生成WireGuard密钥对。
- 将每个工作机的公钥分发给主服务器。
- 自动化WireGuard配置:使用Ansible Playbook自动在每台机器上配置WireGuard,包括生成配置文件、设置网络接口等。
- 测试连接:确保工作机可以通过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密钥交换。以下是一个可能的步骤:
- 安装所需的Ansible Role:根据您的需求,选择一个适合的Ansible Role,例如
githubixx/ansible-role-wireguard
或consensus/wireguard_cloud_gateway
。 - 遵循Role文档:按照所选Ansible Role的文档,设置Role所需的变量和配置。
- 运行Ansible Playbook:运行包含所选Role的Ansible Playbook,以自动执行WireGuard密钥交换、配置和启动。
这样,您可以使用现有的解决方案来自动化WireGuard的密钥交换,从而使每个工作机能够与主服务器建立安全的连接。
结论
在部署Hetzner Cloud上的机器集群时,使用WireGuard自动化密钥交换是一个不错的选择。您可以选择使用Ansible来管理密