家庭网络 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网络的架构图如下:
n2n
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
n2n
这时候路由器和电脑就加入同一个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
配置完成后启动,可以看到和超级节点的注册信息,这时候手机也可以访问N2N网络的其他设备了,比如使用移动网络访问家里的路由器:
n2n
n2n

N2N中心节点的编译和部署

编译

svn co https://svn.ntop.org/svn/ntop/trunk/n2n
cd n2n && cd n2n_v1
make 
编译完成之后会生成edgesupernode两个可执行文件,可以使用make install命令安装,或者拷贝到任意目录运行。

调试

这里我们讨论服务器上的supernode,使用方法很简单:
supernode -l <listening port> [-v] [-h]
测试的时候,建议开启调试日志,比如:
supernode -l 8080 -v

总结

目前网上介绍N2N的文章非常少,但我觉得N2N的应用前景是非常广泛的,最典型比如物联网。将N2N协议可以在各种物联网设备上实现后,将这些设备组建成一个N2N网络,这些设备之间的通信和交互将变得更加方便,从而实现各种可能。
##参考资料
  1. hxihcom, OpenWrt中文应用技术网, (主流VPN技术比较) 无公网IP?远程访问路由?内附详细教程
  2. Luca Deri, Richard Andrews, N2N: A Layer Two Peer-to-Peer VPN
  3. vpnhosting.cz, N2n Gui En