来自:https://www.digitalocean.com/community/tutorials/how-to-install-tinc-and-set-up-a-basic-vpn-on-ubuntu-14-04
视频:https://youtu.be/Im2DfDzowkM?si=H-E3sQSFlIrrr4Hk
在本教程中,我们将介绍如何使用 Tinc(一个开源虚拟专用网络 (VPN) 守护程序)来创建一个安全的 VPN,您的服务器可以在该 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):Initial Server Setup with Ubuntu 14.04。
如果您计划在自己的环境中使用它,则必须规划您的服务器需要如何相互访问,并根据您自己的需要调整本教程中提供的示例。如果您要根据自己的设置进行调整,请务必将示例中突出显示的值替换为您自己的值。
如果您想完全按照本教程进行操作,请在同一数据中心中创建两个具有专用网络的 VPS,并在单独的数据中心中创建另一个 VPS。我们将在 NYC2 数据中心创建两个 VPS,在 AMS2 数据中心创建一个 VPS,名称如下:
这是我们要设置的 VPN 的图表(先决条件中描述):

绿色代表我们的VPN,灰色代表公共互联网,橙色代表专用网络。即使 ams1 无法访问专用网络,所有三台服务器都可以在 VPN 上进行通信。
让我们开始安装 Tinc!
在要加入专用网络的每个 VPS 上,安装 Tinc。让我们从更新 apt 开始:
apt-get update
然后通过apt安装Tinc:
apt-get install tinc nano net-tools -y
现在Tinc已经安装好了,让我们看看Tinc的配置。
Tinc 使用“网络名称”来区分一个 Tinc VPN 与另一个(如果有多个 VPN),即使您只计划配置一个 VPN,也建议使用网络名称。我们将我们的 VPN 称为“网络名”为了简单起见。
成为我们 VPN 一部分的每台服务器都需要以下三个配置组件:
让我们从配置externalnyc节点开始。
在externalnyc上,为我们的 VPN 创建名为“netname”的配置目录结构:
mkdir -p /etc/tinc/netname/hosts
现在打开tinc.conf进行编辑:
vi /etc/tinc/netname/tinc.conf
现在添加以下行:
Name = externalnyc
AddressFamily = ipv4
Interface = tun0
Port=755
这只是配置一个名为externalnyc,具有将使用 IPv4 的网络接口,称为“tun0”。保存并退出。
接下来,让我们创建一个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/netname/hosts/ externalnyc )。
现在我们必须创建,每当我们的网络名VPN 启动tinc-up时都会运行的脚本。现在打开文件进行编辑:
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上,为我们的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 称为“网络名”,所以这里是主机配置文件的位置:/etc/tinc/netname/hosts
在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的主机配置文件,将“Address”字段设置为externalnyc的私有IP地址(这样internalnyc将通过私有网络连接到VPN)。编辑externalnyc的主机配置文件:
sudo vi /etc/tinc/netname/hosts/externalnyc
将“Address”值更改为externalnyc的私有 IP 地址:
Address = externalnyc_private_IP
保存并退出。现在让我们继续讨论剩下的节点 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 中的每个节点即可。
在每个节点上,从externalnyc开始,在调试模式下启动 Tinc,如下所示(网络名称是我们 VPN 的名称):
sudo tincd -n netname -D -d3
在每个节点上启动守护程序后,您应该会看到包含每个节点连接到 externalnyc 时的名称的输出。现在让我们测试 VPN 上的连接。
在一个单独的窗口中,在ams1上,对 internalnyc 的 VPN IP 地址(我们之前分配给 10.0.0.2)执行 ping 操作:
ping 10.0.0.2
ping 应该可以正常工作,并且您应该在其他窗口中看到一些有关 VPN 连接的调试输出。这表明 ams1 能够通过 VPN 通过 externalnyc 与 internalnyc 进行通信。按 CTRL-C 退出 ping。
您还可以使用 VPN 接口进行任何其他网络通信,例如应用程序连接、复制文件和 SSH。
在每个 Tinc 守护程序调试窗口中,按 CTRL-\ 退出守护程序。
注意:如果连接不起作用,请确保您的防火墙没有阻止连接或转发。
在 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,而不依赖于单个节点。
祝你好运!