在没有P2P VPN的时候,机器比较分散,不好组件局域网,用不起专线,维护VPN需要大量成本投入,在加上墙的存在,就更不方便了。

概念

所谓P2P VPN,就是在整个VPN网络中,所有的服务器之间的流量转发,不再需要经过中心服务器,而是直接实现点到点连接。只需在连接中心节点一次后,剩下的流量交换都在节点服务器中完成。 在传统的VPN中,有且只能有一台VPN服务器,所有的客户端都会连接到单点服务器上,并且所有的流量都必须通过单点服务器进行转发;负担过重不说,往往因为中心节点的崩溃导致局域网的分崩离析。而在P2P VPN中,网络采用和BitTorrent网络(BT下载网络)类似的架构:部署几台信息服务器(Tracker服务器),剩下的客户端作为边缘节点加入网络中即可。只需要通过信息服务器获取各台服务器的信息,即可直接转发数据包到达目标服务器。流量交换的工作将不由中心服务器完成,而是各个边缘节点之间完成。

部署N2N

服务器需支持TAP/TUN, KVM默认支持。

编译安装

## Debian 9
apt install -y subversion git build-essential libssl-dev net-tools make gcc
## Centos
yum install -y svn net-tools openssl-devel
## 下载源码通过 svn
svn co https://svn.ntop.org/svn/ntop/trunk/n2n
## 下载源码通过 git
git clone https://github.com/ntop/n2n.git

## 编译 & 安装
cd n2n/n2n_v2
make && make install

在编译安装完成后,我们会得到两个可执行文件:supernodeedge

supernode 是我们的中心信息节点程序,它起到了类似BT/PT中Tracker服务器的作用,完成对边缘节点信息的交换,并为无法暴露端口在公网的服务器提供流量转发能力。
edge 是我们的边缘节点程序。它相当于网络中的客户端,加入到网络后,即可在中心信息节点的指引下进行信息交换

部署中心节点服务

中心节点需要是运行在公网环境中。

supernode -l 7443

端口可以自行指定,这里使用7443

部署边缘节点

edge -a 10.20.20.1 -c GoogleNetwork -k za8eebais8Chai5iet1veip4Xeetai7t -l 38.143.1.86:7443 -p 3447
edge -a 10.20.20.2 -c GoogleNetwork -k za8eebais8Chai5iet1veip4Xeetai7t -l 38.143.1.86:7443 -p 3447

参数说明:

-a N2N网络的当前机器ip
-c N2N网络组,一个边缘节点可以有多个组
-k N2N网络组密钥
-l 中心节点地址
-p 边缘节点暴露端口

测试

 master01 ➜  ~ ip r
default via 192.168.199.1 dev enp0s3 proto dhcp src 192.168.199.30 metric 100
10.20.20.0/24 dev edge0 proto kernel scope link src 10.20.20.7
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
192.168.57.0/24 dev enp0s8 proto kernel scope link src 192.168.57.4
192.168.199.0/24 dev enp0s3 proto kernel scope link src 192.168.199.30
192.168.199.1 dev enp0s3 proto dhcp scope link src 192.168.199.30 metric 100

 master01 ➜  ~ ping -c 1 10.20.20.1
PING 10.20.20.1 (10.20.20.1) 56(84) bytes of data.
64 bytes from 10.20.20.1: icmp_seq=1 ttl=64 time=42.5 ms

--- 10.20.20.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 42.483/42.483/42.483/0.000 ms
 master01 ➜  ~ ping -c 1 10.20.20.6
PING 10.20.20.6 (10.20.20.6) 56(84) bytes of data.
64 bytes from 10.20.20.6: icmp_seq=1 ttl=64 time=600 ms

--- 10.20.20.6 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 599.537/599.537/599.537/0.000 ms

如果有docker可以试试这个

curl -L https://repo.spanda.io/cloud/dl/raw/branch/master/scope -o /usr/local/bin/scope
chmod a+x /usr/local/bin/scope
scope launch 10.20.20.1 10.20.20.2 10.20.20.3 10.20.20.4 10.20.20.5 10.20.20.6 10.20.20.7

效果如下:

参考

ntop/n2n
异地也要玩局域网——使用N2N,实现异地服务器快速组建内网