介绍
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 的示意图:
蓝色框代表我们的 VPN,粉红色代表底层专用网络。 所有三个服务器都可以在 VPN 上进行通信,即使 client-02 无法访问专用网络。
先决条件
如果您想完全按照本教程进行操作,请在同一数据中心配置两台 Ubuntu 18.04 服务器(server-01 和 client-01)并 启用专用网络 在每一个上。 然后,在单独的数据中心创建另一个 Ubuntu 18.04 服务器 (client-02)。 每个服务器都应该有一个管理用户和一个配置了 ufw
的防火墙。 要进行此设置,请按照我们的 Ubuntu 18.04 初始服务器设置指南进行操作。
此外,在本教程的后面,我们需要使用 scp
在每台机器之间传输一些文件。 因此,您需要在每台服务器上生成 SSH 密钥,将 both client-01 和 client-02 的 SSH 密钥添加到server-01的authorized_keys
文件,然后将server-01的SSH密钥添加到both client-01[ X258X] 和 client-02 的 authorized_keys
文件。 有关设置的帮助,请参阅我们关于 如何在 Ubuntu 18.04 上设置 SSH 密钥的指南。
第 1 步 — 安装 Tinc
Tinc 可从默认的 Ubuntu APT 存储库中获得,这意味着我们只需几个命令即可安装它。
如果您最近没有这样做,请在每个服务器 上运行以下命令 以更新它们各自的包索引:
所有服务器
sudo apt update
然后通过运行以下命令在每个服务器 上安装 tinc :
所有服务器
sudo apt install tinc
这样,您就已经在每台服务器上安装了 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 使用 网络名 来区分一个 tinc VPN 和另一个。 这在您想要设置多个 VPN 的情况下很有帮助,但建议您使用网络名称,即使您只计划配置一个 VPN。 您可以为您的 VPN 指定您喜欢的任何网络名称,但为简单起见,我们将 VPN 称为 netname
。
在 server-01 上,为 VPN 创建配置目录结构:
服务器-01
sudo mkdir -p /etc/tinc/netname/hosts
使用您喜欢的文本编辑器创建 tinc.conf
文件。 在这里,我们将使用 nano
:
服务器-01
sudo nano /etc/tinc/netname/tinc.conf
将以下行添加到空文件中。 这些配置了一个名为 server_01
的 tinc 节点和一个名为 tun0
的网络接口,它将使用 IPv4:
server-01:/etc/tinc/netname/tinc.conf
Name = server_01 AddressFamily = ipv4 Interface = tun0
警告: 注意 Name
指令后的值如何包含下划线 (_
) 而不是连字符 (-
)。 这很重要,因为 tinc 要求 Name
值仅包含字母数字或下划线字符。 如果您在此处使用连字符,则在本指南后面尝试启动 VPN 时会遇到错误。
添加这些行后保存并关闭文件。 如果您使用 nano
,请按 CTRL+X
、Y
,然后按 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
Address = server-01_public_IP_address Subnet = 10.0.0.1/32
Address
字段指定其他节点将如何连接到此服务器,Subnet
指定此守护程序将服务于哪个子网。 保存并关闭文件。
接下来,使用以下命令为此主机生成一对公钥和私钥:
服务器-01
sudo tincd -n netname -K4096
运行此命令后,系统将提示您输入 tinc 将保存公共和私有 RSA 密钥的文件名:
Output. . . Please enter a file to save private RSA key to [/etc/tinc/netname/rsa_key.priv]: Please enter a file to save public RSA key to [/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 …
:将 IP 地址10.0.0.1
与32
的网络掩码添加到 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
sudo ufw allow 655
server-01 现在已完全配置,您可以继续设置客户端节点。
第 3 步 — 配置客户端节点
您的两台客户端计算机都需要与服务器稍有不同的配置,尽管该过程通常非常相似。
由于我们在本指南中的目标设置,我们将配置 client-01 和 client-02 几乎相同,它们之间只有一些细微差别。 因此,此步骤中给出的许多命令必须在 两台 机器上运行。 但请注意,如果 client-01 或 client-02 需要特定命令或特殊配置,则这些指令将分别显示在蓝色或红色命令块中。
在 client-01 和 client-02 上,复制您在 server-01 上创建的目录结构:
客户端 01 和客户端 02
sudo mkdir -p /etc/tinc/netname/hosts
然后创建一个tinc.conf
文件:
客户端 01 和客户端 02
sudo nano /etc/tinc/netname/tinc.conf
将以下行添加到两台机器上的文件中:
client-01 & client-02 /etc/tinc/netname/tinc.conf
Name = node_name AddressFamily = ipv4 Interface = tun0 ConnectTo = server_01
请务必将 node_name
替换为相应客户端节点的名称。 同样,请确保此名称使用下划线 (_
) 而不是连字符。
请注意,此文件包含指向 server_01
的 ConnectTo
指令,而 server-01 的 tinc.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
Subnet = 10.0.0.2/32
对于 client-02,添加以下行:
client-02:/etc/tinc/netname/hosts/client_02
Subnet = 10.0.0.3/32
请注意,每个客户端都有 tinc 将服务的不同子网。 保存并关闭文件。
接下来,在每台客户端机器上生成密钥对:
客户端 01 和客户端 02
sudo tincd -n netname -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 add 10.0.0.2/32 dev $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 dev $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
sudo ufw allow 655
在这一点上,客户端节点几乎(尽管不完全)设置完毕。 他们仍然需要我们在上一步中在 server-01 上创建的公钥,以验证与 VPN 的连接。
第 4 步 — 分发密钥
每个想要与另一个节点直接通信的节点都必须交换公钥,这些公钥位于主机配置文件中。 在我们的例子中,server-01 需要与其他节点交换公钥。
server-01 和 client-01 之间的交换密钥
在 client-01 上,将其主机配置文件复制到 server-01。 因为client-01和server-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-01 的 private IP 地址:
client-01:/etc/tinc/netname/hosts/server_01
Address = server-01_private_IP Subnet = 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 netname -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
ping 10.0.0.2
ping 应该可以正常工作,并且您应该在其他窗口中看到一些有关 VPN 连接的调试输出。 这表明 client-02 能够通过 VPN 通过 server-01 到 client-01 进行通信。 按 CTRL+C
退出 ping。
您还可以使用 VPN 接口进行任何其他网络通信,例如应用程序连接、复制文件和 SSH。
在每个 tinc 守护程序调试窗口中,按 CTRL+\
退出守护程序。
第 6 步 — 将 Tinc 配置为在启动时启动
Ubuntu 服务器使用 systemd
作为默认系统管理器来控制启动和运行进程。 因此,我们可以使用单个 systemctl
命令启用 netname
VPN 在引导时自动启动。
在 每个节点 上运行以下命令,将 tinc VPN 设置为在机器启动时启动:
所有服务器
sudo systemctl enable 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,而无需依赖单个节点。