在本教程中,我们将介绍如何使用 Tinc(一个开源虚拟专用网络 (VPN) 守护程序)来创建一个安全的 VPN,您的服务器可以在该 VPN 上进行通信,就像在本地网络上一样。我们还将演示如何使用 Tinc 建立通往专用网络的安全隧道。我们将使用 Ubuntu 14.04 服务器,但配置可以调整以用于任何其他操作系统。
Tinc 的一些实用功能包括加密、可选压缩、自动网状路由(VPN 流量直接在通信服务器之间路由,如果可能)和轻松扩展。这些功能将 Tinc 与 OpenVPN 等其他 VPN 解决方案区分开来,并使其成为在地理上分布的许多小型网络中创建 VPN 的良好解决方案。许多操作系统都支持 Tinc,包括 Linux、Windows 和 Mac OS X。
Note:如果您想快速轻松地设置 Tinc 网状 VPN,请查看本教程:如何使用 Ansible 和 Tinc VPN 保护您的服务器基础设施.
要完成本教程,您需要至少三台 Ubuntu 14.04 服务器上的 root 访问权限。可在此处找到设置 root 访问权限的说明(步骤 3 和 4):使用 Ubuntu 14.04 进行初始服务器设置.
如果您计划在自己的环境中使用它,则必须规划您的服务器需要如何相互访问,并根据您自己的需要调整本教程中提供的示例。如果您要根据自己的设置进行调整,请务必将示例中突出显示的值替换为您自己的值。
如果您想完全按照本教程进行操作,请在同一数据中心中创建两个具有专用网络的 VPS,并在单独的数据中心中创建另一个 VPS。我们将在 NYC2 数据中心创建两个 VPS,在 AMS2 数据中心创建一个 VPS,名称如下:
-
外部纽约:所有 VPN 节点都将连接到此服务器,并且必须保持连接才能正常运行 VPN 功能。如果需要,可以采用与此类似的方式配置其他服务器以提供冗余。
-
内部纽约:连接到外部纽约VPN 节点使用其private网络接口
-
ams1:连接到外部纽约公共互联网上的 VPN 节点
这是我们要设置的 VPN 的图表(先决条件中描述):
绿色代表我们的VPN,灰色代表公共互联网,橙色代表专用网络。即使 ams1 无法访问专用网络,所有三台服务器都可以在 VPN 上进行通信。
让我们开始安装 Tinc!
在要加入专用网络的每个 VPS 上,安装 Tinc。让我们从更新 apt 开始:
sudo apt-get update
然后通过apt安装Tinc:
sudo apt-get install tinc
现在Tinc已经安装好了,让我们看看Tinc的配置。
Tinc uses a “netname” to distinguish one Tinc VPN from another (in case of multiple VPNs), and it is recommended to use a netname even if you are only planning on configuring one VPN. We will call our VPN “netname” for simplicity.
成为我们 VPN 一部分的每台服务器都需要以下三个配置组件:
- 配置文件:例如tinc.conf、tinc-up和tinc-down
- 公钥/私钥对:用于加密和节点身份验证
- 主机配置文件:包含公钥和其他 VPN 配置
让我们从配置我们的外部纽约 node.
On 外部纽约,为我们的 VPN 创建名为“netname”的配置目录结构:
sudo mkdir -p /etc/tinc/netname/hosts
现在打开tinc.conf进行编辑:
sudo vi /etc/tinc/netname/tinc.conf
现在添加以下行:
Name = externalnyc
AddressFamily = ipv4
Interface = tun0
This simply configures a node called externalnyc, with a network interface that will use IPv4 called “tun0”. Save and quit.
接下来,让我们创建一个外部纽约主机配置文件:
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) 并将公钥附加到外部纽约我们最近创建的主机配置文件(/etc/tinc/netname/hosts/外部纽约).
现在我们必须创建tinc-up
,每当我们的netnameVPN 已启动。现在打开文件进行编辑:
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-*
保存并退出。
让我们继续讨论其他节点。
两者都需要执行这些步骤内部纽约 and ams1,略有变化,将被注意到。
On 内部纽约 and 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
For 内部纽约,添加这一行:
Subnet = 10.0.0.2/32
For ams1,添加这一行:
Subnet = 10.0.0.3/32
请注意,数字不同。保存并退出。
接下来,生成密钥对:
sudo tincd -n netname -K4096
并创建网络接口启动脚本:
sudo vi /etc/tinc/netname/tinc-up
For 内部纽约,添加这一行:
ifconfig $INTERFACE 10.0.0.2 netmask 255.255.255.0
For 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-*
保存并退出。
现在我们必须将主机配置文件分发到每个节点。
如果您碰巧使用配置管理系统,这里是一个很好的应用程序。至少,想要与另一个节点直接通信的每个节点都必须交换公钥,该公钥位于主机配置文件内。以我们的例子为例,只有外部纽约需要与其他节点交换公钥。如果您只需将每个公钥复制到节点的所有成员,管理起来会更容易。请注意,您需要更改中的“地址”值外部纽约的主机配置文件复制到其私有IP地址时内部纽约,以便通过专用网络建立连接。
Because our VPN is called “netname”, here is the location of the hosts configuration files: /etc/tinc/netname/hosts
On 内部纽约,将其hosts配置文件复制到外部纽约:
scp /etc/tinc/netname/hosts/internalnyc user@externalnyc_private_IP:/tmp
Then on 外部纽约,复制内部纽约的文件到适当的位置:
cd /etc/tinc/netname/hosts; sudo cp /tmp/internalnyc .
Then on 外部纽约再次将其主机配置文件复制到内部纽约:
scp /etc/tinc/netname/hosts/externalnyc user@internalnyc_private_IP:/tmp
On 内部纽约, copy 外部纽约的文件到适当的位置:
cd /etc/tinc/netname/hosts; sudo cp /tmp/externalnyc .
On 内部纽约,我们来编辑一下外部纽约的主机配置文件,因此“地址”字段设置为外部纽约的私有IP地址(因此internalnyc将通过私有网络连接到VPN)。编辑外部纽约的主机配置文件:
sudo vi /etc/tinc/netname/hosts/externalnyc
将“地址”值更改为外部纽约的私有IP地址:
Address = externalnyc_private_IP
保存并退出。现在让我们继续讨论剩下的节点 ams1。
On ams1,将其hosts配置文件复制到外部纽约:
scp /etc/tinc/netname/hosts/ams1 user@externalnyc_public_IP:/tmp
Then on 外部纽约,复制ams1的文件到适当的位置:
cd /etc/tinc/netname/hosts; sudo cp /tmp/ams1 .
Then on 外部纽约再次将其主机配置文件复制到ams1:
scp /etc/tinc/netname/hosts/externalnyc user@ams1_public_IP:/tmp
On ams1, copy 外部纽约的文件到适当的位置:
cd /etc/tinc/netname/hosts; sudo cp /tmp/externalnyc .
如果您要创建更大的 VPN,那么现在是在其他节点之间交换密钥的好时机。请记住,如果您希望两个节点直接相互通信(之间没有转发服务器),它们需要交换其密钥/主机配置文件,并且需要能够访问彼此的真实网络接口。此外,只需将每个主机配置复制到 VPN 中的每个节点即可。
On each节点,开始于外部纽约,在调试模式下启动 Tinc,如下所示(网络名称是我们 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-\ 退出守护程序。
Note:如果连接不起作用,请确保您的防火墙没有阻止连接或转发。
在 Tinc 初始化脚本正常运行之前,我们必须将 VPN 的名称放入nets.boot
配置文件。
On 每个节点,编辑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,而不依赖于单个节点。
祝你好运!