介绍
在本教程中,我们将讨论如何使用Tinc,一个开源的虚拟私人网络(VPN)魔鬼,创建一个安全的VPN,你的服务器可以通信,就像他们是在本地网络上一样。
Tinc 有几个功能使其有用,包括加密,可选压缩,自动网格路由(如果可能的话,VPN流量会直接在通信服务器之间进行路由),以及易于扩展。这些功能将Tinc与OpenVPN等其他VPN解决方案区分开来,使其成为从许多地理分布的小型网络中创建VPN的好解决方案。
<$>[注] 注: 如果您想快速轻松地设置Tinc mesh VPN,请参阅本教程: 如何使用Ansible和Tinc VPN来保护您的服务器基础设施。
前提条件
要完成本教程,您将需要在至少三个Ubuntu 14.04服务器上 root 访问. 设置 root 访问的说明可以在这里找到(步骤 3 和 4): [Ubuntu 14.04 初始服务器设置(https://andsky.com/tech/tutorials/initial-server-setup-with-ubuntu-14-04)。
如果您计划在自己的环境中使用此功能,您将需要计划您的服务器需要如何互相访问,并将本教程中的示例适应您的需求。
如果您想准确地遵循本教程,请在同一数据中心创建两个VPS,使用私人网络,并在单独的数据中心创建另一个VPS,我们将在NYC2数据中心创建两个VPS,在AMS2数据中心创建一个VPS,名称为:
- externalnyc:所有VPN节点将连接到这个服务器,并且必须保持连接以确保适当的VPN功能。可以配置类似于此类的额外服务器以提供冗余性,如果需要
- internalnyc:通过其 _private_网络接口
- ams1连接到 externalnyc VPN节点通过公共互联网
我们的目标
以下是我们想要设置的VPN的图表(在前提条件
中描述):
绿色代表我们的VPN,灰色代表公共互联网,橙色代表私人网络。
让我们从安装Tinc开始!
安装Tinc
在您想要加入私人网络的每个VPS上,安装Tinc。
1sudo apt-get update
然后通过 apt 安装 Tinc:
1sudo apt-get install tinc
现在Tinc已安装,让我们看看Tinc配置。
Tinc 配置
Tinc 使用netname
来区分一个 Tinc VPN 和另一个 VPN (在多个 VPN 的情况下),即使您只计划配置一个 VPN,也建议使用 netname。
每个服务器将成为我们VPN的一部分,需要以下三个配置组件:
*配置文件: tinc.conf、 tinc-up 和 tinc-down,例如 *公共/私钥对:用于加密和节点身份验证 *主机配置文件:包含公共密钥和其他VPN配置
让我们从配置我们的 externalnyc 节点开始。
外部配置
在 externalnyc上,创建我们的VPN的配置目录结构,称为netname
:
1sudo mkdir -p /etc/tinc/netname/hosts
现在打开 tinc.conf 来编辑:
1sudo vi /etc/tinc/netname/tinc.conf
现在添加以下几行:
1Name = externalnyc
2AddressFamily = ipv4
3Interface = tun0
这简单地配置了一个名为externalnyc的节点,有一个网络接口将使用IPv4称为tun0
。
接下来,让我们创建一个 externalnyc 主机配置文件:
1sudo vi /etc/tinc/netname/hosts/externalnyc
添加以下行(在这里取代您的VPS的公共IP地址):
1Address = externalnyc_public_IP
2Subnet = 10.0.0.1/32
最终,这个文件将在其他服务器上使用,以与这个服务器进行通信. 该地址指定了其他节点将如何连接到这个服务器,而子网则指定了这个大门将服务的子网。
现在用以下命令生成这个主机的公共/私人键对:
1sudo tincd -n netname -K4096
这会创建私钥(/etc/tinc/netname/rsa_key.priv),并将公共钥匙附加到我们最近创建的 externalnyc 主机配置文件(/etc/tinc/netname/hosts/externalnyc)。
现在我们必须创建tinc-up
,这个脚本将在我们的 netname VPN 启动时运行。
1sudo vi /etc/tinc/netname/tinc-up
添加以下几行:
1#!/bin/sh
2ifconfig $INTERFACE 10.0.0.1 netmask 255.255.255.0
当我们启动我们的VPN时,这个脚本将运行,以创建我们的VPN将使用的网络接口。
让我们也创建一个脚本来删除当我们的VPN被阻止时的网络接口:
1sudo vi /etc/tinc/netname/tinc-down
添加以下几行:
1#!/bin/sh
2ifconfig $INTERFACE down
保存和停止。
最后,使 tinc 网络脚本可执行:
1sudo chmod 755 /etc/tinc/netname/tinc-*
保存和停止。
让我们转到我们的其他节点。
配置 internalnyc 和 ams1
这些步骤在 internalnyc 和 ams1 上都需要执行,将注意到稍微的变化。
在 internalnyc和 ams1上,创建我们的VPN的配置目录结构,称为netname
,并编辑Tinc配置文件:
1sudo mkdir -p /etc/tinc/netname/hosts
2sudo vi /etc/tinc/netname/tinc.conf
添加以下行(以节点名称代替名称):
1Name = node_name
2AddressFamily = ipv4
3Interface = tun0
4ConnectTo = externalnyc
这些节点被配置为尝试连接到externalnyc
(我们之前创建的节点)。
接下来,让我们创建主机配置文件:
1sudo vi /etc/tinc/netname/hosts/node_name
对于 internalnyc,添加此行:
1Subnet = 10.0.0.2/32
对于 ams1,添加此行:
1Subnet = 10.0.0.3/32
请注意,数字不同. 保存和停止。
接下来,生成 keypairs:
1sudo tincd -n netname -K4096
创建网络接口启动脚本:
1sudo vi /etc/tinc/netname/tinc-up
对于 internalnyc,添加此行:
1ifconfig $INTERFACE 10.0.0.2 netmask 255.255.255.0
对于 ams1,添加此行:
1ifconfig $INTERFACE 10.0.0.3 netmask 255.255.255.0
这些IP地址是如何在VPN上访问这些节点。
现在创建网络界面停止脚本:
1sudo vi /etc/tinc/netname/tinc-down
再加上这条线:
1ifconfig $INTERFACE down
保存和停止。
最后,使 tinc 网络脚本可执行:
1sudo chmod 755 /etc/tinc/netname/tinc-*
保存和停止。
现在我们必须将主机配置文件分发到每个节点。
把钥匙分发
如果你碰巧使用了配置管理系统,这是一个很好的应用程序. 至少,每一个想要直接与另一个节点通信的节点都必须有交换的公共密钥,这些都位于主机配置文件中。 例如,在我们的情况下,只有 _externalnyc 需要与其他节点交换公共密钥。 如果你只将每个公共密钥复制到节点的所有成员,就更容易管理。 请注意,当它被复制到 internalc 时,您将希望在 externalnyc 的主机配置文件中更改地址
值,以便在私人网络上建立连接。
因为我们的VPN被称为netname
,这里是主机配置文件的位置: /etc/tinc/netname/hosts
externalnyc 和 internalnyc 之间的交换密钥
在 internalnyc上,将其主机配置文件复制到 externalnyc:
1scp /etc/tinc/netname/hosts/internalnyc user@externalnyc_private_IP:/tmp
然后在 externalnyc上,将 internalnyc 的文件复制到相应的位置:
1cd /etc/tinc/netname/hosts; sudo cp /tmp/internalnyc .
然后在 externalnyc 再次,复制其主机配置文件到 internalnyc:
1scp /etc/tinc/netname/hosts/externalnyc user@internalnyc_private_IP:/tmp
在 internalnyc上,将 externalnyc 的文件复制到相应的位置:
1cd /etc/tinc/netname/hosts; sudo cp /tmp/externalnyc .
在 internalnyc上,让我们编辑 _externalnyc 的主机配置文件,以便将地址
字段设置为 _externalnyc 的私人 IP 地址(因此 internalnyc 将通过私人网络连接到 VPN)。
1sudo vi /etc/tinc/netname/hosts/externalnyc
将地址
值更改为 _externalnyc 的私人 IP 地址:
1Address = externalnyc_private_IP
保存和停止. 现在让我们继续到我们的剩余节点,ams1。
externalnyc 和 ams1 之间的交换密钥
在 ams1上,将其主机配置文件复制到 externalnyc:
1scp /etc/tinc/netname/hosts/ams1 user@externalnyc_public_IP:/tmp
然后在 externalnyc上,将 ams1 的文件复制到相应的位置:
1cd /etc/tinc/netname/hosts; sudo cp /tmp/ams1 .
然后在 externalnyc上再次复制其主机配置文件到 ams1:
1scp /etc/tinc/netname/hosts/externalnyc user@ams1_public_IP:/tmp
在 ams1上,将 externalnyc 的文件复制到相应的位置:
1cd /etc/tinc/netname/hosts; sudo cp /tmp/externalnyc .
额外节点之间的交换密钥
如果你正在创建一个更大的VPN,现在是交换这些其他节点之间的密钥的好时机。记住,如果你想让两个节点彼此直接通信(没有彼此之间的转发服务器),他们需要交换他们的密钥/主机配置文件,他们需要能够访问彼此的真实网络接口。
测试我们的配置
在 每个节点上,从 externalnyc 开始,在调试模式中启动Tinc(netname是我们的VPN的名称):
1sudo tincd -n netname -D -d3
在每个节点上启动 DAEMON 后,您应该看到每个节点的名称输出,因为它们连接到 externalnyc. 现在让我们通过 VPN 测试连接。
在一个单独的窗口中,在 ams1上, ping internalnyc 的 VPN IP 地址(我们之前分配到 10.0.0.2):
1ping 10.0.0.2
ping 应该正常工作,你应该在其他窗口中看到有关 VPN 连接的一些调试输出,这表明 ams1 能够通过 externalnyc 到 internalnyc 通过 VPN 进行通信。
您还可以使用VPN接口进行任何其他网络通信,如应用连接,复制文件和SSH。
在每个 Tinc daemon 调试窗口中,通过按 CTRL-\ 来终止 DAEMON。
**注:如果连接不起作用,请确保防火墙不会阻止连接或转发。
配置 Tinc 到 Boot 上启动
在Tinc init脚本正常工作之前,我们必须将VPN的名称放入nets.boot
配置文件中。
在每个节点上,编辑 nets.boot:
1sudo vi /etc/tinc/nets.boot
将您的VPN(s)名称添加到此文件中. 我们的名称是网名
:
1# This file contains all names of the networks to be started on system startup.
2netname
Tinc 现在已配置为启动,并且可以通过服务
命令进行控制. 如果您想启动它,现在在每个节点上运行以下命令:
1sudo service tinc start
您的Tinc VPN已设置。
结论
现在你已经通过了这个教程,你应该有一个很好的基础来构建你的VPN来满足你的需求。Tinc非常灵活,任何节点都可以配置到连接到任何其他节点(它可以通过网络访问),所以它可以作为一个网格VPN,而不是依赖单个节点。
好运!