如何在Ubuntu14.04上安装Tinc并设置基本VPN

来自菜鸟教程
跳转至:导航、​搜索

介绍

在本教程中,我们将介绍如何使用开源虚拟专用网络 (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

这些步骤在 internalnycams1 上都是必需的,但会有细微的变化。

internalnycams1 上,为我们的 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,而不依赖于单个节点。

祝你好运!