家庭网络
2014 年 8 月 31 日
组建N2N VPN网络实现内网设备之间的相互访问
本文介绍了一种名为N2N的P2P协议,旨在提供去中心化、无需管理、安全、稳定的网络连接,而和用户的位置、IP地址和网络类型无关,不需要公网IP、不需要配置NAT、穿透防火墙。N2N的实现具有两个部分:`supernode`中心节点和`edge`边界节点, 边界节点通过中心节点找到对方,边界节点之间建立通信后,可以直接断开中心节点,实现点对点的加密通信。虽然本文提到的N2N技术可能已经过时,推荐使用Tailscale和ZeroTier等更新的异地组网软件。
更新说明
本文提到的技术可能已过时,近年出现了大量优秀的异地组网软件,比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
这个文件即可,内容如下:config edge
# 给设备分配一个内网地址
option ipaddr '10.2.5.1'
option supernode '104.128.82.194'
option port '82'
# 为自己的N2N网络组织机构取个名字,不要和我的一样
option community 'shuyz'
# 其他设备要使用相同的组织机构名和密码才能加入
option key '123456789'
option route '1'
最后加入开机自启后立即启动就配置完成了。
/etc/init.d/n2n enable
/etc/init.d/n2n start
配置Windows的N2N客户端
vpnhosting.cz
为Windows写了一个N2N的GUI客户端,下载地址在这里。
安装N2N GUI的时候会自动安装虚拟网卡供edge使用,N2N的设置界面如下,除了IP地址,其他的信息保持和OpenWrt上配置文件一样,然后打开Advanced
配置,选择Use n2n v1
协议,重启一下软件生效。这时候路由器和电脑就加入同一个N2N网络了,我们在路由器端ping Windows:
root@MagicBox:~# ping 10.2.5.3
PING 10.2.5.3 (10.2.5.3): 56 data bytes
64 bytes from 10.2.5.3: seq=0 ttl=64 time=1052.175 ms
64 bytes from 10.2.5.3: seq=1 ttl=64 time=525.018 ms
64 bytes from 10.2.5.3: seq=5 ttl=64 time=522.537 ms
64 bytes from 10.2.5.3: seq=6 ttl=64 time=320.722 ms
64 bytes from 10.2.5.3: seq=7 ttl=64 time=422.895 ms
^C
--- 10.2.5.3 ping statistics ---
9 packets transmitted, 5 packets received, 44% packet loss
round-trip min/avg/max = 320.722/568.669/1052.175 ms
上面的测试可以看到网络延时非常严重,因为电脑和路由器在同一个局域网。我把路由器拿到公司之后再ping一下家里的电脑:
root@MagicBox:~# ping 10.2.5.3
PING 10.2.5.3 (10.2.5.3): 56 data bytes
64 bytes from 10.2.5.3: seq=0 ttl=64 time=7.197 ms
64 bytes from 10.2.5.3: seq=1 ttl=64 time=8.212 ms
64 bytes from 10.2.5.3: seq=2 ttl=64 time=6.667 ms
64 bytes from 10.2.5.3: seq=3 ttl=64 time=8.371 ms
64 bytes from 10.2.5.3: seq=4 ttl=64 time=5.217 ms
64 bytes from 10.2.5.3: seq=5 ttl=64 time=8.936 ms
^C
--- 10.2.5.3 ping statistics ---
6 packets transmitted, 6 packets received, 0% packet loss
round-trip min/avg/max = 5.217/7.433/8.936 ms
由此可见N2N网络在不同公网之间的设备连接上表现优秀,但在用一个局域网的设备间很糟糕。
配置Android的N2N客户端
在Google Play上可以下载到Android的N2N客户端,点此进入,似乎是国人写的,功能非常强大。
配置界面:
配置完成后启动,可以看到和超级节点的注册信息,这时候手机也可以访问N2N网络的其他设备了,比如使用移动网络访问家里的路由器:
N2N中心节点的编译和部署
编译
svn co https://svn.ntop.org/svn/ntop/trunk/n2n
cd n2n && cd n2n_v1
make
编译完成之后会生成
edge
和supernode
两个可执行文件,可以使用make install
命令安装,或者拷贝到任意目录运行。调试
这里我们讨论服务器上的
supernode
,使用方法很简单:supernode -l <listening port> [-v] [-h]
测试的时候,建议开启调试日志,比如:
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
本文为原创文章,未经允许请勿非法盗用资源。我们保护知识产权,尊重每一个创作者的劳动成果。如需转载,请务必注明出处并获得授权,谢谢合作!
作者:Lance | 发表日期:2014 年 8 月 31 日