一个传统的VPN(如OpenVPN、PPTP)由一个VPN服务器和一个或多个连接到这台服务器的客户端组成。当任意两个VPN客户端彼此通信时,VPN服务器需要中继它们之间的VPN数据流量。这样一个中心辐射型的VPN拓扑结构存在的问题是,当连接的客户端增多以后,VPN服务器很容易成为一个性能上的瓶颈。从某种意义上来说,中心化的VPN服务器也同样成为一个单点故障的来源,也就是当VPN服务器出现故障的时候,整个VPN都将无法被任何VPN客户端访问。
点对点VPN(又称P2PVPN)是另一个VPN模型,它能解决传统的基于服务器-客户端模型的VPN存在的这些问题。一个P2PVPN中不再有一个中心的VPN服务器,任何拥有一个公开IP地址的节点都能引导其他节点进入VPN。当连接到一个VPN之后,每一个节点都能与VPN中的任何其他节点直接通信,而不需要经过一个中间的服务器节点。当然任何节点出现故障时,VPN中的剩余节点不会受到影响。节点中的延迟、带宽以及VPN扩展性在这样的设定中都有自然的提升,当你想要使用VPN进行多人游戏或者与许多朋友分享文件时,这都是十分理想的。
开源的P2PVPN实现已经有几个了,比如Tinc、peerVPN,以及n2n。在本教程中,我将会展示如何在Linux上用n2n配置点对点VPN。
n2n是一个开源(GPLv3)软件,它允许你在用户间构建一个加密的2/3层点对点VPN。由n2n构建的VPN是对NAT友好的,也就是说,不同NAT路由器后方的两个用户可以通过VPN直接与对方通信。n2n支持对称的NAT类型,这是NAT中限制最多的一种。因此,n2n的VPN数据流量是用UDP封装的。
一个n2nVPN由两类节点组成:边缘(edge)节点和超级(super)节点。一个边缘节点是一台连接到VPN的电脑,它可能在一个NAT路由器后方。一个超级节点则是拥有一个可以公共访问的IP地址的电脑,它将会帮助NAT后方的边缘节点进行初始通信。想要在用户中创建一个P2PVPN的话,我们需要至少一个超级节点。
准备工作
在这篇教程中,我将会创建一个拥有3个节点的P2PVPN:一个超级节点和两个边缘节点。唯一的要求是,边缘节点需要能够ping通超级节点的IP地址,而它们是否在NAT路由器之后则没有什么关系。
在Linux上安装n2n
若想用n2n构建一个P2PVPN,你需要在每个节点上安装n2n,包括超级节点。
由于它非常精简的依赖需求,在大多数Linux平台上n2n都能被轻松编译。
在基于Debian的系统上安装n2n:
复制代码