介绍

Tinc 是一个开源的 Virtual Private Network (VPN) 守护程序,具有有用的功能,例如加密、可选压缩和自动网状路由,可以机会性地在服务器之间直接路由 VPN 流量。这些功能将 tinc 与其他 VPN 解决方案区分开来,使其成为从许多地理上分散的小型网络中创建 VPN 的不错选择。

在本教程中,我们将介绍如何使用 tinc 创建一个安全的 VPN,您的服务器可以在该 VPN 上进行通信,就好像它们在本地网络上一样。我们还将演示如何使用 tinc 设置进入专用网络的安全隧道。我们将使用 Ubuntu 18.04 服务器,但可以调整配置以与任何其他操作系统一起使用。

目标

为了涵盖多个用例,本教程概述了如何通过专用网络接口将一个客户端节点连接到 VPN,并通过公共网络接口将另一个客户端节点连接到 VPN。但是,您可以调整此设置以满足您自己的需要。您只需要计划好您希望您的服务器如何相互访问,并根据您自己的需要调整本教程中提供的示例。如果您要根据自己的设置进行调整,请务必将示例中突出显示的值替换为您自己的值。不过,您可能会感兴趣,首先按照编写的教程进行操作,以确保您在修改这些说明之前了解所涉及的组件和流程。

为了帮助保持清晰,本教程将引用这样的服务器:

  • server-01:所有 VPN 节点都将连接到这台机器,并且必须保持连接才能正常运行 VPN。如果需要,可以以与此服务器相同的方式配置其他服务器以提供冗余

  • client-01:使用其 private 网络接口连接到 server-01 VPN 节点

  • client-02:通过_public_网络接口连接到server-01 VPN节点

注意:Tinc 本身不区分服务器(托管和提供 VPN 服务的机器)和客户端(连接并使用安全专用网络的机器),但它有助于理解和可视化 tinc 如何通过像这样考虑您的服务器来工作。

这是我们要设置的 VPN 的示意图:

Tinc VPN 设置

蓝色框代表我们的 VPN,粉红色代表底层专用网络。所有三台服务器都可以在 VPN 上进行通信,即使 client-02 无法访问专用网络。

先决条件

如果您想完全按照本教程进行操作,请在同一数据中心配置两台 Ubuntu 18.04 服务器(server-01client-01)并[启用私有网络](https://www.digitalocean .com/docs/networking/private-networking/how-to/)。然后,在单独的数据中心创建另一个 Ubuntu 18.04 服务器 (client-02)。每个服务器都应该有一个管理用户和一个配置了“ufw”的防火墙。要进行设置,请按照我们的 Ubuntu 18.04 初始服务器设置指南。

此外,在本教程的后面,我们需要使用 scp 在每台机器之间传输一些文件。因此,您需要在每台服务器上生成 SSH 密钥,将 both client-01client-02 的 SSH 密钥添加到 server-01 authorized_keys 文件,然后将 server-01 的 SSH 密钥添加到 both client-01client-02authorized_keys 文件中。有关设置的帮助,请参阅我们的指南[如何在 Ubuntu 18.04 上设置 SSH 密钥](https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys-on- ubuntu-1804)。

步骤 1 — 安装 Tinc

Tinc 可从默认的 Ubuntu APT 存储库中获得,这意味着我们只需几个命令即可安装它。

如果您最近没有这样做,请在每个服务器上运行以下命令以更新它们各自的包索引:

所有服务器

sudo apt 更新

然后通过运行以下命令在每个服务器上安装 tinc **:

所有服务器

sudo apt install 我有

这样,您就已经在每台服务器上安装了 tinc。但是,您需要对每台机器上的 tinc 配置进行一些更改,才能启动并运行您的 VPN。让我们从更新 server-01 开始。

步骤 2 — 配置 Tinc 服务器

Tinc 要求将成为 VPN 一部分的每台机器都具有以下三个配置组件:

  • Tinc 配置文件:配置 tinc 守护程序的三个不同文件:

  • tinc.conf,它定义了网络名称、运行 VPN 的网络设备以及其他 VPN 选项;

  • tinc-up,在启动 tinc 后激活 tinc.conf 中定义的网络设备的脚本;

  • tinc-down,当 tinc 停止时,它会停用网络设备。

  • 公钥/私钥对:Tinc 使用公钥/私钥对来确保只有拥有有效密钥的用户才能访问 VPN。

  • 主机配置文件:VPN 上的每台机器(或主机)都有自己的配置文件,其中包含主机的实际 IP 地址和 tinc 为其提供服务的子网

Tinc 使用 netname 来区分一个 tinc VPN 和另一个。这在您想要设置多个 VPN 的情况下很有帮助,但建议您使用网络名称,即使您只计划配置一个 VPN。您可以为您的 VPN 指定您喜欢的任何网络名称,但为简单起见,我们将 VPN 称为“网络名称”。

server-01 上,为 VPN 创建配置目录结构:

服务器-01

sudo mkdir -p /etc/tinc/netname/hosts

使用您喜欢的文本编辑器创建一个 tinc.conf 文件。在这里,我们将使用 nano:

服务器-01

Sudo nano / et c / chin c / nett lick / chin c。 conf

将以下行添加到空文件中。这些配置了一个名为 server_01 的 tinc 节点和一个名为 tun0 的网络接口,它将使用 IPv4:

server-01:/etc/tinc/netname/tinc.conf

名称 u003d server_01
地址家庭 u003d ipv4
接口 u003d tun0

警告: 请注意 Name 指令后的值如何包含下划线 (_) 而不是连字符 (-)。这很重要,因为 tinc 要求 Name 值仅包含字母数字或下划线字符。如果您在此处使用连字符,则在本指南后面尝试启动 VPN 时会遇到错误。

添加这些行后保存并关闭文件。如果您使用 nano,请按 CTRL+XY,然后按 ENTER

接下来,在 hosts 子目录中创建一个名为 server_01 的主机配置文件。最终,客户端节点将使用此文件与 server-01 进行通信:

服务器-01

sudo nano /etc/tinc/netname/hosts/server_01

再次注意,此文件的名称包含下划线而不是连字符。这样,它与 tinc.conf 文件中的 Name 指令一致,这将允许 tinc 在我们稍后生成时自动将服务器的公共 RSA 密钥附加到该文件。

将以下行添加到文件中,确保包含 server-01 的公共 IP 地址:

server-01:/etc/tinc/netname/hosts/server_01

地址 u003d server-01_public_IP_address
子网 u003d 10.0.0.1/32

Address 字段指定其他节点将如何连接到此服务器,而 Subnet 指定此守护程序将服务于哪个子网。保存并关闭文件。

接下来,使用以下命令为此主机生成一对公钥和私钥:

服务器-01

sudo tincd -n 网络名 -K4096

运行此命令后,系统会提示您输入 tinc 将保存公钥和私钥的文件名:

输出。 . .
请输入文件以将 RSA 私钥保存到 [/etc/tinc/netname/rsa_key.priv]:
请输入文件以将公共 RSA 密钥保存到 [/etc/tinc/netname/hosts/server_01]:

ENTER 接受每个提示的默认位置;这样做会告诉 tinc 将私钥存储在名为“rsa_key.priv”的文件中,并将公钥附加到“server_01”主机配置文件中。

接下来,创建 tinc-up,该脚本将在 netname VPN 启动时运行:

服务器-01

sudo nano /etc/tinc/netname/tinc-up

添加以下行:

server-01:/etc/tinc/netname/tinc-up

#!/bin/sh
ip link set $INTERFACE up
ip addr add 10.0.0.1/32 dev $INTERFACE
ip route add 10.0.0.0/24 dev $INTERFACE

以下是每一行的作用:

  • ip link ...:将 tinc 的虚拟网络接口的状态设置为 up

  • ip addr ...:将网络掩码为32的IP地址10.0.0.1添加到tinc的虚拟网络接口,这将导致VPN上的其他机器看到server-01的IP地址为“10.0.0.1”

  • ip route ...:添加一个可以在 tinc 的虚拟网络接口上访问的路由(10.0.0.0/24)

添加这些行后保存并关闭文件。

接下来,创建一个脚本以在 VPN 停止时删除虚拟网络接口:

服务器-01

sudo nano /etc/tinc/netname/tinc-down

添加以下行:

server-01:/etc/tinc/netname/tinc-down

#!/bin/sh
ip route del 10.0.0.0/24 dev $INTERFACE
ip addr del 10.0.0.1/32 dev $INTERFACE
ip link set $INTERFACE down

这些行与 tinc-up 脚本中的行具有相反的效果:

  • ip route ...:删除10.0.0.0/24路由

  • ip addr ...:从 tinc 的虚拟网络接口中删除 IP 地址 10.0.0.1

  • ip link ...:设置 tinc 的虚拟网络接口状态为 down

保存并关闭文件,然后使这两个新的网络脚本可执行:

服务器-01

sudo chmod 755 /etc/tinc/netname/tinc-*

作为配置 server-01 的最后一步,添加一个防火墙规则,允许流量通过端口 655,tinc 的默认端口:

服务器-01

须藤 ufw 允许 655

server-01 现在已完全配置,您可以继续设置客户端节点。

步骤 3 — 配置客户端节点

您的两台客户端计算机都需要与服务器稍有不同的配置,尽管该过程通常非常相似。

由于我们在本指南中的目标设置,我们将配置 client-01client-02 几乎相同,它们之间只有一些细微差别。因此,此步骤中给出的许多命令必须在两台机器上运行。但请注意,如果 client-01client-02 需要特定命令或特殊配置,则这些指令将分别以蓝色或红色命令块显示。

client-01 和 client-02 上,复制您在 server-01 上创建的目录结构:

客户端 01 和客户端 02

sudo mkdir -p /etc/tinc/netname/hosts

然后创建一个 tinc.conf 文件:

客户端 01 和客户端 02

Sudo nano / et c / chin c / nett lick / chin c。 conf

将以下行添加到两台机器上的文件中:

client-01 & client-02 /etc/tinc/netname/tinc.conf

名称 u003d 节点名称
地址家庭 u003d ipv4
接口 u003d tun0
连接至 u003d server_01

请务必将 node_name 替换为相应客户端节点的名称。同样,请确保此名称使用下划线 (_) 而不是连字符。

请注意,此文件包含指向 server_01ConnectTo 指令,而 server-01tinc.conf 文件不包含此指令。通过在 server-01 上不包含 ConnectTo 语句,这意味着 server-01 将仅侦听传入连接。这适用于我们的设置,因为它不会连接到任何其他机器。

保存并关闭文件。

接下来,在每个客户端节点上创建一个主机配置文件。同样,确保文件名使用下划线而不是连字符拼写:

客户端 01 和客户端 02

sudo nano /etc/tinc/netname/hosts/node_name

对于 client-01,添加以下行:

client-01:/etc/tinc/netname/hosts/client_01

子网 u003d 10.0.0.2/32

对于 client-02,添加以下行:

client-02:/etc/tinc/netname/hosts/client_02

子网 u003d 10.0.0.3/32

请注意,每个客户端都有 tinc 将服务的不同子网。保存并关闭文件。

接下来,在每台客户端机器上生成密钥对:

客户端 01 和客户端 02

sudo tincd -n 网络名 -K4096

再次与 server-01 一样,当提示选择文件来存储 RSA 密钥时,按 ENTER 接受默认选择。

之后,在每个客户端上创建网络接口启动脚本:

客户端 01 和客户端 02

sudo nano /etc/tinc/netname/tinc-up

对于 client-01,添加以下行:

client-01:/etc/tinc/netname/tinc-up

#!/bin/sh
ip link set $INTERFACE up
ip addr 添加 10.0.0.2/32 开发 $INTERFACE
ip route add 10.0.0.0/24 dev $INTERFACE

对于 client-02,添加以下内容:

client-02:/etc/tinc/netname/tinc-up

#!/bin/sh
ip link set $INTERFACE up
ip addr add 10.0.0.3/32 dev $INTERFACE
ip route add 10.0.0.0/24 dev $INTERFACE

保存并关闭每个文件。

接下来,在每个客户端上创建网络接口停止脚本:

客户端 01 和客户端 02

sudo nano /etc/tinc/netname/tinc-down

client-01 上,将以下内容添加到空文件中:

client-01:/etc/tinc/netname/tinc-down

#!/bin/sh
ip route del 10.0.0.0/24 dev $INTERFACE
ip addr del 10.0.0.2/32 开发 $INTERFACE
ip link set $INTERFACE down

client-02 上,添加以下内容:

client-02:/etc/tinc/netname/tinc-down

#!/bin/sh
ip route del 10.0.0.0/24 dev $INTERFACE
ip addr del 10.0.0.3/32 dev $INTERFACE
ip link set $INTERFACE down

保存并关闭文件。

通过在每台客户端机器上运行以下命令**使网络脚本可执行:

客户端 01 和客户端 02

sudo chmod 755 /etc/tinc/netname/tinc-*

最后,在每个客户端**上打开端口 655:

客户端 01 和客户端 02

须藤 ufw 允许 655

在这一点上,客户端节点几乎(尽管不完全)设置完毕。他们仍然需要我们在上一步中在 server-01 上创建的公钥,以验证与 VPN 的连接。

第 4 步 — 分发密钥

每个想要与另一个节点直接通信的节点都必须交换公钥,这些公钥位于主机配置文件中。在我们的例子中,server-01 需要与其他节点交换公钥。

server-01 和 client-01 之间的交换密钥

client-01 上,将其主机配置文件复制到 server-01。因为 client-01server-01 都在同一个数据中心,并且都启用了私有网络,所以您可以在这里使用 server01 的私有 IP 地址:

客户端-01

scp /etc/tinc/netname/hosts/client_01 sammy@server-01_private_IP:/tmp

然后在server-01上,将client-01主机配置文件复制到/etc/tinc/netname/hosts/目录下:

服务器-01

sudo cp /tmp/client_01 /etc/tinc/netname/hosts/

然后,仍在 server-01 上时,将其主机配置文件复制到 client-01:

服务器-01

scp /etc/tinc/netname/hosts/server_01 user@client-01_private_IP:/tmp

client-01 上,将 server-01 的文件复制到适当的位置:

客户端-01

sudo cp /tmp/server_01 /etc/tinc/netname/hosts/

client-01 上,编辑 server-01 的主机配置文件,以便将 Address 字段设置为 server-01 的私有 IP 地址。这样,client-01 将通过专用网络连接到 VPN:

客户端-01

sudo nano /etc/tinc/netname/hosts/server_01

Address 指令更改为指向 server-01private IP 地址:

client-01:/etc/tinc/netname/hosts/server_01

地址 u003d server-01_private_IP
子网 u003d 10.0.0.1/32

保存并退出。现在让我们继续我们剩下的节点,client-02

server-01 和 client-02 之间的交换密钥

client-02 上,将其主机配置文件复制到 server-01:

客户端-02

scp /etc/tinc/netname/hosts/client_02 sammy@server-01_public_IP:/tmp

然后在 server-01 上,将 client_02 主机配置文件复制到适当的位置:

服务器-01

sudo cp /tmp/client_02 /etc/tinc/netname/hosts/

然后将server-01的主机配置文件复制到client-02:

服务器-01

scp /etc/tinc/netname/hosts/server_01 user@client-02_public_IP:/tmp

client-02 上,将 server-01 的文件复制到适当的位置:

客户端-02

sudo cp /tmp/server_01 /etc/tinc/netname/hosts/

假设你只设置了两个客户端节点,你就完成了公钥的分发。但是,如果您正在创建一个更大的 VPN,那么现在是在这些其他节点之间交换密钥的好时机。请记住,如果您希望两个节点直接相互通信(之间没有转发服务器),它们需要交换它们的密钥/主机配置文件,并且它们需要能够访问彼此的真实网络接口。此外,只需将每个主机的配置文件复制到 VPN 中的每个节点即可。

步骤 5 — 测试配置

each 节点上,从 server-01 开始,使用以下命令启动 tinc:

所有服务器

sudo tincd -n 网络名 -D -d3

该命令包括 -n 标志,它指向我们的 VPN 的网络名,netname。如果您设置了多个 VPN,并且需要指定要启动的 VPN,这将非常有用。它还包括 -D 标志,它可以防止 tinc 分叉和分离,以及禁用 tinc 的自动重启机制。最后,它包括 -d 标志,它告诉 tinc 在调试模式下运行,调试级别为 3

注意: 对于 tinc 守护进程,调试级别为 3 将显示任意两个服务器之间交换的每个请求,包括身份验证请求、密钥交换和连接列表更新。更高的调试级别显示更多有关网络流量的信息,但现在我们只关心节点是否可以相互通信,因此级别为 3 就足够了。但是,在生产场景中,您可能希望更改为较低的调试级别,以免日志文件填满磁盘。

您可以通过查看 官方文档 了解有关 tinc 调试级别的更多信息。

在每个节点上启动守护程序后,您应该会看到每个节点连接到 server-01 时的名称输出。现在让我们测试通过 VPN 的连接。

在单独的窗口中,在 client-02 上,ping client-01 的 VPN IP 地址。我们之前将其分配为“10.0.0.2”:

客户端-02

平 10.0.0.2

ping 应该可以正常工作,并且您应该在其他窗口中看到一些有关 VPN 连接的调试输出。这表明 client-02 能够通过 VPN 通过 server-01client-01 进行通信。按 CTRL+C 退出 ping。

您还可以使用 VPN 接口进行任何其他网络通信,例如应用程序连接、复制文件和 SSH。

在每个 tinc 守护程序调试窗口中,按 CTRL+\ 退出守护程序。

第 6 步 — 将 Tinc 配置为在引导时启动

Ubuntu 服务器使用“systemd”作为默认系统管理器来控制启动和运行进程。因此,我们可以使用单个 systemctl 命令启用 netname VPN 在启动时自动启动。

每个节点上运行以下命令,将 tinc VPN 设置为在机器启动时启动:

所有服务器

sudo systemctl 启用 tinc@netname

Tinc 配置为在您的每台机器上启动时启动,您可以使用 systemctl 命令控制它。如果您想立即启动它,请在每个节点上运行以下命令:

所有服务器

sudo systemctl start tinc@netname

注意:如果您有多个 VPN,您可以同时启用或启动每个 VPN,如下所示:

所有服务器

sudo systemctl start tinc@natename_01 tinc@netname_02 ... tinc@netname_n

这样,您的 tinc VPN 就已完全配置并在您的每个节点上运行。

结论

现在您已经完成了本教程,您应该有一个良好的基础来构建您的 VPN 以满足您的需求。 Tinc 非常灵活,任何节点都可以配置为连接到任何其他节点(它可以通过网络访问),因此它可以充当网状 VPN,而无需依赖单个节点。

Logo

更多推荐