介绍
在本教程中,我们将介绍如何使用开源虚拟专用网络 (VPN) 守护程序 Tinc 创建一个安全的 VPN,您的服务器可以在其上进行通信,就好像它们在本地网络上一样。 我们还将演示如何使用 Tinc 设置进入专用网络的安全隧道。 我们将使用 Ubuntu 14.04 服务器,但可以调整配置以与任何其他操作系统一起使用。
Tinc 的一些有用功能包括加密、可选压缩、自动网状路由(如果可能,VPN 流量直接在通信服务器之间路由)和易于扩展。 这些功能将 Tinc 与 OpenVPN 等其他 VPN 解决方案区分开来,使其成为从地理上分布的许多小型网络中创建 VPN 的良好解决方案。 许多操作系统都支持 Tinc,包括 Linux、Windows 和 Mac OS X。
注意: 如果您想快速轻松地设置 Tinc 网状 VPN,请查看本教程:如何使用 Ansible 和 Tinc VPN 保护您的服务器基础设施。
先决条件
要完成本教程,您将需要至少三个 Ubuntu 14.04 服务器的 root 访问权限。 可以在此处找到设置 root 访问权限的说明(步骤 3 和 4): 使用 Ubuntu 14.04 进行初始服务器设置。
如果您打算在自己的环境中使用它,您将必须计划好您的服务器需要如何相互访问,并根据您自己的需要调整本教程中提供的示例。 如果您要根据自己的设置进行调整,请务必将示例中突出显示的值替换为您自己的值。
如果您想完全按照本教程进行操作,请在同一个数据中心中创建两个具有专用网络的 VPS,并在单独的数据中心中创建另一个 VPS。 我们将在 NYC2 数据中心和 AMS2 数据中心创建两个 VPS,名称如下:
- externalnyc:所有 VPN 节点都将连接到此服务器,并且必须保持连接才能正常使用 VPN 功能。 如果需要,可以以与此类似的方式配置其他服务器以提供冗余。
- internalnyc:使用 private 网络接口连接到 externalnyc VPN 节点
- ams1:通过公共 Internet 连接到 externalnyc VPN 节点
我们的目标
这是我们要设置的 VPN 的示意图(在先决条件中描述):
绿色代表我们的VPN,灰色代表公网,橙色代表私网。 所有三台服务器都可以在 VPN 上进行通信,即使 ams1 无法访问专用网络。
让我们从安装 Tinc 开始吧!
安装 Tinc
在要加入专用网络的每个 VPS 上,安装 Tinc。 让我们从更新 apt 开始:
sudo apt-get update
然后通过 apt 安装 Tinc:
sudo apt-get install tinc
现在 Tinc 已经安装好了,让我们看看 Tinc 的配置。
锡配置
Tinc 使用“网络名”来区分一个 Tinc VPN 和另一个(在多个 VPN 的情况下),即使您只计划配置一个 VPN,也建议使用网络名。 为简单起见,我们将我们的 VPN 称为“netname”。
将成为我们 VPN 一部分的每台服务器都需要以下三个配置组件:
- 配置文件:例如 tinc.conf、tinc-up 和 tinc-down
- 公钥/私钥对:用于加密和节点认证
- 主机配置文件:其中包含公钥和其他 VPN 配置
让我们从配置我们的 externalnyc 节点开始。
配置 externalnyc
在 externalnyc 上,为我们的 VPN 创建名为“netname”的配置目录结构:
sudo mkdir -p /etc/tinc/netname/hosts
现在打开 tinc.conf 进行编辑:
sudo vi /etc/tinc/netname/tinc.conf
现在添加以下行:
Name = externalnyc AddressFamily = ipv4 Interface = tun0
这只是配置了一个名为 externalnyc 的节点,其网络接口将使用名为“tun0”的 IPv4。 保存并退出。
接下来,让我们创建一个 externalnyc 主机配置文件:
sudo vi /etc/tinc/netname/hosts/externalnyc
添加以下行(在此处替换您的 VPS 的公共 IP 地址):
Address = externalnyc_public_IP Subnet = 10.0.0.1/32
最终,此文件将用于其他服务器上与此服务器进行通信。 地址指定其他节点将如何连接到此服务器,子网指定此守护程序将服务于哪个子网。 保存并退出。
现在使用以下命令为此主机生成公钥/私钥对:
sudo tincd -n netname -K4096
这将创建私钥 (/etc/tinc/netname/rsa_key.priv) 并将公钥附加到我们最近创建的 externalnyc 主机配置文件 (/etc/tinc/网络名/主机/externalnyc)。
现在我们必须创建 tinc-up
,这个脚本将在我们的 netname VPN 启动时运行。 现在打开文件进行编辑:
sudo vi /etc/tinc/netname/tinc-up
添加以下行:
#!/bin/sh ifconfig $INTERFACE 10.0.0.1 netmask 255.255.255.0
当我们启动我们的 VPN 时,该脚本将运行以创建我们的 VPN 将使用的网络接口。 在 VPN 上,此服务器的 IP 地址为 10.0.0.1。
让我们创建一个脚本来在我们的 VPN 停止时删除网络接口:
sudo vi /etc/tinc/netname/tinc-down
添加以下行:
#!/bin/sh ifconfig $INTERFACE down
保存并退出。
最后,使 tinc 网络脚本可执行:
sudo chmod 755 /etc/tinc/netname/tinc-*
保存并退出。
让我们继续我们的其他节点。
配置 internalnyc 和 ams1
这些步骤在 internalnyc 和 ams1 上都是必需的,但会有细微的变化。
在 internalnyc 和 ams1 上,为我们的 VPN 创建名为“netname”的配置目录结构并编辑 Tinc 配置文件:
sudo mkdir -p /etc/tinc/netname/hosts sudo vi /etc/tinc/netname/tinc.conf
添加以下行(将名称替换为节点名称):
Name = node_name AddressFamily = ipv4 Interface = tun0 ConnectTo = externalnyc
这些节点被配置为尝试连接到“externalnyc”(我们在此之前创建的节点)。 保存并退出。
接下来,让我们创建主机配置文件:
sudo vi /etc/tinc/netname/hosts/node_name
对于 internalnyc,添加以下行:
Subnet = 10.0.0.2/32
对于 ams1,添加以下行:
Subnet = 10.0.0.3/32
请注意,数字不同。 保存并退出。
接下来,生成密钥对:
sudo tincd -n netname -K4096
并创建网络接口启动脚本:
sudo vi /etc/tinc/netname/tinc-up
对于 internalnyc,添加以下行:
ifconfig $INTERFACE 10.0.0.2 netmask 255.255.255.0
对于 ams1,添加以下行:
ifconfig $INTERFACE 10.0.0.3 netmask 255.255.255.0
这些 IP 地址是在 VPN 上访问这些节点的方式。 保存并退出。
现在创建网络接口停止脚本:
sudo vi /etc/tinc/netname/tinc-down
并添加这一行:
ifconfig $INTERFACE down
保存并退出。
最后,使 tinc 网络脚本可执行:
sudo chmod 755 /etc/tinc/netname/tinc-*
保存并退出。
现在我们必须将主机配置文件分发到每个节点。
分发密钥
如果您碰巧使用配置管理系统,这里有一个很好的应用程序。 最低限度,想要与另一个节点直接通信的每个节点都必须交换公钥,这些公钥位于主机配置文件中。 例如,在我们的例子中,只有 externalnyc 需要与其他节点交换公钥。 如果您只是将每个公钥复制到节点的所有成员,则更易于管理。 请注意,当将 externalnyc 的主机配置文件中的“地址”值复制到 internalnyc 时,您需要将其更改为私有 IP 地址,以便通过专用网络。
因为我们的VPN叫做“netname”,这里是hosts配置文件的位置:/etc/tinc/netname/hosts
在 externalnyc 和 internalnyc 之间交换密钥
在 internalnyc 上,将其主机配置文件复制到 externalnyc:
scp /etc/tinc/netname/hosts/internalnyc user@externalnyc_private_IP:/tmp
然后在 externalnyc 上,将 internalnyc 的文件复制到适当的位置:
cd /etc/tinc/netname/hosts; sudo cp /tmp/internalnyc .
然后再次在 externalnyc 上,将其主机配置文件复制到 internalnyc:
scp /etc/tinc/netname/hosts/externalnyc user@internalnyc_private_IP:/tmp
在 internalnyc 上,将 externalnyc 的文件复制到适当的位置:
cd /etc/tinc/netname/hosts; sudo cp /tmp/externalnyc .
在 internalnyc 上,让我们编辑 externalnyc 的主机配置文件,以便将“地址”字段设置为 externalnyc 的私有 IP 地址(这样 internalnyc 将连接到VPN 通过专用网络)。 编辑 externalnyc 的主机配置文件:
sudo vi /etc/tinc/netname/hosts/externalnyc
将“地址”值更改为 externalnyc 的私有 IP 地址:
Address = externalnyc_private_IP
保存并退出。 现在让我们继续讨论剩下的节点 ams1。
externalnyc 和 ams1 之间的交换密钥
在 ams1 上,将其主机配置文件复制到 externalnyc:
scp /etc/tinc/netname/hosts/ams1 user@externalnyc_public_IP:/tmp
然后在 externalnyc 上,将 ams1 的文件复制到适当的位置:
cd /etc/tinc/netname/hosts; sudo cp /tmp/ams1 .
然后再次在 externalnyc 上,将其主机配置文件复制到 ams1:
scp /etc/tinc/netname/hosts/externalnyc user@ams1_public_IP:/tmp
在 ams1 上,将 externalnyc 的文件复制到适当的位置:
cd /etc/tinc/netname/hosts; sudo cp /tmp/externalnyc .
在其他节点之间交换密钥
如果您正在创建更大的 VPN,现在是在其他节点之间交换密钥的好时机。 请记住,如果您希望两个节点直接相互通信(之间没有转发服务器),它们需要交换它们的密钥/主机配置文件,并且它们需要能够访问彼此的真实网络接口。 此外,只需将每个主机配置复制到 VPN 中的每个节点即可。
测试我们的配置
在 each 节点上,从 externalnyc 开始,以调试模式启动 Tinc,如下所示(netname 是我们 VPN 的名称):
sudo tincd -n netname -D -d3
在每个节点上启动守护程序后,您应该会看到每个节点连接到 externalnyc 时的名称输出。 现在让我们测试通过 VPN 的连接。
在一个单独的窗口中,在 ams1 上,ping internalnyc 的 VPN IP 地址(我们之前分配给 10.0.0.2):
ping 10.0.0.2
ping 应该可以正常工作,并且您应该在其他窗口中看到一些有关 VPN 连接的调试输出。 这表明 ams1 能够通过 VPN 通过 externalnyc 到 internalnyc 进行通信。 按 CTRL-C 退出 ping。
您还可以使用 VPN 接口进行任何其他网络通信,例如应用程序连接、复制文件和 SSH。
在每个 Tinc 守护程序调试窗口中,按 CTRL-\ 退出守护程序。
注意:如果连接不起作用,请确保您的防火墙没有阻止连接或转发。
将 Tinc 配置为在引导时启动
在 Tinc 初始化脚本正常运行之前,我们必须将我们的 VPN 名称放入 nets.boot
配置文件中。
在 每个节点 上,编辑 nets.boot:
sudo vi /etc/tinc/nets.boot
将您的 VPN 的名称添加到此文件中。 我们的是“网名”:
# This file contains all names of the networks to be started on system startup. netname
保存并退出。 Tinc 现在配置为在启动时启动,并且可以通过 service
命令进行控制。 如果您想启动它,现在在每个节点上运行以下命令:
sudo service tinc start
恭喜! 您的 Tinc VPN 已设置完毕。
结论
现在您已经完成了本教程,您应该有一个良好的基础来构建您的 VPN 以满足您的需求。 Tinc 非常灵活,任何节点都可以配置为连接到任何其他节点(它可以通过网络访问),因此它可以充当网状 VPN,而不依赖于单个节点。
祝你好运!