在一般情况下, 两台机器如果是处在同一个局域网下,那么这两台机器可以通过各自的内网IP进行通信。 但是,在某些情况下你可能希望两个不同局域网的机器进行通信 , 此时 N2N 就能给我们带来一个简单快捷的解决方案,N2N 通过一些特殊的技巧,让不同网段的机器能够进行P2P( 点对点 peer-to-peer ) 通信。
这里列举一些可能的使用场景
N2N 这个项目被 官方搁置了几年的时间,但这项目仍然被很多人使用,于是官方在其网站表示恢复了对N2N项目的开发和维护( 2018年8月17日 )
那么,N2N 是怎么工作的呢? N2N是怎么样让两台不在同一网段的机器相互找到对方的。
在一般情况下 , 两台没有公网IP的机器是没有办法直接通过IP地址去找到对方的,这时候如果有一台拥有公网IP的服务器的话,那么事情就会变得很简单。
首先 ,两台处于内部网络的机器 主动去跟拥有公网IP的机器进行连接 , 然后向处于公网的服务器进行“注册登记”, 留下自己的连接方式 ,告诉公网服务器,如果有其它机器要找我,就把这些信息给它,它就知道怎么能够找到我了。 当然,出于安全考虑,这些想要相互连接的机器会留下一些验证口令, 只有口令正确匹配,它们才能够正确的组网。
以上的描述只是帮助你去理解N2N做的事情,但在实际的实现中,边缘节点的连接会有更复杂的策略,而且项目仍然在不断的更新中,如需要继续深入研究,可以查看N2N的源码(https://github.com/ntop/n2n)
1.1. N2N 的一些相关概念
在上面描述的流程中, N2N 官方对里面的角色有一些定义,在开始部署前,了解这些定义,能够帮助你快速理解这个软件的使用。
1.2 SuperNode 超级节点
SuperNode 相当与注册中心, 它会记录边缘节点的连接信息,告诉各个边缘节点如何去找到其它的边缘节点。如果超级节点发生故障,那么边缘节点之间将不能正常的进行通信。在整个N2N网络中必须至少拥有一个SuperNode。
1.3 Edge 边缘节点
边缘节点是指所有通过 SuperNode 组网而成的节点,无论你处于哪个位置哪种网络环境下,edge节点之间都能进行通信。
一台计算机可以拥有多个edge, 局域网根据子网掩码来决定两台机器是否处于同一个网段,而edge需要添加一组账号密码,在N2N 里面称作 GroupName 和 password ,Group0 和 Group 1 里面的 10.0.0.1 是不一样的。
环境准备:
操作系统 | 版本 | 角色 | 软件 |
---|---|---|---|
Linux操作系统 | Debain | superNode + edge | n2n,cmake |
Windows操作系统 | Windows10 | edge | n2nguien |
本教程的超级节点是部署在一个有公网IP的Linux系统,发行版是Debain.
如果你已经准备好了你系统环境,那么跟着教程来做吧!
n2n 能够通过软件源获取并自动安装,比如通过apt 安装
sudo apt-get install n2n
如果你需要手动编译最新源码,请参考下面内容
cmake将会在后面用到, 如果你还没安装,请参照下面命令
apt install cmake libssl-dev
apt install build-essential
第一步:下载 meyerd/n2n 的代码
git clone https://github.com/meyerd/n2n.git
第二步: 编译代码
#1.clone 下来的代码在用户所在目录,比如用root,那么代码会拉到 /root 目录下
#进入CD目录下,这里我们使用最新的 V2版本
cd /root/n2n/n2n_v2
#2.创建编译目录,并且进入编译目录
mkdir build
cd build
#3.执行cmake编译源码
cmake ..
make
编译成功后你可以看到 edge 、supernode 两个可执行文件,那么这部分完成
第三步:使用supernode 创建超级节点
#启动超节点 , 端口号为1000
./supernode -l 1000
#如果希望看到调试信息,加上-f 让supernode在前台运行,不过这样的话你关闭终端程序就会被终止
./supernode -l 1000 -f
经过上面三步,你的超级节点就已经部署完毕,是不是很简单。
本教程演示如何连接两个处于内网的机器,一个是linux, 一个是windows
同样的,跟部署超级节点一样,你需要在linux上编译n2n,如果忘记了请回看 2.1.2 安装n2n。
在安装好n2n 后,我们需要edge 这个命令来部署边缘节点,先来看下edge 比较重要的参数
参数 | 作用 |
---|---|
-a | 用来分配IP地址的,可以手动指定,也可以配置dhcp |
-c | n2n网络所属的组名 |
-k | 加入组所需的密码 |
-r | 是否开启通过组来进行包转发 |
-l | 指定supernode |
例子:
#创建一个IP为 10.10.10.10 的边缘节点,组名 mynetwork 密码 123
./edge -a 10.10.10.10 -c mynetwork -k 123 -l 超级节点IP:超级节点端口
#防止密码泄露,因为可以通过查看 edge的启动参数来获取密码
N2N_KEY=123 ./edge -a 10.10.10.10 -c mynetwork -l 超级节点IP:超级节点端口
安装 n2nguien , 安装过程忽略,一直下一步就可以(过程需要安装虚拟网卡)
启动软件后如下
通过ping命令相互测试,是否能够得到应答?
如果测试正常,那么说明,你们两台计算机已经能够根据组IP来相互找到对方了,剩下的使用跟在局域网通信一样
第一:请检查下你的防火墙,大多数情况下是防火墙干扰了通信。
第二:大多数情况下是能够实现内网穿透的,但仍然可能存在失败的情况。
第三:检查下n2n对应的虚拟网卡配置,有可能无意中被其它软件所改变。
第四:你要保证组网的n2n节点所使用的软件版本一致。
P2P, 点对点的连接,只有在初次连接的时候需要超级节点,在连接建立之后并不需要超级节点,所以你不用担心超级节点回嗅探你的流量。当然,凡事不可能一番风顺,如果因为某些愿意边缘节点之间的连接丢失了,就需要重新向超级节点求助了,所以别想着连接后可以关闭超级节点。
暂时找不到原因,使用 meyerd/n2n 吧。
n2ngui 只是一个UI,实际上还是调用edge.exe ,你也可以自己编译一个windows环境下的edge.exe , 把它替换到n2ngui 安装目录下就可以了
其它组网方案
zerotier 、 teamview中的VPN功能也能实现同样的功能。
如何关闭edge、supernode
#查看 edge 进程
ps -ef | grep edge
#查看 supernode
ps -ef | grep supernode
#根据PID结束进程
kill 655