如何使用 Ansible 和 Tinc VPN 确保服务器基础架构的安全

介绍

在本教程中,我们将展示如何使用配置管理工具 Ansible来设置网络VPN与 Tinc,以确保Ubuntu和CentOS服务器之间的网络通信。

A mesh VPN is especially useful if your servers are using a shared network, because it enables your servers to communicate as if they were isolated on a truly private network. The extra layer of security provided by the authentication and encryption features of the VPN will protect the network communication of your private services—databases, Elasticsearch clusters, and more—from unauthorized access or attacks. If you are using DigitalOcean’s private networking feature, then is isolated between this security feature will already be enabled for servers on the same team or account within the same region. Mesh VPN Diagram

手动配置和维护跨多个服务器的VPN是困难的和容易出现错误的,因为多个配置和关键文件需要在所有VPN成员之间分布,因此,任何实际的网格VPN设置都应该使用一个配置管理工具,其成员可能在某个时刻发生变化。任何配置管理工具都可以使用,但本教程使用Ansible,因为它很受欢迎和易于使用。本教程使用的Ansible Playbook, ansible-tinc,已经在Ubuntu 14.04和CentOS 7服务器上进行了测试。

背景阅读

您应该能够遵循本教程并设置网格VPN,而不会太了解Ansible或Tinc,因为包含的Playbook将为您完成大部分工作。

本 Tinc VPN 教程介绍了如何手动安装和配置 Tinc VPN. 使用 Ansible 来自动化流程,使其更容易管理。

How to Install and Configure Ansible提供了一个非常高水平的介绍,如何使用 Ansible. 如果您想开始编写 Ansible Playbooks 来自动化系统管理员任务,请参阅 本教程

前提条件

局部机器

本地机器是您将 Ansible Playbook 运行的地方,这可能是您的本地机器(例如笔记本电脑)或您用于管理服务器的其他服务器,正如前面提到的,它需要能够以的方式连接到每个远程服务器。

如果您需要安装 Ansible,请参阅 官方 Ansible 安装文档,因为安装过程取决于您的操作系统或部署。

您的本地机器也需要安装 Git,因此您可以轻松下载 ansible-tinc Playbook 的副本. 再次,因为安装说明取决于您的本地机器,请参阅 官方 Git 安装指南

远程服务器

远程服务器是您要配置使用Tinc VPN的主机,您应该从至少两个开始。

<$>[注] 注: 由于 Playbook 使用的 与 Ansible 同步模块的错误而无法使用不同的远程用户。

如果您尚未禁用root的密码身份验证,则可以将PermitRootLogin without-password添加到您的/etc/ssh/sshd_config文件中,然后重新启动 SSH。

如果你正在使用位于同一个数据中心内的DigitalOcean Droplets,你应该在所有数据中心上启用Private Networking(https://andsky.com/tech/tutorials/how-to-set-up-and-use-digitalocean-private-networking)。

Ansible-Tinc 播放书

一旦你准备好开始,使用git 克隆下载 Playbook 的副本,我们将其克隆到我们的主目录:

1cd ~
2git clone https://github.com/thisismitch/ansible-tinc

现在转到新下载的ansible-tinc目录:

1cd ansible-tinc

<$>[注] **注:**本教程的其余部分假定您位于本地机器的ansible-tinc目录中。所有 Ansible 命令必须从此目录中执行。

接下来,我们将向您展示如何使用 Playbook 创建网络 VPN. 如果您熟悉 Ansible,您可能需要花一些时间浏览 Playbook 的内容。 基本上,它使用 Tinc 安装和配置网络 VPN,并在每个服务器的 `/etc/hosts’ 中添加便利性条目。

创建主机库存文件

在运行Playbook之前,您必须创建一个主机文件,其中包含您想要在Tinc VPN中包含的服务器信息。

1[label ~/ansible-tinc/hosts example]
2[vpn]
3node01 vpn_ip=10.0.0.1 ansible_host=192.0.2.55
4node02 vpn_ip=10.0.0.2 ansible_host=192.0.2.240
5node03 vpn_ip=10.0.0.3 ansible_host=198.51.100.4
6node04 vpn_ip=10.0.0.4 ansible_host=198.51.100.36
7
8[removevpn]

第一行,『[vpn]』,指明主机直接在其下方的条目是vpn组的一部分。

  • 第一列是您设置一个主机的库存名称,node01在示例的第一行中,Ansible将如何参考主机。 此值用于配置Tinc连接,并生成/etc/hosts条目。 不要在这里使用字符串,因为Tinc不支持它们在主机名称 *vpn_ip是节点将用于VPN的IP地址。 将此分配给您希望服务器用于VPN连接的IP地址 *ansible_host必须设置为值,以便您的本地机器能够到达节点(即真实的IP地址或主机名)

因此,在示例中,我们有四个主机,我们希望在看起来像这样的网格VPN中配置:

Example Mesh VPN Diagram

一旦您的主机文件包含您希望在VPN中包含的所有服务器,请保存您的更改,确保它不包含重复的条目(主机名称、vpn_ip 地址或ansible_host 值)。

在此时,您应该测试Ansible可以连接到库存文件中的所有主机:

1ansible all -m ping

如果任何连接都失败,请检查您的主机文件是否存在错误,并确保所有相关服务器在继续前符合 前提部分中列出的要求。

组变量分析

在运行 Playbook 之前,您可能需要查看 /group_vars/all 文件的内容:

 1[label /group_vars/all]
 2---
 3
 4netname: nyc3
 5physical_ip: "{{ ansible_eth1.ipv4.address }}"
 6
 7vpn_interface: tun0
 8
 9vpn_netmask: 255.255.255.0
10vpn_subnet_cidr_netmask: 32

两个最重要的变量是physical_ipvpn_netmask:

在DigitalOcean,eth1是私人网络接口,所以Private Networking必须启用,除非你更愿意使用公共网络接口,eth0,通过将其值更改为{{ ansible_eth0.ipv4.address }} *「vpn_netmask」指定将应用于VPN接口的网面,默认情况下,它被设置为255.255.255.0,这意味着每个vpnip_ class是一个C地址,只能与同一子网内的其他主机通信。

注意:VPN的安全优势可以通过公共互联网扩展到您的服务器,但请记住,通信仍然具有与非VPN连接相同的延迟和带宽限制。

以下是其他设置的解释:

  • netname 指定了 tinc netname. 默认设置为 nyc3.
  • vpn_interface 是 tinc 将使用的虚拟网络接口的名称。 默认设置为 tun0.
  • vpn_subnet_cidr_netmask 设置为 32,这表示一个单主机子网(点到点),因为我们正在配置一个网格 VPN。 不要改变这个值

一旦你完成了对组变量的审查,你应该准备好转向下一步。

使用Tinc VPN

现在你已经创建了一个库存主机文件并审查了组变量,你已经准备好部署Tinc并通过运行Playbook在你的服务器上设置VPN了。

ansible-tinc目录中,运行此命令来运行 Playbook:

1ansible-playbook site.yml

当 Playbook 运行时,它应该提供执行的每个任务的输出. 如果一切都配置正确,你应该看到几个OK更改状态,以及零失败状态:

1[secondary_label PLAY RECAP *********************************************************************]
2node01                     : ok=18 changed=15 unreachable=0 failed=0
3node02                     : ok=18 changed=15 unreachable=0 failed=0
4node03                     : ok=21 changed=19 unreachable=0 failed=0
5node04                     : ok=21 changed=19 unreachable=0 failed=0

如果没有失败的任务,库存文件中的所有主机都应该能够通过VPN网络相互通信。

测试VPN

登录到您的第一个主机并 ping 到第二个主机:

1ping 10.0.0.2

由于Playbook会自动创建‘/etc/hosts’条目,将库存主机名指向每个会员的VPN IP地址,所以你也可以这样做(假设在Ansible‘hosts’文件中,你的主机名为‘node02’):

1ping node02

无论如何,你应该看到有效的 ping 响应:

1[secondary_label Output:
2PING node02 (10.0.0.2) 56(84) bytes of data.
364 bytes from node02 (10.0.0.2): icmp_seq=1 ttl=64 time=1.42 ms
464 bytes from node02 (10.0.0.2): icmp_seq=2 ttl=64 time=1.03 ms
5...

免费测试其他节点之间的VPN连接。

<$>[注] 注: Tinc 使用端口 655. 如果你的 ping 测试不起作用,请确保每个节点的防火墙允许在 VPN 正在使用的实际网络设备上提供适当的流量。

一旦您完成测试,您的网格VPN已经准备好使用!

配置服务和应用程序

现在你的网格VPN已经设置了,你需要确保配置你的后端服务和应用程序来使用它(在适当的情况下)。

例如,假设您在 node01上运行一个 LEMP 堆栈,在 node02上运行一个 MySQL 数据库。MySQL 应该配置为连接到 VPN IP 地址 10.0.0.2,PHP 应用程序应在 10.0.0.2上连接到数据库,而 Nginx 应该在 192.0.2.55(node01 的公共 IP 地址)上倾听。

另一个例子是,如果 node01node02node03是 Elasticsearch 集群中的节点,则 Elasticsearch 应该配置为使用 10.0.0.110.0.0.210.0.0.3 作为节点 IP 地址。

防火墙考虑

您可能需要更新防火墙规则以允许在VPN网络设备上的流量,tun0或VPN IP地址。

如何添加或删除服务器

添加新服务器

主机文件中列出的[vpn]组中的所有服务器都将是VPN的一部分. 若要添加新的VPN会员,只需将新服务器添加到[vpn]组,然后重新运行Playbook:

1ansible-playbook site.yml

删除服务器

要删除 VPN 会员,请将您想要删除的服务器的主机条目移动到文件的底部。

例如,如果我们想删除 node04,则主机文件将看起来像这样:

1[label hosts — remove node04 from VPN]
2[vpn]
3node01 vpn_ip=10.0.0.1 ansible_host=192.0.2.55
4node02 vpn_ip=10.0.0.2 ansible_host=192.0.2.240
5node03 vpn_ip=10.0.0.3 ansible_host=198.51.100.4
6
7[removevpn]
8node04 vpn_ip=10.0.0.4 ansible_host=198.51.100.36

请注意,‘vpn_ip’是可选的,不适用于‘[removevpn]’组成员。

然后再开玩具书:

1ansible-playbook site.yml

这将阻止Tinc并删除Tinc配置和主机密钥文件从[removevpn]组的成员,从VPN中删除它们。

请注意,从VPN中删除主机会导致在剩余的VPN会员中丢弃主机文件和 /etc/hosts条目。这不应该影响任何东西,除非您稍后将新服务器添加到VPN中,而是重新使用已删除的名称。在每个服务器上删除适当的/etc/hosts条目,如果这是您的问题。

结论

您的服务器基础设施现在应该通过网格VPN来保护,使用Tinc和Ansible!如果您需要修改播放簿以满足您的具体需求,请随时点击GitHub(https://github.com/thisismitch/ansible-tinc)。

好运!

Published At
Categories with 技术
comments powered by Disqus