虚拟专用网(VPN)是一种安全的专用网络,可在较大的公共网络(如互联网)上运行。 VPN近年来越来越受欢迎,主要是因为它们提供更高的安全性和隐私,而无需设置昂贵和复杂的新硬件。 它们还提供 了其他一些优势 ,包括降低网络和支持成本。
VPN通过公共网络创建一个加密隧道,并利用它来安全地在服务器和终端之间发送数据。 这些连接可以以各种方式加密,并且有许多不同的VPN客户端和守护进程可以满足您的架构,预算和体验级别。
Tinc 是一种这样的解决方案(1,2)。 一个开源的VPN守护进程,它现在可用于各种各样的平台,并且具有超过类似VPN客户端的几个优点。 它提供安全可靠的加密,可选的压缩,并随着网络的增长而轻松扩展。 自动全网状路由意味着VPN流量总是(尽可能地)直接发送到目的地机器,而不经历中间传输, 这 通过限制数据窃取的可能性(3)来 大大提高安全性 。 另外,由于Tinc VPN作为普通网络设备出现在IP级别的网络代码中,因此在建立Tinc VPN后,不需要调整现有的软件。 这使得Tinc VPN本身具有可扩展性。
Tinc唯一的一个小问题是有些人觉得设置有点棘手。 如果这听起来像你,永远不要害怕 - 今天我会带你(或多或少)轻松获得一个Tinc VPN在您的服务器上运行的方式。
先决条件
要完全遵循本教程,您将至少需要三台U buntu 16.04服务器,并在每台机器上进行root访问。 如果您没有这个或不确定这是什么意思,本教程不适合您 - 您应该首先 了解如何使用Ubuntu设置服务器(4) 。
如果您从零开始构建服务器系统,首先需要了解您的机器将如何进行通信。 在本教程中,我将使用我认为大多数人会选择的变量名,但请注意,您可能需要调整一些变量名称以适合您自己的设置。
如果您想要完全遵循本教程,您将首先需要在同一数据中心中设置两个VPS,然后在第二个数据中心中创建第三个VPS。 我的数据中心叫做NYC2,它有两个VPS,AMS2有三个。 这些VPS称为以下:
externalnyc - 我们所有的VPN节点都将连接到该服务器,这意味着它必须保持连接并可用,以确保网络正常运行。 如果您最终要为您的设置添加额外的服务器,则需要以与externalnyc相同的方式进行设置。
internalnyc - 此VPS使用专用网络接口连接到externalnyc VPN节点。
ams1 - 这是我们的公共VPN连接。 它使用公共互联网连接到externalnyc。
目标
我们想要实现的是:
我们的专用网络由绿色线代表,并连接所有三台服务器。 橙色是我们的私有网络,将两个NYC2服务器连接在一起。 所有三台服务器都可以通过VPN进行连接,但AMS1无法访问专用网络。
为此,请按照下列步骤操作:
安装Tinc
首先,我们需要安装Tinc。 像往常一样,通过运行以下方法确保所有的apt存储库都是最新的:
sudo apt-get update
然后通过apt安装Tinc:
sudo apt-get install tinc
就是这样! 您的机器现在将下载Tinc,以及您需要的任何先决条件。 我们现在需要看看配置。
组态
配置Tinc可能与您以前使用的其他VPN有些不同。 它使用“网络名称”将一个VPN与另一个VPN区分开来,当您有多个VPN通过Tinc运行时,这变得非常有用,但是起初有点反直觉。 由于这是我们的第一个Tinc网络,所以让我们保持简单,并调用我们的VPN“netname”。
现在我们的每个服务器。 每个需要三个配置组件:
配置文件:tinc.conf,tinc-up,tinc-down和可选数量的其他文件。
公钥和私钥对:这些是用于加密和认证的。
主机配置文件:这些文件包含公钥和其他VPN配置元素。
现在让我们依次配置我们的每个服务器。 首先,外部运动。
配置externalnyc
好的,现在到了坚果和螺栓。 在externalnyc上,首先创建VPN网络名称的配置目录结构。 跑:
sudo mkdir -p /etc/tinc/netname/hosts
现在在您选择的文本编辑器中打开tinc.conf:
sudo vi /etc/tinc/netname/tinc.conf
将文件放在您的前面,将以下内容添加到文件底部:
Name = externalnyc AddressFamily = ipv4 Interface = tun0
你所做的就是配置一个名为externalnyc的节点,告诉服务器它的网络接口将使用ipv4,并称为“tun0”。 保存文件,并关闭它。
接下来,我们需要为externalnyc创建一个主机配置文件。 为此,请在文本编辑器中打开主机配置文件:
sudo vi /etc/tinc/netname/hosts/externalnyc
再次,在这个文件的底部添加一些行,用第一行代替你的VPS的公共IP地址:
Address = externalnyc_public_IP Subnet = 10.0.0.1/32
这是其他服务器将用于连接到externalnyc的文件。 该地址告诉其他节点如何和何处连接到此服务器,子网地址是该守护程序将在其上运行的子网。 再次,将您的更改保存到此文件并将其关闭。
现在我们需要为这个主机生成公钥/私钥对。 这很简单,只需运行:
sudo tincd -n netname -K4096
这是一个私有的RSA密钥,并在我们刚刚创建的配置文件的末尾添加一个公钥对。 您可以再次打开它,看看已经完成了,如果你愿意的话。
现在,我们需要制作一个小脚本,这个脚本在VPN启动时运行。 打开以下文件进行编辑:
sudo vi /etc/tinc/netname/tinc-up
并添加:
#!/bin/sh ifconfig $INTERFACE 10.0.0.1 netmask 255.255.255.0
每当VPN网络名称启动时,此脚本将运行。 它将使我们的VPN使用一个网络接口,而该VPN externalnyc的IP为10.0.0.1。
但是当VPN停止时,我们希望这个网络接口消失,所以我们需要一个脚本。 这应该附加到tinc-down。 打开:
sudo vi /etc/tinc/netname/tinc-down
然后添加:
#!/bin/sh ifconfig $INTERFACE down
再次保存并退出。 我们现在有了我们的脚本,但为了使他们能够工作,他们需要被标记为可执行文件。 这很简单,使用命令行:
sudo chmod 755 /etc/tinc/netname/tinc-*
保存并退出,您已完成配置此服务器。 接下来,internalnyc和ams1。
配置internalnyc和ams1
要配置其余两个服务器,您需要在每台机器上运行相同的命令。 有一些小的变化,我会指出,但过程基本上是一样的。
像我们上面的externalnyc一样,我们首先需要为配置文件创建目录结构。 在每个服务器上运行以下操作,然后打开Tinc配置文件进行编辑:
sudo mkdir -p /etc/tinc/netname/hosts
sudo vi /etc/tinc/netname/tinc.conf
然后在该文件的底部添加几行,用“node_name”替换每个节点的名称:
Name = node_name AddressFamily = ipv4 Interface = tun0 ConnectTo = externalnyc
您可以看到我们的两台服务器都配置为尝试连接到externalnyc。 保存此文件,并关闭它。
现在我们需要做主机配置文件。 跑:
sudo vi /etc/tinc/netname/hosts/node_name
然后对于internalnyc,添加以下行:
Subnet = 10.0.0.2/32
对于ams1,添加以下行:
Subnet = 10.0.0.3/32
唯一的区别是地址不同,所以我们可以告诉我们的服务器。 保存此文件,并关闭它。
现在,就像以前一样,我们需要生成我们的公钥/私钥对,并创建网络接口启动脚本。 在每个服务器上运行:
sudo tincd -n netname -K4096
接着:
sudo vi /etc/tinc/netname/tinc-up
现在。 对于每个服务器,我们需要使用前面指定的地址。 如果你正在跟着我,对于internalnyc你需要添加:
ifconfig $INTERFACE 10.0.0.2 netmask 255.255.255.0
对于ams1:
ifconfig $INTERFACE 10.0.0.3 netmask 255.255.255.0
但是,如果您指定了上述不同的地址,请在这里更改它们。 保存这些文件,然后退出。 我们就快到了。
我们只需要使网络界面停止脚本,就像以前一样:
sudo vi /etc/tinc/netname/tinc-down
然后在两台服务器上添加这一行:
ifconfig $INTERFACE down
最后一点的配置是使我们的新脚本可执行:
sudo chmod 755 /etc/tinc/netname/tinc-*
保存并退出。 唷。 如果一切顺利,所有三台服务器都配置好了。 现在用于实现加密。
分发密钥
如果您已经在使用配置管理系统,那么运气好。 在理想的世界中,我们现在所做的每个节点需要能够使用公共/私人密钥接口直接与另一个节点进行通话。 如上所述,密钥现在位于每个服务器的主机配置文件中。 在这个简单的网络中,实际上只有externalnyc需要与其他节点交换密钥。
因此,最简单的方法是将每个公钥复制到各个节点的所有成员。 这实际上很简单,当你复制它时,请小心把externalnyc的配置文件中的“address”值改成自己的私有IP地址。 这样,连接将通过专用网络建立。
如果你跟着我,叫你的VPN“netname”,主机配置文件就在这里:/ etc / tinc / netname / hosts
externalnyc和internalnyc之间的交换密钥
这很简单。 在internalnyc上,找到hosts配置文件并复制到externalnyc中:
scp /etc/tinc/netname/hosts/internalnyc user@externalnyc_private_IP:/tmp
然后,在externalnyc上,将相同的文件复制到正确的位置:
cd /etc/tinc/netname/hosts; sudo cp /tmp/internalnyc .
现在我们做相反的过程。 在externalnyc上,将hosts配置文件复制到internalnyc中:
scp /etc/tinc/netname/hosts/externalnyc user@internalnyc_private_IP:/tmp
然后在internalnyc上复制文件,以便它在正确的位置:
cd /etc/tinc/netname/hosts; sudo cp /tmp/externalnyc .
现在我们需要在internalnyc上编辑externalnyc的hosts配置文件,这样地址是正确的。 这样就可以通过私网连接到VPN。 因此,在internalnyc上,打开externalnyc的hosts配置文件:
sudo vi /etc/tinc/netname/hosts/externalnyc
并将地址值更改为externalnyc的私有IP地址,如下所示:
Address = externalnyc_private_IP
保存文件,并退出。 这就是这两个关键。 现在我们只需要和我们剩下的一个节点交换密钥。
externalnyc和ams之间的交换密钥1
这里的过程很相似。 使用ams1,将hosts配置文件复制到externalnyc:
scp /etc/tinc/netname/hosts/ams1 user@externalnyc_public_IP:/tmp
然后再次将其复制到正确的位置,使用externalnyc:
cd /etc/tinc/netname/hosts; sudo cp /tmp/ams1 .
保持在externalnyc,复制文件的另一种方式,到ams1:
scp /etc/tinc/netname/hosts/externalnyc user@ams1_public_IP:/tmp
再一次,在ams1上,复制这个文件,使其在正确的位置:
cd /etc/tinc/netname/hosts; sudo cp /tmp/externalnyc .
你完成了密钥交换。 理论上说,你现在已经有了一个工作,加密的VPN通过Tinc。 如果您遵循本教程的信件,您可以继续测试您的设置。 但是,如果您还利用机会添加额外的节点,现在是交换所需密钥的好时机。
请记住,如果您正在使用中央节点,就像我在这里,您不需要将所有密钥复制到所有服务器。 但是,如果您希望节点能够直接对话,则需要交换密钥。 执行此操作的过程与上述相同 - 只需执行多次迭代即可实现所需的连接。
测试
你现在应该准备好测试了。 为了做到这一点,在调试模式下启动Tinc是一个好主意,所以我们可以抓住任何错误,如果有任何问题,可以获取更多的信息。 请记住,配置不当的VPN实际上可能是一个安全风险,因此,在开始使用VPN以进行重要任务之前,请确保一切正常。
要在调试模式下启动Tinc,请在每个节点上以externalnyc开头,运行:
sudo tincd -n netname -D -d3
如果你打电话给你的VPN不同,当然,把“netname”变量改成适当的名字。
守护进程在每个节点上启动后,它应该返回输出,给出每个节点在连接时的名称。 如果没有发生这种情况,你在某个地方犯了一个错误。
现在我们可以测试VPN。 在ams1的新窗口中,使用其IP地址ping internalnyc。 我们把它分配到10.0.0.2之前,所以输入:
ping 10.0.0.2
希望你的ping将工作。 您还应该在其他窗口中看到一些调试输出,描述刚刚创建的连接。 Ams1现在通过您的新VPN连接到externalnyc,并可以通过它连接到internalnyc。 点击CTRL-C,ping将停止。
现在你有一个安全的VPN连接,你可以使用它进行任何其他类型的网络通信 - 应用程序连接,复制文件,SSH或任何你喜欢的。
如果你的ping不起作用,但是你认为你做的都是正确的,那么防火墙可能就是这样。 检查您的防火墙设置,然后重试。
Tinc On Boot
只是最后一件事。 如果您现在要使用Tinc VPN进行所有网络连接,可能需要将其设置为启动时启动。 您将需要通过编辑nets.boot配置文件在每个节点上执行此操作。 打开文件使用:
sudo vi /etc/tinc/nets.boot
然后将新VPN的名称添加到此文件。 如果您选择像我这样的“网络名称”,这将如下所示:
# This file contains all names of the networks to be started on system startup. netname
保存并退出,你已经完成了。 Tinc现在正在工作,并将在启动时启动。 做得好你
如果您需要控制Tinc,现在可以运行“service”命令。 在每个节点上,只需运行:
sudo service tinc start
并玩耍。 通过这个命令可以实现最基本的控制。
结论
您现在应该在所有机器上通过Tinc运行安全的VPN连接。 该VPN可以作为建立更多网络功能的基础。
如果您将来要添加更多节点,或将Tinc与其他VPN组合,Tinc将允许您执行此操作。 每个额外节点的过程与上述相同,您应该能够轻松查看哪些变量和地址需要更改。 只要记住,如果您希望节点能够直接相互连接,则需要直接在它们之间交换密钥。 像这样,Tinc作为网状VPN,比我的方法更安全一些(3)。 否则,您可以像我已经完成的那样设置网络,并通过中央节点进行一切。
无论哪种方式,你现在都可以自由玩耍。 祝你好运!
资源
(2) https://www.linux.com/news/creating-vpn-tinc
(3) https://thebestvpn.com/cryptography/
(4) https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-14-04