内网穿透之n2n-介绍及使用说明
文章目录
介绍
N2N 是一款开源的P2P v+p+n 软件,其作者是著名的开源网管软件ntop的作者Luca Deri。
N2N 是一个双层架构的v+p+n ,它让用户可以在网络层上开发P2P应用的典型功能,而不是在应用层上开发。这意味着用户可以获取本地IP一样的可见度(比如说,同一个n2n网络内的两台PC机可以相互ping通),并且可以通过n2n虚拟网内的IP地址相互访问,而不必关心当前所属的物理网络地址。可以这样说,OpenV+P+N是把SSL从应用层转移到网络层实现(比如说实现https协议),而n2n则是把P2P的实现从应用层转移到网络层。
架构
Edge 节点:用户PC 机上安装的用于建立n2n网络的软件。几乎每个edge节点都会建立一个tun/tap设备,作为接入n2n网络的入口。
Supernode 超级节点:它在edge 节点间建立握手,或为位于防火墙之后的节点中转数据。它的基础作用是注册节点的网络路径,并为不能直通的节点做路由,能够直通的节点间通信,是P2P的。
Edge 节点间通过虚拟的tap 网卡交互。每个tap网卡都是一个n2n edge节点。每台PC机可以有多个tap网卡,所以,在n2n网络中,同一台PC机可以属于多个网络。
其中super node 提供场所,让两个位于NAT/防火墙之后的edge node进行会面,一旦双方完成首次握手,剩下的数据流就之发生在两个edge node之间,如果有一方的NAT属于对称型(symmetrical),super node则还需继续为双方提供数据包的转发;edge node负责数据流的加解密,原理很简单。
与传统的v+p+n的优点
大部分v+p+n,都是通过服务器中转,而n2n是通过udp协议,在两边edge的NAT情况比较好的情况下,会建立两个edge之间的直接连接,一个北京和一个重庆的两个edge服务器,如果直连成功,之间的下载速度可以达到 n MB/s;当网络条件比较恶劣的时候,数据会从supernode中转,速度就靠到supernode的速度决定;
安装
地址
v2.1(v2s): https://github.com/meyerd/n2n/tree/master/n2n_v2 非官方版本,与官方的 v2 不兼容
安卓版本: https://github.com/switch-iot/hin2n (最新版本支持v1、v2、v2s)
通过网友的测试,n2n_v2s直连概率比较高,所以本文暂时只介绍n2n_v2s的安装及使用方法
安装方法
详见 https://github.com/meyerd/n2n/wiki
使用方法
supernode
在有公网的的服务器上安装supernode,为了区分其他版本,重命名为supernode_v2s
[root@localhost ~]# supernode_v2s --help
supernode_v2s usage
-l <lport> Set UDP main listen port to <lport>
-f Run in foreground.
-u <UID> User ID (numeric) to use when privileges are dropped.
-g <GID> Group ID (numeric) to use when privileges are dropped.
-v Increase verbosity. Can be used multiple times.
-h This help message.
# 启动supernode
[root@localhost ~]# supernode_v2s -l 10088
[root@localhost ~]# ps -ef|grep supernode_v2s
root 21024 1 0 Apr25 ? 00:03:59 supernode_v2s -l 10088
edge
在内网电脑上安装edge,为了区分其他版本,重命名为edge_v2s
[root@localhost1 ~]# edge_v2s --help
Welcome to n2n v.2.1.0 for Linux-2.6.32-642.el6.x86_64
Built on Jun 12 2018 18:21:36
Copyright 2007-09 - http://www.ntop.org
edge -d <tun device> -a [static:|dhcp:]<tun IP address> -c <community> [-k <encrypt key> | -K <key file>] [-s <netmask>] [-u <uid> -g <gid>][-f][-m <MAC address>]
-l <supernode host:port> [-p <local port>] [-M <mtu>] [-r] [-E] [-v] [-t <mgmt port>] [-b] [-h]
-d <tun device> | tun device name
-a <mode:address> | Set interface address. For DHCP use '-r -a dhcp:0.0.0.0'
-c <community> | n2n community name the edge belongs to.
-k <encrypt key> | Encryption key (ASCII) - also N2N_KEY=<encrypt key>. Not with -K.
-K <key file> | Specify a key schedule file to load. Not with -k.
-s <netmask> | Edge interface netmask in dotted decimal notation (255.255.255.0).
-l <supernode host:port> | Supernode IP:port
-L <local_ip> | Add local ip to bypass between same nat problem
-i <interval> | Set the NAT hole-punch interval (default 20seconds)
-b | Periodically resolve supernode IP
: (when supernodes are running on dynamic IPs)
-p <local port> | Fixed local UDP port.
-u <UID> | User ID (numeric) to use when privileges are dropped.
-g <GID> | Group ID (numeric) to use when privileges are dropped.
-f | Do not fork and run as a daemon; rather run in foreground.
-m <MAC address> | Fix MAC address for the TAP interface (otherwise it may be random)
: eg. -m 01:02:03:04:05:06
-M <mtu> | Specify n2n MTU of edge interface (default 1400).
-r | Enable packet forwarding through n2n community.
-E | Accept multicast MAC addresses (default=drop).
-v | Make more verbose. Repeat as required.
-t | Management UDP Port (for multiple edges on a machine).
Environment variables:
N2N_KEY | Encryption key (ASCII). Not with -K or -k.
# 启动edge
[root@localhost1 ~]# 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
# 查看edge的ip
[root@localhost1 ~]# ifconfig |grep 172.10.2.200
n2nedge_v2s Link encap:Ethernet HWaddr 31:29:35:FB:C7:5B
inet addr:172.10.2.200 Bcast:172.10.2.255 Mask:255.255.255.0
inet6 addr: fe80::fe0c:8eef:f86e:d10/64 Scope:Link
TX packets:1096871 errors:0 dropped:0 overruns:0 carrier:0
TX packets:470900375 errors:0 dropped:0 overruns:3105 carrier:0
RX bytes:11377271 (10.8 MiB) TX bytes:41626135028 (38.7 GiB)
常用参数说明:
-d:虚拟网卡名称
-a:n2n网卡的ip地址,即本机的n2n的ip
-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_v2s,启动的参数除了-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
附一个MAC地址在线生成:http://www.99cankao.com/digital-computation/mac-address-generator.php
edge连接测试
在多个edge之间相互ping看是否能通,然后通过n2n的内网ip访问下载服务,查看下载速度;
通讯速度和网络运营商的关系
目前来看,电信+电信直连概率大,速度快;最差的是移动;
常见问题
- 怎么知道自己的 edge 是否已经与中心节点 supernode 连接成功了?
针对 N2N_V2 每两分钟显示一条,V2s 则每 25s 一条下面的信息 关键字:Rx REGISTER_SUPER_ACK myMAC
Rx REGISTER_SUPER_ACK myMAC=EE:DC:38:99:C9:42 [123.249.20.254:10086] (external 218.89.10.162:50021). Attempts 2
- 如果中心节点 supernode 失效了会是什么样子呢?
针对 edge_v1,则每分钟显示
Registering with supernode
针对 edge_v2,则每 40 秒显示,针对 edge_v2s,则每 20 秒显示
WARNING: Supernode not responding - moving to 0 of 1
- 如果 edge 与 supernode 的版本对应错了,会是什么样子的?
edge_v1 试图与 supernode_v2 或 v2s 连接(每分钟出现一条下面的信息)
Registering with supernode
edge_v2 或 v2s 试图与 supernode_v1 连接时,反复出现如下信息(V2 每 40 秒,v2s 每 20 秒)
WARNING: Supernode not responding - moving to 0 of 1
edge_v2 试图与 supernode_v2s(v2s 试图与 V2)连接时,反复出现如下信息(V2 每 10 秒,v2s 每 5 秒)
Rx REGISTER_SUPER_ACK myMAC=1D:C9:00:00:00:00 [123.249.20.254:10088] (external 218.89.10.162:42858). Attempts 2
WARNING: Rx REGISTER_SUPER_ACK with wrong or old cookie.