介绍

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的速度决定;

安装

地址

通过网友的测试,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.