组建N2N VPN网络实现内网设备之间的相互访问
更新说明
本文提到的技术可能已过时,近年出现了大量优秀的异地组网软件,比n2n更加简单可靠,推荐使用以下几款:
概述
如果要实现设备的远程访问,比如在公司访问家里的电脑、路由器、智能开关等,我们一般会需要一个公网地址,然后将相应端口映射到指定设备上。随着IPV4地址的枯竭,有些ISP已经不提供公网IP了,而且即使有公网IP,我们不一定有权限操作NAT路由的端口映射(比如公司的网络),而且每次重启路由器这个IP会变化,我们还得等一段时间让DDNS生效,非常不便。
要是每个设备固定一个IP地址就好了,让我们在世界任何地方输入10.2.5.1
这个IP就可以登录家里的路由、输入10.2.5.2
就对应家里的智能开关、输入10.2.5.3
就登陆自己的Android手机,即使它使用的是移动网络…
注: 上述的10.2.5.X只是一个内网地址的例子,和常见的192.168.1.X是一样的,使用这个地址段是为了避免N2N地址和常见的内网地址混淆。
N2N就是为此而生的,它是在数据链路层实现的一套P2P协议,目的是尽量简化设备直接的连接。引用论文中作者的话来说N2N的目的就是:
Is it possible to have decentralised, network-administrator-free, secure and permanent network access with a single/uniform address regardless of the current user’s location, local IP address and network type?
N2N旨在提供去中心化、无需管理、安全、稳定的网络连接,而和用户的位置、IP地址和网络类型无关。通俗地说就是不需要公网IP、不需要配置NAT、穿透防火墙。
N2N的实现具有两个部分:supernode
中心节点和edge
边界节点, 边界节点通过中心节点找到对方,边界节点之间建立通信后,可以直接断开中心节点,实现点对点的加密通信。N2N网络的架构图如下:
As N2N is a layer two VPN, edge nodes are identified uniquely by a 6 byte MAC address and a 16 byte community name.
N2N的边界节点通过6字节的网卡MAC地址和16字节的组织机构名称唯一标识。
中心节点可以自己建立,也可以使用公开的supernode
。由于supernode
只是建立一个类似寻址的功能,设备之间的通信数据不经过supernode
,所以即使使用公开的supernode
是安全的。
配置一个N2N网络
这里建立一个私有的N2N网络,目的是将家里的电脑、家里的OpenWrt路由器、Android手机连接到同一个N2N网络上。
准备工作
N2N协议目前有两个版本,v1和v2版本,这两个版本是不兼容的!也就是说如果一台设备使用v1版本,另一台设备使用v2版本,那么这两台设备是不能连接的,请务必注意这一点!
我使用的是v1版本,保守一点总是没错的…
公开一个我的N2N中心节点信息(失效):
- IP: s1.shuyz.com
- Port: 82
- Version: N2N v1
仅供测试,我不能保证该节点长期有效
配置OpenWrt路由器的N2N客户端
OpenWrt官方软件源的N2N是v1版本,使用opkg update && opkg install n2n
命令安装 ,安装完成之后先配置一下自己的N2N网络,编辑/etc/config/n2n
这个文件即可,内容如下:
1 | config edge |
最后加入开机自启后立即启动就配置完成了。
1 | /etc/init.d/n2n enable |
配置Windows的N2N客户端
vpnhosting.cz
为Windows写了一个N2N的GUI客户端,下载地址在这里。
安装N2N GUI的时候会自动安装虚拟网卡供edge使用,N2N的设置界面如下,除了IP地址,其他的信息保持和OpenWrt上配置文件一样,然后打开Advanced
配置,选择Use n2n v1
协议,重启一下软件生效。
这时候路由器和电脑就加入同一个N2N网络了,我们在路由器端ping Windows:
1 | [email protected]:~# ping 10.2.5.3 |
上面的测试可以看到网络延时非常严重,因为电脑和路由器在同一个局域网。我把路由器拿到公司之后再ping一下家里的电脑:
1 | [email protected]:~# ping 10.2.5.3 |
由此可见N2N网络在不同公网之间的设备连接上表现优秀,但在用一个局域网的设备间很糟糕。
配置Android的N2N客户端
在Google Play上可以下载到Android的N2N客户端,点此进入,似乎是国人写的,功能非常强大。
配置界面:
配置完成后启动,可以看到和超级节点的注册信息,这时候手机也可以访问N2N网络的其他设备了,比如使用移动网络访问家里的路由器:
N2N中心节点的编译和部署
编译
1 | svn co https://svn.ntop.org/svn/ntop/trunk/n2n |
编译完成之后会生成edge
和supernode
两个可执行文件,可以使用make install
命令安装,或者拷贝到任意目录运行。
调试
这里我们讨论服务器上的supernode
,使用方法很简单:
1 | supernode -l <listening port> [-v] [-h] |
测试的时候,建议开启调试日志,比如:
1 | supernode -l 8080 -v |
总结
目前网上介绍N2N的文章非常少,但我觉得N2N的应用前景是非常广泛的,最典型比如物联网。将N2N协议可以在各种物联网设备上实现后,将这些设备组建成一个N2N网络,这些设备之间的通信和交互将变得更加方便,从而实现各种可能。
##参考资料
- hxihcom, OpenWrt中文应用技术网, (主流VPN技术比较) 无公网IP?远程访问路由?内附详细教程
- Luca Deri, Richard Andrews, N2N: A Layer Two Peer-to-Peer VPN
- vpnhosting.cz, N2n Gui En
组建N2N VPN网络实现内网设备之间的相互访问
https://www.shuyz.com/posts/n2n-vpn-network-introduction-and-config/