本教程适用于以下操作系统版本
- Ubuntu 22.04(Jammy Jellyfish)
- Ubuntu 16.04(Xenial Xerus)
本页内容
- 先决条件
- 安装 Tinc VPN
- 配置 UFW 防火墙
- 配置 Tinc VPN 服务器 配置第一台服务器:tinc-ubuntu 配置第二台服务器:client1 配置第三台服务器:client2
- 主机/服务器之间的密钥交换
- 测试对等 VPN 服务器
- 启动并启用 Tinc VPN 服务
- 结论
- 配置第一台服务器:tinc-ubuntu
- 配置第二台服务器:client1
- 配置第三台服务器:client2
Tinc 是一款免费的开源 VPN 软件,可用于创建网状(mesh)VPN 网络。它是一个体积小巧但功能强大的 VPN 守护进程,可安装在多种平台上。Tinc 使用加密与隧道技术,在多个主机之间构建安全的私有网络。
Tinc 还提供加密、压缩以及自动网状路由等额外功能。这使您能够在不同地理位置的服务器之间创建安全且分布式的私有网络。
在本教程中,您将使用多台 Ubuntu 22.04 服务器,借助 tinc 搭建一个对等(peer-to-peer)VPN 服务器。您将使用三台不同的服务器搭建对等 VPN,每台服务器都能够通过安全的 VPN 连接相互通信。
在本教程结束时,您将验证 tinc 对等 VPN 的安装,确保每台服务器都能通过安全的内部 VPN 连接相互通信。
先决条件
要完成本教程,您必须满足以下要求:
- 两台或更多运行 Ubuntu 22.04 服务器操作系统的 Linux 服务器。
- 一个具有 sudo/root 管理员权限的非 root 用户。
本示例使用了三台不同的 Ubuntu 服务器。下面是各服务器的详细信息:
Hostname Extrernal IP ------------------------------ tinc-ubuntu 192.168.5.30 client1 192.168.5.120 client2 192.168.5.122
至此,准备工作完成。当上述条件就绪后,您就可以在每台服务器上开始安装 tinc 了。
安装 Tinc VPN
tinc 是一个体积小巧且功能强大的虚拟专用网络(VPN)守护进程,可安装在 Linux、BSD、MacOS 甚至 Windows 等多种操作系统上。Tinc 允许您创建网状 VPN 网络,而无需依赖中心节点。Tinc VPN 使用隧道与加密技术,在位于互联网上的主机之间构建安全的私有网络。
在此步骤中,您将在所有 Ubuntu 服务器上安装 Tinc VPN 服务器。
默认情况下,tinc 软件包已在 Ubuntu 软件仓库中提供。在开始之前,请执行下面的 'apt update' 命令来更新并刷新 Ubuntu 软件包索引。
sudo apt update
使用以下 apt 命令,验证 Ubuntu 22.04 软件仓库中提供的 'tinc' 软件包。
sudo apt info tinc
在撰写本文时,Ubuntu 22.04 软件仓库提供的是 tinc v1.0.36。
输出:

执行下面的 'apt install' 命令安装 'tinc' 软件包。当出现提示时,输入 y 确认并按下 ENTER 继续。
sudo apt install tinc
输出:

在完成 tinc VPN 安装后,接下来您将配置 ufw 防火墙,并开放 tinc 将要使用的默认端口。
配置 UFW 防火墙
在此步骤中,您将在所有 Ubuntu 服务器上配置默认的 ufw 防火墙。您将添加 OpenSSH 服务、添加 tinc VPN 端口,然后启动并启用 ufw 防火墙。
首先,使用下面的 ufw 命令添加 OpenSSH 服务。输出 'Rules updated' 表示新规则已添加到 ufw。
sudo ufw allow OpenSSH
执行以下命令,添加 tinc VPN 将要使用的端口 655。
sudo ufw allow 655
现在执行以下 ufw 命令以启动并启用 ufw 防火墙。当出现提示时,输入 y 确认并按下 ENTER 继续。
sudo ufw enable
输出信息 'Firewall is active and enabled on system startup' 表示 ufw 防火墙正在运行且已启用,这意味着 ufw 也会在系统启动时自动运行。
输出:

最后,执行以下命令验证 ufw 防火墙状态。输出 'Status: active' 表示防火墙正在运行,同时所有到端口 655 的连接都已被允许。
sudo ufw status
输出:

随着 tinc VPN 的安装完成以及 ufw 防火墙在所有服务器上启用,您已经准备好在这些服务器之间搭建并配置对等 VPN 了。
配置 Tinc VPN 服务器
在此步骤中,您将通过 tinc VPN 在三台不同的 Ubuntu 服务器之间搭建对等 VPN 服务器。
以下是在每台服务器上必须执行的任务列表:
- 创建一个用于存储 tinc VPN 配置的新目录,以及一个用于存储详细主机配置的 'hosts' 新目录。
- 在每台服务器上创建作为 tinc 主配置的 tinc VPN 配置文件 'tinc.conf'。
- 为每台服务器创建主机配置。
- 生成 tinc VPN 将要使用的公钥和私钥。
- 创建简单的 bash 脚本,用于激活 'tinc-up' 或停用 'tinc-down' 的 VPN 接口与网络。此外,您必须使这些脚本 'tinc-up' 和 'tinc-down' 变为可执行。
了解上述内容后,现在让我们开始配置 tinc VPN 服务器。
配置第一台服务器:tinc-ubuntu
首先,您将在第一个节点/服务器 'tinc-ubuntu' 上设置 tinc。
执行以下命令,创建一个新的 VPN 项目目录 '/etc/tinc/testVPN/'。同时,在 '/etc/tinc/testVPN/' 目录中,您还将创建 'hosts' 目录。
借助 '/etc/tinc/testVPN' 目录,您将搭建一个名为 'testVPN' 的 VPN 服务器。
mkdir -p /etc/tinc/testVPN/hosts
接下来,使用以下 nano 编辑器命令创建新的 tinc VPN 配置文件 '/etc/tinc/testVPN/tinc.conf'。
nano /etc/tinc/testVPN/tinc.conf
将以下行添加到文件中。通过这些配置,您将此服务器命名为 'tinc_ubuntu',并将 tinc VPN 的接口名称设置为 'tun0',同时使用 IPv4。
此外,您必须确保 tinc VPN 节点的 'Name' 不能使用 '-'(减号)。您可以将 '-' 减号替换为 '_' 下划线。
Name = tinc_ubuntu AddressFamily = ipv4 Interface = tun0
完成后,保存并退出文件 '/etc/tinc/testVPN/tinc.conf'。
接下来,使用以下 nano 编辑器命令创建新的主机配置文件 '/etc/tinc/testVPN/hosts/tinc_ubuntu'。您必须确保主机配置文件的名称与您在 'tinc.conf' 文件中定义的该主机的 'Name' 相匹配。
nano /etc/tinc/testVPN/hosts/tinc_ubuntu
将以下行添加到文件中。其中的 'Address' 是该服务器的外部 IP 地址,'Subnet' 是将用于运行 tinc VPN 的内部 IP 地址。您可以根据您的环境更改并调整这些 IP 地址。
Address = 192.168.5.30 Subnet = 10.0.0.1/32
完成后,保存并关闭文件 '/etc/tinc/testVPN/hosts/tinc_ubuntu'。
接下来,执行以下 'tincd' 命令生成 RSA 公钥和私钥。RSA 公钥将自动保存到主机配置文件 '/etc/tinc/testVPN/hosts/tinc_ubuntu',而 RSA 私钥将保存到 '/etc/tinc/testVPN/rsa_key.priv'。
sudo tincd -n testVPN -K4096
输出:

在生成 RSA 公钥和私钥之后,接下来您将创建一个新的 bash 脚本,用于激活和停用 tinc VPN 网络。
使用以下 nano 编辑器命令创建新的 bash 脚本 '/etc/tinc/testVPN/tinc-up'。该脚本将用于激活 tinc VPN 网络接口。
sudo nano /etc/tinc/testVPN/tinc-up
将以下行添加到文件中。请务必根据您在 'tinc.conf' 文件中定义的 VPN 网络子网,修改下方 IP 地址的子网部分。
#!/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
完成后,保存并关闭文件 '/etc/tinc/testVPN/tinc-up'。
现在创建新的 bash 脚本 '/etc/tinc/testVPN/tinc-down',用于停用 tinc VPN 网络接口。
sudo nano /etc/tinc/testVPN/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
完成后,保存并关闭文件 '/etc/tinc/testVPN/tinc-down'。
现在执行以下 chmod 命令,使两个 bash 脚本 '/etc/tinc/testVPN/tinc-up' 和 '/etc/tinc/testVPN/tinc-down' 变为可执行。
sudo chmod +x /etc/tinc/testVPN/tinc-*
现在您可以通过下面的 tree 命令查看 '/etc/tinc/testVPN/' 目录下的文件列表。
tree /etc/tinc/testVPN/
您应该会看到类似如下的输出:

至此,您已完成第一台服务器 'tinc-ubuntu' 上的 tinc VPN 配置。接下来,您将在 'client1' 和 'client2' 服务器上设置 tinc VPN。
配置第二台服务器:client1
执行以下命令,创建一个新的 VPN 项目目录 '/etc/tinc/testVPN/'。同时,在 '/etc/tinc/testVPN/' 目录中,您还将创建 'hosts' 目录。
借助 '/etc/tinc/testVPN' 目录,您将搭建一个名为 'testVPN' 的 VPN 服务器。
mkdir -p /etc/tinc/testVPN/hosts
接下来,使用以下 nano 编辑器命令创建新的 tinc VPN 配置文件 '/etc/tinc/testVPN/tinc.conf'。
nano /etc/tinc/testVPN/tinc.conf
将以下行添加到文件中。通过这些配置,您将此服务器命名为 'client1',并将 tinc VPN 的接口名称设置为 'tun0',同时使用 IPv4。此外,您将允许 tinc VPN 'client1' 连接到 tinc VPN 'tinc_ubuntu' 和 'client2'。
Name = client1 AddressFamily = ipv4 Interface = tun0 ConnectTo = tinc_ubuntu ConnectTo = client2
完成后,保存并退出文件 '/etc/tinc/testVPN/tinc.conf'。
接下来,使用以下 nano 编辑器命令创建新的主机配置文件 '/etc/tinc/testVPN/hosts/client1'。您必须确保主机配置文件的名称与您在 'tinc.conf' 文件中定义的该主机的 'Name' 相匹配。
sudo nano /etc/tinc/testVPN/hosts/client1
将以下行添加到文件中。其中的 'Address' 是该服务器的外部 IP 地址,'Subnet' 是将用于运行 tinc VPN 的内部 IP 地址。您可以根据您的环境更改并调整这些 IP 地址。
Address = 192.168.5.120 Subnet = 10.0.0.2/32
完成后,保存并关闭文件 '/etc/tinc/testVPN/hosts/client1'。
接下来,执行以下 'tincd' 命令生成 RSA 公钥和私钥。RSA 公钥将自动保存到主机配置文件 '/etc/tinc/testVPN/hosts/client1',而 RSA 私钥将保存到 '/etc/tinc/testVPN/rsa_key.priv'。
sudo tincd -n testVPN -K4096
输出:

在生成 RSA 公钥和私钥之后,接下来您将创建一个新的 bash 脚本,用于激活和停用 tinc VPN 网络。
使用以下 nano 编辑器命令创建新的 bash 脚本 '/etc/tinc/testVPN/tinc-up'。该脚本将用于激活 tinc VPN 网络接口。
sudo nano /etc/tinc/testVPN/tinc-up
将以下行添加到文件中。请务必根据您在 'tinc.conf' 文件中定义的 VPN 网络子网,修改下方 IP 地址的子网部分。
#!/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
完成后,保存并关闭文件 '/etc/tinc/testVPN/tinc-up'。
现在创建新的 bash 脚本 '/etc/tinc/testVPN/tinc-down',用于停用 tinc VPN 网络接口。
sudo nano /etc/tinc/testVPN/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
完成后,保存并关闭文件 '/etc/tinc/testVPN/tinc-down'。
现在执行以下 chmod 命令,使两个 bash 脚本 '/etc/tinc/testVPN/tinc-up' 和 '/etc/tinc/testVPN/tinc-down' 变为可执行。
sudo chmod +x /etc/tinc/testVPN/tinc-*
现在您可以通过下面的 tree 命令查看节点 'client1' 上 '/etc/tinc/testVPN/' 目录下的文件列表。
tree /etc/tinc/testVPN/
您应该会看到类似如下的输出:

至此,您已完成第二台服务器 'client1' 上的 tinc VPN 配置。接下来,您将在 'client2' 服务器上设置 tinc VPN。
配置第三台服务器:client2
执行以下命令,创建一个新的 VPN 项目目录 '/etc/tinc/testVPN/'。同时,在 '/etc/tinc/testVPN/' 目录中,您还将创建 'hosts' 目录。
借助 '/etc/tinc/testVPN' 目录,您将搭建一个名为 'testVPN' 的 VPN 服务器。
mkdir -p /etc/tinc/testVPN/hosts
接下来,使用以下 nano 编辑器命令创建新的 tinc VPN 配置文件 '/etc/tinc/testVPN/tinc.conf'。
nano /etc/tinc/testVPN/tinc.conf
将以下行添加到文件中。通过这些配置,您将此服务器命名为 'client2',并将 tinc VPN 的接口名称设置为 'tun0',同时使用 IPv4。此外,您将允许 tinc VPN 'client2' 连接到 tinc VPN 'tinc_ubuntu' 和 'client1'。
Name = client2 AddressFamily = ipv4 Interface = tun0 ConnectTo = tinc_ubuntu ConnectTo = client1
完成后,保存并退出文件 '/etc/tinc/testVPN/tinc.conf'。
接下来,使用以下 nano 编辑器命令创建新的主机配置文件 '/etc/tinc/testVPN/hosts/client2'。您必须确保主机配置文件的名称与您在 'tinc.conf' 文件中定义的该主机的 'Name' 相匹配。
sudo nano /etc/tinc/testVPN/hosts/client2
将以下行添加到文件中。其中的 'Address' 是该服务器的外部 IP 地址,'Subnet' 是将用于运行 tinc VPN 的内部 IP 地址。您可以根据您的环境更改并调整这些 IP 地址。
Address = 192.168.5.122 Subnet = 10.0.0.3/32
完成后,保存并关闭文件 '/etc/tinc/testVPN/hosts/client2'。
接下来,执行以下 'tincd' 命令生成 RSA 公钥和私钥。RSA 公钥将自动保存到主机配置文件 '/etc/tinc/testVPN/hosts/client2',而 RSA 私钥将保存到 '/etc/tinc/testVPN/rsa_key.priv'。
sudo tincd -n testVPN -K4096
输出:

在生成 RSA 公钥和私钥之后,接下来您将创建一个新的 bash 脚本,用于激活和停用 tinc VPN 网络。
使用以下 nano 编辑器命令创建新的 bash 脚本 '/etc/tinc/testVPN/tinc-up'。该脚本将用于激活 tinc VPN 网络接口。
sudo nano /etc/tinc/testVPN/tinc-up
将以下行添加到文件中。请务必根据您在 'tinc.conf' 文件中定义的 VPN 网络子网,修改下方 IP 地址的子网部分。
#!/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
完成后,保存并关闭文件 '/etc/tinc/testVPN/tinc-up'。
现在创建新的 bash 脚本 '/etc/tinc/testVPN/tinc-down',用于停用 tinc VPN 网络接口。
sudo nano /etc/tinc/testVPN/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
完成后,保存并关闭文件 '/etc/tinc/testVPN/tinc-down'。
现在执行以下 chmod 命令,使两个 bash 脚本 '/etc/tinc/testVPN/tinc-up' 和 '/etc/tinc/testVPN/tinc-down' 变为可执行。
sudo chmod +x /etc/tinc/testVPN/tinc-*
现在您可以通过下面的 tree 命令查看节点 'client2' 上 '/etc/tinc/testVPN/' 目录下的文件列表。
tree /etc/tinc/testVPN/
您应该会看到类似如下的输出:

至此,您已完成所有 Ubuntu 服务器上的 tinc VPN 配置。在下一步中,您将通过 scp(基于 SSH 的安全复制)将保存在主机配置中的 RSA 公钥分发到每台服务器。
主机/服务器之间的密钥交换
在此步骤中,您将通过 SCP 将每台服务器上的主机配置文件互相复制给对方。其中包括保存在主机配置文件中的 RSA 公钥。
以下是您需要复制的主机文件的详细信息:
- 将主机文件从 'tinc-ubuntu' 服务器复制到 client1 和 client2 服务器。
- 将主机文件从 'client1' 服务器复制到 tinc-ubuntu 和 client2 服务器。
- 将主机文件从 'client2' 服务器复制到 tinc-ubuntu 和 client1 服务器。
至此完成。
在 'tinc-ubuntu' 服务器上,执行以下 scp 命令,将主机文件 '/etc/tinc/testVPN/hosts/tinc_ubuntu' 复制到 client1 和 client2 两台服务器。目标目录必须是 '/etc/tinc/testVPN/hosts/'。
scp /etc/tinc/testVPN/hosts/tinc_ubuntu
[email protected]
:/etc/tinc/testVPN/hosts/
scp /etc/tinc/testVPN/hosts/tinc_ubuntu
[email protected]
:/etc/tinc/testVPN/hosts/
输出:

在 'client1' 服务器上,执行以下 scp 命令,将主机文件 '/etc/tinc/testVPN/hosts/client1' 复制到 tinc-ubuntu 和 client2 两台服务器。目标目录必须是 '/etc/tinc/testVPN/hosts/'。
scp /etc/tinc/testVPN/hosts/client1
[email protected]
:/etc/tinc/testVPN/hosts/
scp /etc/tinc/testVPN/hosts/client1
[email protected]
:/etc/tinc/testVPN/hosts/
输出:

在 'client2' 服务器上,执行以下 scp 命令,将主机文件 '/etc/tinc/testVPN/hosts/client2' 复制到 tinc-ubuntu 和 client2 两台服务器。目标目录必须是 '/etc/tinc/testVPN/hosts/'。
scp /etc/tinc/testVPN/hosts/client2
[email protected]
:/etc/tinc/testVPN/hosts/
scp /etc/tinc/testVPN/hosts/client2
[email protected]
:/etc/tinc/testVPN/hosts/
输出:

至此,您将在每台服务器的 '/etc/tinc/testVPN/hosts/' 目录中看到三个主机文件。使用下面的 tree 命令验证 '/etc/tinc/testVPN/hosts/' 下的文件列表。
tree /etc/tinc/testVPN/hosts/
输出——您应该在每台服务器上都能看到主机文件 'tinc_ubuntu'、'client1' 和 'client2'。

至此,您已在所有服务器上配置了 tinc VPN,并且主机文件与 RSA 公钥已复制到所有服务器。接下来,您就可以验证 tinc VPN 的安装,确认多个节点/服务器之间能够实现对等连接。
测试对等 VPN 服务器
在此步骤中,您将通过命令行手动运行 tinc,并使用 tinc VPN 服务器的 tun0 接口的本地 IP 地址,从一台服务器 ping 另一台服务器,来验证 tinc VPN 的安装。
在每台服务器上使用以下命令运行 tinc VPN 服务器。
sudo tincd -n testVPN -D -d3
下面是来自三台 Ubuntu 服务器(tinc-ubuntu、client1 和 client2)的详细输出。

接下来,打开一个新的终端会话,并连接到 'tinc-ubuntu' 服务器。然后,使用 ping 命令测试 client1 的内部 IP 地址 '10.0.0.2' 和 client2 的内部 IP 地址 '10.0.0.3'。
ping 10.0.0.1 -c3
ping 10.0.0.2 -c3
成功后,您应该能够从每台服务器收到回复。

现在打开一个新的终端会话,并连接到 'client1' 服务器。然后,使用 ping 命令测试 tinc-ubuntu 的内部 IP 地址 '10.0.0.1' 和 client2 的内部 IP 地址 '10.0.0.3'。
ping 10.0.0.1 -c3
ping 10.0.0.3 -c3
成功后,您应该能够从每台服务器收到回复。

最后,再次打开一个新的终端会话,连接到 'client2' 服务器。然后,使用 ping 命令测试 tinc-ubuntu 的内部 IP 地址 '10.0.0.1' 和 client1 的内部 IP 地址 '10.0.0.2'。
ping 10.0.0.1 -c3
ping 10.0.0.2 -c3
成功后,您应该能够从每台服务器收到回复。

现在每台服务器都能够通过 tinc VPN 提供的内部 IP 地址相互连接。这意味着用于搭建对等 VPN 服务器的 tinc VPN 部署已成功完成。
返回每个终端会话,并在终端中按下 'Ctrl + \' 以停止 tinc VPN 进程。在下一步中,您将把 tinc VPN 作为 systemd 服务启动并启用。
启动并启用 Tinc VPN 服务
执行以下 systemctl 命令以启动并启用 tinc VPN 服务。请务必在所有 Ubuntu 服务器上运行此命令。在本示例中,VPN 名称为 'testVPN'。您可以将此名称替换为您喜欢的名称。
至此,tinc VPN 服务器应在后台运行,并将在系统启动时自动启动。
sudo systemctl start tinc@testVPN
sudo systemctl enable tinc@testVPN
通过输入以下 systemctl 命令来验证 tinc VPN 服务。
sudo systemctl status tinc@testVPN
您应该会收到类似如下的输出——输出 'active (running)' 表示 tinc VPN 正在运行,而输出 '...; enabled;...' 表示 tinc VPN 已启用,并将在系统启动时自动运行。

您还可以验证由 tinc VPN 服务器创建的 tun0 接口。在每台服务器上输入以下 ip 命令来检查 tun0 接口的详细信息。
ip addr show tun0
在 'tinc-ubuntu' 服务器上,您应该能看到 IP 地址为 10.0.0.1 的 tun0 接口;在 'client1' 主机上,您应该能看到 IP 地址为 10.0.0.2 的 tun0 接口;最后,在 client2 主机上,您应该能看到 IP 地址为 10.0.0.3 的 tun0 接口。
结论
在本教程中,您学习了如何在 Ubuntu 22.04 服务器上使用 tinc VPN 服务器创建并搭建对等 VPN。您还了解了在多台 Ubuntu 服务器上启用防火墙的情况下搭建 tinc VPN 的详细过程。
Tinc 是一款简单但功能强大的 VPN 服务器软件,可安装在多种操作系统上。您可以向当前的 tinc VPN 部署中添加更多服务器/节点。此外,您还可以创建不依赖中心节点的网状 VPN。
有关 tinc VPN 服务器的更多信息,请参阅 tinc 官方文档。