介绍
Tinc是一个开源的 虚拟私人网络 (VPN) 示威者,具有有用的功能,如加密,可选压缩和自动网格路由,可以随机地在服务器之间直接路由 VPN 流量。
在本教程中,我们将讨论如何使用Tink创建一个安全的VPN,你的服务器可以像在本地网络上一样通信。我们还将展示如何使用Tink在私人网络中设置安全隧道。
目标
为了涵盖多个使用案例,本教程概述了如何通过私人网络接口连接一个客户端节点到VPN,另一个通过公共接口。但是,您可以根据自己的需求调整此设置。您只需要计划如何让您的服务器相互访问,并将本教程中的示例适应自己的需求。如果您正在适应自己的设置,请务必将示例中突出的值替换为自己的值。然而,您可能有兴趣首先遵循教程,因为它是写的,以确保您在修改这些指令之前了解相关的组件和流程。
为了帮助保持事情清晰,本教程将引用这样的服务器:
- server-01:所有VPN节点都将连接到这个机器,并且必须保持连接以确保适当的VPN功能。 额外的服务器可以与此服务器相同地配置以提供冗余性,如果需要
- client-01:通过其 _private_网络接口
- client-02:通过 _public_网络接口 连接到 server-01 VPN节点
注:Tinc本身并不区分服务器(托管和提供VPN服务的机器)和客户端(连接和使用安全私人网络的机器),但通过思考您的服务器可以有助于理解和可视化Tinc如何工作。
以下是我们想要设置的VPN的图表:
蓝色盒子代表我们的VPN,粉红色代表底层的私人网络. 所有三台服务器都可以通过VPN进行通信,即使私人网络对 client-02是无法访问的。
前提条件
如果您想准确地遵循本教程,请在同一个数据中心配置两个Ubuntu 18.04服务器(server-01和 client-01)并在每个服务器上启用私人网络(https://www.digitalocean.com/docs/networking/private-networking/how-to/),然后在单独的数据中心创建另一个Ubuntu 18.04服务器(client-02)。
因此,您需要在每个服务器上生成SSH密钥,将 both client-01和 client-02的SSH密钥添加到 server-01的授权_keys
文件中,然后将 server-01的SSH密钥添加到 both client-01和 client-02的授权_keys
文件中。
步骤1:安装Tinc
Tinc 可从默认的 Ubuntu APT 存储库中使用,这意味着我们可以用几个命令安装它。
如果您最近还没有这样做,请在每个服务器上运行以下命令 **以更新各自的包索引:
1[label All servers]
2sudo apt update
然后在每个服务器上安装 tinc **,运行以下命令:
1[label All servers]
2sudo apt install tinc
因此,您已经在每个服务器上安装了 tinc. 但是,您需要在每个机器上对 tinc 的配置进行一些更改,以便您的 VPN 启动并运行。
第2步:配置Tinc服务器
Tinc要求每个将成为VPN的一部分的机器都有以下三个配置组件:
- Tinc配置文件:有三个不同的文件配置 tinc daemon:
tinc.conf
,它定义了网络名称,网络设备,通过该VPN将运行,和其他VPN选项;tinc-up
,一个脚本激活网络设备定义在tinc.conf
之后 tinc;tinc-down
,它禁用网络设备,当 tinc停止
- 公共/私人密钥对:Tinc使用公共/私人密钥对,以确保只有有有效密钥的用户可以访问VPN **主机配置文件:**每个机器(或主机)在VPN上有自己的配置文件,其主机的实际
Tinc 使用一个 netname 来区分一个 tinc VPN 与另一个 VPN. 在您想要设置多个 VPN 的情况下,这很有帮助,但建议您使用一个 netname 即使您只计划配置一个 VPN。
在 server-01上,创建VPN的配置目录结构:
1[label server-01]
2sudo mkdir -p /etc/tinc/netname/hosts
使用您喜爱的文本编辑器创建一个 tinc.conf
文件. 在这里,我们将使用 nano
:
1[label server-01]
2sudo nano /etc/tinc/netname/tinc.conf
将下列行添加到空的文件中,它们将配置一个名为server_01
的 tinc 节点,并使用一个名为tun0
的网络接口,该节点将使用 IPv4:
1[label server-01:/etc/tinc/netname/tinc.conf]
2Name = server_01
3AddressFamily = ipv4
4Interface = tun0
<$>[警告]
警告: 注意Name
指令之后的值如何包含一个 underscore(_
)而不是一个hyphen(-
)。这很重要,因为 tinc 要求Name
值只包含字母数字或 underscore字符。
添加这些行后保存并关闭文件. 如果您使用了nano
,请按CTRL+X
,Y
,然后按ENTER
。
接下来,在主机
子目录中创建一个名为server_01
的主机配置文件,最终,客户端节点将使用此文件与 server-01进行通信:
1[label server-01]
2sudo nano /etc/tinc/netname/hosts/server_01
再次,请注意,这个文件的名称包含一个 underscore 而不是一个hyphen. 这样,它与在tinc.conf文件中的Name
指令一致,这将允许Tink在我们后来生成时自动附加服务器的公共RSA密钥到这个文件。
将下列行添加到文件中,确保包含 server-01的公共 IP 地址:
1[label server-01:/etc/tinc/netname/hosts/server_01]
2Address = server-01_public_IP_address
3Subnet = 10.0.0.1/32
地址
字段指明其他节点将如何连接到该服务器,而子网
则指明该小组网将为何服务。
接下来,用以下命令生成一对公共和私人 RSA 密钥:
1[label server-01]
2sudo tincd -n netname -K4096
运行此命令后,您将被要求输入文件名,Tink 将保存公共和私人 RSA 密钥:
1[secondary_label Output]
2. . .
3Please enter a file to save private RSA key to [/etc/tinc/netname/rsa_key.priv]:
4Please 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时都会运行的脚本:
1[label server-01]
2sudo nano /etc/tinc/netname/tinc-up
添加以下几行:
1[label server-01:/etc/tinc/netname/tinc-up]
2#!/bin/sh
3ip link set $INTERFACE up
4ip addr add 10.0.0.1/32 dev $INTERFACE
5ip route add 10.0.0.0/24 dev $INTERFACE
以下是每一个这些线条做什么:
ip link...
:将 tinc 虚拟网络接口的状态设置为up
ip addr...
:将 IP 地址10.0.0.1
添加到 tinc 虚拟网络接口的 netmask 值32
,这将导致 VPN 上的其他机器将 server-01 的 IP 地址视为10.0.0.1
ip 路线...
:添加一条路线(10.0.0.0/24
)可通过 tinc 虚拟网络接口 访问
添加这些行后保存和关闭文件。
接下来,创建一个脚本来删除虚拟网络接口,当您的VPN被阻止:
1[label server-01]
2sudo nano /etc/tinc/netname/tinc-down
添加以下几行:
1[label server-01:/etc/tinc/netname/tinc-down]
2#!/bin/sh
3ip route del 10.0.0.0/24 dev $INTERFACE
4ip addr del 10.0.0.1/32 dev $INTERFACE
5ip 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
保存和关闭文件,然后使这两个新的网络脚本可执行:
1[label server-01]
2sudo chmod 755 /etc/tinc/netname/tinc-*
作为配置 server-01的最后一步,添加一个防火墙规则,允许通过端口 655
, tinc 的默认端口的流量:
1[label server-01]
2sudo ufw allow 655
server-01现在已完全配置,您可以继续设置客户端节点。
步骤 3 – 配置客户端节点
您的客户端机器将需要与服务器稍微不同的配置,尽管该过程通常非常相似。
由于我们在本指南中所寻求的设置,我们将对 client-01和 client-02进行几乎相同的配置,它们之间只有少量差异,因此,本步中给出的许多命令必须在 client-01机器上运行。
在 客户端-01 和客户端-02中,复制您在 server-01 上创建的目录结构:
1[label client-01 & client-02]
2sudo mkdir -p /etc/tinc/netname/hosts
然后创建一个tinc.conf
文件:
1[label client-01 & client-02]
2sudo nano /etc/tinc/netname/tinc.conf
在两台机器上将下列行添加到文件中:
1[label client-01 & client-02 /etc/tinc/netname/tinc.conf]
2Name = node_name
3AddressFamily = ipv4
4Interface = tun0
5ConnectTo = server_01
请确保用相应的客户端节点的名称代替node_name
。
请注意,此文件包含一个ConnectTo
指向server_01
的指令,而 server-01的tinc.conf
文件没有包含此指令。
保存并关闭文件。
接下来,在每个客户端节点上创建一个主机配置文件。
1[label client-01 & client-02]
2sudo nano /etc/tinc/netname/hosts/node_name
对于 client-01,添加此行:
1[label client-01:/etc/tinc/netname/hosts/client_01]
2[environment second]
3Subnet = 10.0.0.2/32
对于 client-02,添加此行:
1[label client-02:/etc/tinc/netname/hosts/client_02]
2[environment third]
3Subnet = 10.0.0.3/32
请注意,每个客户端都有不同的子网,Tink将为此服务. 保存和关闭文件。
接下来,在每个客户端机器上生成密钥对:
1[label client-01 & client-02]
2sudo tincd -n netname -K4096
就像你在 server-01 中一样,当被要求选择存储 RSA 密钥的文件时,请按ENTER
来接受默认选项。
然后,在每个客户端上创建网络接口启动脚本:
1[label client-01 & client-02]
2sudo nano /etc/tinc/netname/tinc-up
对于 client-01,添加这些行:
1[label client-01:/etc/tinc/netname/tinc-up]
2[environment second]
3#!/bin/sh
4ip link set $INTERFACE up
5ip addr add 10.0.0.2/32 dev $INTERFACE
6ip route add 10.0.0.0/24 dev $INTERFACE
对于 client-02,添加以下内容:
1[label client-02:/etc/tinc/netname/tinc-up]
2[environment third]
3#!/bin/sh
4ip link set $INTERFACE up
5ip addr add 10.0.0.3/32 dev $INTERFACE
6ip route add 10.0.0.0/24 dev $INTERFACE
保存并关闭每个文件。
接下来,在每个客户端上创建网络界面停止脚本:
1[label client-01 & client-02]
2sudo nano /etc/tinc/netname/tinc-down
在 client-01上,将以下内容添加到空文件中:
1[label client-01:/etc/tinc/netname/tinc-down]
2[environment second]
3#!/bin/sh
4ip route del 10.0.0.0/24 dev $INTERFACE
5ip addr del 10.0.0.2/32 dev $INTERFACE
6ip link set $INTERFACE down
在 client-02上,添加以下内容:
1[label client-02:/etc/tinc/netname/tinc-down]
2[environment third]
3#!/bin/sh
4ip route del 10.0.0.0/24 dev $INTERFACE
5ip addr del 10.0.0.3/32 dev $INTERFACE
6ip link set $INTERFACE down
保存并关闭文件。
通过在每个客户端机器上运行以下命令**来执行网络脚本:
1[label client-01 & client-02]
2sudo chmod 755 /etc/tinc/netname/tinc-*
最后,在每个客户端上打开端口 655
**:
1[label client-01 & client-02]
2sudo ufw allow 655
在这一点上,客户端节点几乎是,虽然不是完全设置的,他们仍然需要我们在前一步中创建的公共密钥 server-01来验证连接到VPN。
步骤4:分配钥匙
每个想要直接与另一个节点通信的节点都必须有交换的公共密钥,这些密钥位于主机配置文件中。
服务器-01 和客户端-01 之间的交换密钥
在 client-01上,将其主机配置文件复制到 server-01. 由于 client-01 和 server-01 都位于同一个数据中心,并且都启用了私人网络,您可以在这里使用 server01 的私人 IP 地址:
1[label client-01]
2[environment second]
3scp /etc/tinc/netname/hosts/client_01 sammy@server-01_private_IP:/tmp
然后在 server-01上,将 client-01
主机配置文件复制到 /etc/tinc/netname/hosts/
目录:
1[label server-01]
2sudo cp /tmp/client_01 /etc/tinc/netname/hosts/
然后,仍在 server-01上,将其主机配置文件复制到 client-01:
1[label server-01]
2scp /etc/tinc/netname/hosts/server_01 user@client-01_private_IP:/tmp
在 client-01上,将 server-01的文件复制到相应的位置:
1[label client-01]
2[environment second]
3sudo cp /tmp/server_01 /etc/tinc/netname/hosts/
在 client-01上,编辑 server-01的主机配置文件,以便将地址
字段设置为 server-01的私人IP地址。
1[label client-01]
2[environment second]
3sudo nano /etc/tinc/netname/hosts/server_01
更改地址
指令,以指向 server-01的 private IP 地址:
1[label client-01:/etc/tinc/netname/hosts/server_01]
2[environment second]
3Address = server-01_private_IP
4Subnet = 10.0.0.1/32
现在让我们继续到我们的剩余节点, client-02。
服务器-01 和客户端-02 之间的交换密钥
在 client-02上,将其主机配置文件复制到 server-01:
1[label client-02]
2[environment third]
3scp /etc/tinc/netname/hosts/client_02 sammy@server-01_public_IP:/tmp
然后在 server-01上,将client_02
主机配置文件复制到相应的位置:
1[label server-01]
2sudo cp /tmp/client_02 /etc/tinc/netname/hosts/
然后将 server-01的主机配置文件复制到 client-02:
1[label server-01]
2scp /etc/tinc/netname/hosts/server_01 user@client-02_public_IP:/tmp
在 client-02上,将 server-01的文件复制到相应的位置:
1[label client-02]
2[environment third]
3sudo cp /tmp/server_01 /etc/tinc/netname/hosts/
假设你只是设置两个客户端节点,你已经完成了公共密钥的分发。但是,如果你正在创建一个更大的VPN,现在是交换这些其他节点之间的密钥的好时机。 请记住,如果你想让两个节点彼此直接通信(没有彼此之间的转发服务器),他们需要交换他们的密钥/主机配置文件,他们需要能够访问对方的真实网络接口。
步骤 5 – 测试配置
在 每个节点上,从 server-01开始,用以下命令开始 tinc:
1[label All servers]
2sudo tincd -n netname -D -d3
此命令包括n
旗,指向我们VPN的网络名称netname
。如果您有多个VPN设置,并且您需要指定您想要启动的旗帜,这也包括-D
旗,它防止Tink发动和分离,以及禁用Tink的自动重新启动机制。最后,它包括d
旗,它告诉Tink在调试模式中运行,调试水平为3
。
<$>[注]
** 注意:** 至于 tinc daemon,一个调试级别的3
会显示任何两个服务器之间交换的每个请求,包括身份验证请求,关键交换和连接列表更新。更高的调试级别会显示有关网络流量的更多信息,但目前我们只关心节点是否可以彼此通信,所以一个级别的3
就足够了。
您可以通过查看 官方文档来了解更多关于 tinc 的调试水平。
在每个节点上启动 DAEMON 后,您应该看到每个节点的名称输出,因为它们连接到 server-01。
在一个单独的窗口中,在 client-02上, ping client-01的 VPN IP 地址. 我们将此分配为 10.0.0.2
,此前:
1[label client-02]
2[environment third]
3ping 10.0.0.2
ping 应该正常工作,你应该在其他窗口中看到有关 VPN 连接的一些调试输出,这表明 client-02 能够通过 server-01 到 client-01 通过 VPN 进行通信。
您还可以使用VPN接口进行任何其他网络通信,如应用连接,复制文件和SSH。
在每一个 tinc daemon 调试窗口中,通过按CTRL+
来终止 daemon。
步骤 6 — 配置 Tinc 开始在启动上
Ubuntu 服务器使用systemd
作为默认系统管理器来控制启动和运行流程,因此,我们可以允许netname
VPN在启动时使用单个systemctl
命令自动启动。
在每个节点上运行以下命令,在机器启动时设置 tinc VPN 启动:
1[label All servers]
2sudo systemctl enable tinc@netname
Tinc 配置为在您的每个机器上启动时启动,您可以使用systemctl
命令来控制它. 如果您现在想启动它,请在每个节点上运行以下命令:
1[label All servers]
2sudo systemctl start tinc@netname
<$>[注] **注:如果您有多个VPN,您可以同时启用或启动每个VPN,如下:
1[label All servers]
2sudo systemctl start tinc@natename_01 tinc@netname_02 … tinc@netname_n
美元
有了它,你的Tink VPN完全配置并在每个节点上运行。
结论
现在你已经通过了这个教程,你应该有一个很好的基础来构建你的VPN来满足你的需求。Tinc非常灵活,任何节点都可以配置到连接到任何其他节点(它可以通过网络访问),所以它可以作为一个网格VPN而不依赖一个单独的节点。