假如想实现远程访问家里的路由、电脑,等等没有外网IP的设备,最简单的方式就是采用端口映射(端口转发),但是很多情况下我们没有路由的权限,这样根本就没有办法访问私网,因为受网关的保护。
之前想过通过socket
请求来发送的,但是必须是内网主动发起,不能外网主动发起,可以保持长连接来通信,但是实现起来有些难度,不好用。
n2n的出现使我眼前一亮,它是一款轻便开源的P2P虚拟网络软件,可轻松创建绕过中间防火墙的虚拟网络。其作者是著名的开源网管软件ntop的作者Luca Deri。基于P2P及点对点协议。也可以说是双层架构的,它让用户可以在网络层上开发P2P应用的典型功能,而不是在应用层上开发。
这意味着用户可以获取本地IP一样的可见度(比如说,同一个n2n网络内的两台PC机可以相互ping通),并且可以通过n2n虚拟网内的IP地址相互访问,而不必关心当前所属的物理网络地址。
对比来说,[OpenV.P.N.]是把SSL从应用层转移到网络层实现(比如说实现https协议),而n2n则是把P2P的实现从应用层转移到网络层。
n2n分两个部分,一个是supernode
,一个是edge
。supernode
即中心节点,edge
即边缘节点,supernode
的作用就是对两个edge
节点进行连接的作用,和p2p
服务器作用一样,且n2n数据是不走supernode
的,所以数据很安全。 n2n尽可能尝试在边缘节点之间建立直接的P2P连接。 如果不可能(通常是由于特殊的NAT设备),则超级节点也用于中继数据包。
用户PC 机上安装的用于建立n2n网络的软件。它们将成为虚拟网络一部分的节点,几乎每个edge节点都会建立一个tun/tap
设备,作为接入n2n网络的入口。
Edge 节点间通过虚拟的tap网卡交互。每个tap网卡都是一个n2n edge
节点。每台PC机可以有多个tap网卡,所以,在n2n网络中,同一台PC机可以属于多个网络。 在n2n中的多个边缘节点之间共享的虚拟网络称为社区。 单个超级节点可以中继多个社区,而单个PC可以同时成为多个社区的一部分。 边缘节点可以使用加密密钥对社区中的数据包进行加密。
超级节点:它允许边缘节点宣布和发现其他节点。 它必须具有可在Internet上公开访问的端口。它在edge 节点间建立握手,或为位于防火墙之后的节点中转数据。它的基础作用是注册节点的网络路径,并为不能直通的节点做路由,能够直通的节点间通信,是P2P的。
supernode 提供场所,让两个位于NAT/防火墙之后的edge node进行会面,一旦双方完成首次握手,剩下的数据流就之发生在两个edge node之间,如果有一方的NAT属于对称型(symmetrical),super node则还需继续为双方提供数据包的转发;edge node负责数据流的加解密,原理很简单。
大部分虚拟专用网络,都是通过服务器中转,而n2n是通过udp协议,在两边edge的NAT情况比较好的情况下,会建立两个edge之间的直接连接,一个北京和一个重庆的两个edge服务器,如果直连成功,之间的下载速度可以达到 n MB/s;当网络条件比较恶劣的时候,数据会从supernode中转,速度就靠到supernode的速度决定;
下载地址:https://github.com/ntop/n2n
一些Linux发行版已经提供了n2n作为软件包,因此简单的sudo apt install n2n
就可以完成工作。 另外,大多数发行版的最新软件包都可以在ntop
信息库中获得。
在host1上运行:
$ sudo edge -c mynetwork -k mysecretpass -a 192.168.100.1 -f -l supernode.ntop.org:7777
在host2上运行:
$ sudo edge -c mynetwork -k mysecretpass -a 192.168.100.2 -f -l supernode.ntop.org:7777
现在,两个主机可以相互ping通。
重要提示:强烈建议选择一个自定义社区名称(-c)和一个秘密加密密钥(-k),以防止其他用户连接到您的PC。 为了保护隐私并减少上述服务器负载,还建议按照以下说明设置自定义超级节点。
您可以通过在公共服务器(例如VPS)上设置超级节点supernode来创建自己的基础架构。 您只需要在防火墙(通常为iptables)上打开一个端口(以下示例中为1234)。
编辑/etc/n2n/supernode.conf
并添加以下内容:
-l = 1234
使用sudo systemctl start supernode
启动超级节点服务
(可选)在引导时启用超级节点启动:sudo systemctl enable supernode
现在,超级节点服务应已启动并在端口1234上运行。在边缘节点上,您现在可以指定-l your_supernode_ip:1234
来使用它。 所有边缘节点必须使用相同的超级节点。
在linux上,直接从源代码进行编译:
./autogen.sh
./configure
make
# optionally install
make install
edge也可以代替cli作为服务运行:
使用自定义选项编辑/etc/n2n/edge.conf
。 参见/etc/n2n/edge.conf.sample
。
启动服务:sudo systemctl start edge
(可选)在引导时启用边缘启动:sudo systemctl enable edge
您可以通过创建/etc/n2n/edge-instance1.conf
并使用sudo systemctl start edge @ instance1
启动它来运行多个边缘服务实例。
在supernode和edge 节点运行下面命令,这里尽量采用源码包编译安装。
$ svn co https://svn.ntop.org/svn/ntop/trunk/n2n
$ cd n2n/n2n_v1/
$ make && make install
$ cp supernode /usr/sbin/
$ cp edge /usr/sbin/
如果没有安装svn的话执行下面的命令
$ yum install subversion
加入我们在公网IP为1.2.3.4
的服务器上启用了中心节点:
$ supernode -l 8080 -v
$ ps -ef | grep supernode
8080即开发给边缘节点的端口。
则我们就可以使用下面的指令将其他机器作为Edge节点。
例如:
$ edge_v2s --help
$ edge_v2s -d n2nedge_v2s -a 172.10.2.200 -c community -u 604 -g 604 -k passwod -l 222.222.222.222:10088
-m 31:29:35:FB:C7:5B -r -L 192.168.1.100
$ ifconfig | grep 172.10.2.200
参数意义:
-d:虚拟网卡名称
-a:n2n网卡的ip地址,即是指指定一个IP给n2n中的边缘节点。
-c:n2n组,只有相同组的edge之间才能进行通讯
-u:如果不想用root来运行edge,则可指定本机账号的uid,windows下可忽略
-g:如果不想用root来运行edge,则可指定本机账号的groupid,windows下可忽略
-k:edge的加密密码
-l:supernode的ip和端口
-m:n2n虚拟网卡的MAC地址
-r:运行edge进行数据转发
-L:本机的内网地址,可以帮助同一个内网之间的通讯为直连,目前是v2s版本特有参数,官方版本暂无
-b:解析域名对应的ip,适用于supernode的ip使用域名来进行连接
在内网的另外一台机器上安装edge,启动的参数除了-a、-u、-g、-m、-L与另一个edge参数不同外,其他参数要一致,如
$ edge_v2s -d n2nedge_v2s -a 172.10.2.210 -c community -u 500 -g 500 -k passwod -l 222.222.222.222:10088
-m 8B:2A:76:3F:C0:7B -r -L 192.168.1.110
在需要加入n2n的第一个节点机器上执行:
edge -d n2n0 -c mynetwork -k encryptme -a 10.1.12.1 -l 1.2.3.4:8080
您还可以再次加入其他edge节点,这样节点与节点可以互相ping 通
再次在第2节点上运行如下命令
edge -d n2n0 -c mynetwork -k encryptme -a 10.1.12.2 -l 1.2.3.4:8080
如果成功的话在第一个节点上面进行ping第二个节点是能互相通的。
supernode -l 8080 >/dev/null &
edge -d n2n0 -c mynetwork -k encryptme -a 10.1.12.1 -l 1.2.3.4:8080 >/dev/null &
可以试一下用我的树莓派来做远程控制了,很期待。