如何在 Ubuntu 18.04 上安装 Tinc 并设置基本 VPN

介绍

Tinc是一个开源的 虚拟私人网络 (VPN) 示威者,具有有用的功能,如加密,可选压缩和自动网格路由,可以随机地在服务器之间直接路由 VPN 流量。

在本教程中,我们将讨论如何使用Tink创建一个安全的VPN,你的服务器可以像在本地网络上一样通信。我们还将展示如何使用Tink在私人网络中设置安全隧道。

目标

为了涵盖多个使用案例,本教程概述了如何通过私人网络接口连接一个客户端节点到VPN,另一个通过公共接口。但是,您可以根据自己的需求调整此设置。您只需要计划如何让您的服务器相互访问,并将本教程中的示例适应自己的需求。如果您正在适应自己的设置,请务必将示例中突出的值替换为自己的值。然而,您可能有兴趣首先遵循教程,因为它是写的,以确保您在修改这些指令之前了解相关的组件和流程。

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

  • server-01:所有VPN节点都将连接到这个机器,并且必须保持连接以确保适当的VPN功能。 额外的服务器可以与此服务器相同地配置以提供冗余性,如果需要
  • client-01:通过其 _private_网络接口
  • client-02:通过 _public_网络接口 连接到 server-01 VPN节点

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

以下是我们想要设置的VPN的图表:

Tinc VPN Setup

蓝色盒子代表我们的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)。

因此,您需要在每个服务器上生成SSH密钥,将 both client-01client-02的SSH密钥添加到 server-01授权_keys文件中,然后将 server-01的SSH密钥添加到 both client-01client-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,即每次启动netnameVPN时都会运行的脚本:

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-01client-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-01tinc.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-01server-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-01private 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-01client-01 通过 VPN 进行通信。

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

在每一个 tinc daemon 调试窗口中,通过按CTRL+来终止 daemon。

步骤 6 — 配置 Tinc 开始在启动上

Ubuntu 服务器使用systemd作为默认系统管理器来控制启动和运行流程,因此,我们可以允许netnameVPN在启动时使用单个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而不依赖一个单独的节点。

Published At
Categories with 技术
comments powered by Disqus