n2n是一个二层的虚拟专网,允许用户开发网络中典型的P2P应用而不是在应用层开发。这就意味着用户可以透明的得到本地地址,只要新的IP地址在一个子网内,无论两台机器处于什么位置都能够ping通对方。

N2N网络的主要特点:

  • n2n网络是基于P2P协议的二层加密网络
  • 加密是在节点上完成的,而且使用的是用户的自定义密钥;你控制自己的安全,而不用让比如skype代表你(管理你的服务器节点)
  • 每个n2n用户可以同时属于多个网络
  • 能够反向的穿越NAT和防火墙,因此n2n节点即使在内网也是能够被访问到的,因此防火墙不再是IP级别直接通讯的障碍。
  • n2n网络并没有设计成独立的(自包含的),但是可能能够在n2n和非n2n网络之间路由数据。

n2n构架是基于两个部分的:
终端节点:安装在用户计算机上的应用使n2n网络被创建。每个节点设备都会创建一个TUN/TAP虚拟网卡设备作为接入n2n网络的入口点。
超级节点:作用是使终端节点能够访问到对称防火墙后面的其他终端节点。这个程序是那些无法直接通讯节点的目录记录器和包路由器。

N2N 对等VPN网络-LMLPHP

从图上可以看出,SuperNode作用是进行转发等通讯,因为其在公网,可以将两个内网的Edge节点连接起来。

  1. #!/bin/sh /etc/rc.common
  2. # Copyright (C) 2008-2012 OpenWrt.org
  3. START=90
  4. start_instance() {
  5. local cfg="$1"
  6. config_get type "$cfg" TYPE
  7. case "$type" in
  8. edge)
  9. config_get ipaddr "$cfg" 'ipaddr'
  10. [ -n "$ipaddr" ] || return 1
  11. config_get supernode "$cfg" 'supernode'
  12. config_get port "$cfg" 'port'
  13. config_get community "$cfg" 'community'
  14. config_get key "$cfg" 'key'
  15. config_get_bool route "$cfg" 'route' '0'
  16. [ "$route" = "1" ] && args='-r'
  17. service_start /usr/sbin/edge -f $args -a $ipaddr -c $community -k $key -l ${supernode}:${port}
  18. ;;
  19. supernode)
  20. config_get port "$cfg" port
  21. [ -n "$port" ] || return 1
  22. service_start /usr/sbin/supernode -l $port
  23. ;;
  24. esac
  25. }
  26. stop_instance() {
  27. local cfg="$1"
  28. config_get type "$cfg" TYPE
  29. case "$type" in
  30. edge)
  31. service_stop /usr/sbin/edge
  32. ;;
  33. supernode)
  34. service_stop /usr/sbin/supernode
  35. ;;
  36. esac
  37. }
  38. start() {
  39. config_load 'n2n'
  40. config_foreach start_instance 'edge'
  41. config_foreach start_instance 'supernode'
  42. }
  43. stop() {
  44. config_load 'n2n'
  45. config_foreach stop_instance 'edge'
  46. config_foreach stop_instance 'supernode'
  47. }

从对应的启动文件可以看出,使用非常的简单。

  1. config edge
  2. option ipaddr ''
  3. option supernode ''
  4. option port ''
  5. option community ''
  6. option key ''
  7. option route ''
 

ipaddr 本地虚拟网卡的地址
upsernode 超级节点的地址,可以是域名
port 想要使用连接的端口
community 对应的网络名称,同一个名称下才能互访
key 用户定义的需要访问这边SSH使用的key

下面的内容是我的两台主机和服务器之间的通讯输出Debug信息

  1. 10/Sep/2013 23:51:47 [ n2n.c: 49] Marshalling hdr: public_ip=(2)0.0.0.0:0, private_ip=(2)0.0.0.0:7654
  2. 10/Sep/2013 23:51:47 [ n2n.c: 638] 84 bytes compressed into 87
  3. 10/Sep/2013 23:51:47 [ n2n.c: 681] ### Tx N2N Msg -> network
  4. 10/Sep/2013 23:52:17 [ n2n.c: 843] Purging old registrations
  5. 10/Sep/2013 23:52:17 [ n2n.c: 848] Remove 0 registrations
  6. 10/Sep/2013 23:52:22 [ n2n.c: 49] Unmarshalled hdr: public_ip=(2)0.0.0.0:0, private_ip=(2)0.0.0.0:50000
  7. 10/Sep/2013 23:52:22 [ n2n.c: 540] +++ Received unreliable data packet [rcvd_from=60.215.250.204:50000][msg_type=MSG_TYPE_REGISTER][seq_id=0]
  8. 10/Sep/2013 23:52:22 [ n2n.c: 545] [src_mac=DE:AD:BE:EF:01:23][dst_mac=00:00:00:00:00:00][original_sender=0.0.0.0:0]
  9. 10/Sep/2013 23:52:22 [supernode.c: 312] Received message from node [60.215.250.204:-15536]
  10. 10/Sep/2013 23:52:22 [ n2n.c: 49] Unmarshalled hdr: public_ip=(2)60.215.250.204:50000, private_ip=(2)0.0.0.0:50000
  11. 10/Sep/2013 23:52:22 [ n2n.c: 49] Marshalling hdr: public_ip=(2)0.0.0.0:0, private_ip=(2)0.0.0.0:7654
  12. 10/Sep/2013 23:52:22 [ n2n.c: 49] Unmarshalled hdr: public_ip=(2)0.0.0.0:0, private_ip=(2)0.0.0.0:7654
  13. 10/Sep/2013 23:52:22 [ n2n.c: 736] Sent unreliable packet [msg_type=MSG_TYPE_REGISTER_ACK][seq_id=0][src_mac=00:00:00:00:00:00][dst_mac=DE:AD:BE:EF:01:23]
  14. 10/Sep/2013 23:52:22 [ n2n.c: 49] Marshalling hdr: public_ip=(2)0.0.0.0:0, private_ip=(2)0.0.0.0:7654
  15. 10/Sep/2013 23:52:22 [ n2n.c: 638] 84 bytes compressed into 87
  16. 10/Sep/2013 23:52:22 [ n2n.c: 681] ### Tx N2N Msg -> network
  17. 10/Sep/2013 23:52:47 [ n2n.c: 49] Unmarshalled hdr: public_ip=(2)0.0.0.0:0, private_ip=(2)0.0.0.0:50001
  18. 10/Sep/2013 23:52:47 [ n2n.c: 540] +++ Received unreliable data packet [rcvd_from=60.215.250.204:50001][msg_type=MSG_TYPE_REGISTER][seq_id=0]
  19. 10/Sep/2013 23:52:47 [ n2n.c: 545] [src_mac=DE:AD:BE:EF:01:24][dst_mac=00:00:00:00:00:00][original_sender=0.0.0.0:0]
  20. 10/Sep/2013 23:52:47 [supernode.c: 312] Received message from node [60.215.250.204:-15535]
  21. 10/Sep/2013 23:52:47 [ n2n.c: 49] Unmarshalled hdr: public_ip=(2)60.215.250.204:50001, private_ip=(2)0.0.0.0:50001
  22. 10/Sep/2013 23:52:47 [ n2n.c: 49] Marshalling hdr: public_ip=(2)0.0.0.0:0, private_ip=(2)0.0.0.0:7654
  23. 10/Sep/2013 23:52:47 [ n2n.c: 49] Unmarshalled hdr: public_ip=(2)0.0.0.0:0, private_ip=(2)0.0.0.0:7654
  24. 10/Sep/2013 23:52:47 [ n2n.c: 736] Sent unreliable packet [msg_type=MSG_TYPE_REGISTER_ACK][seq_id=0][src_mac=00:00:00:00:00:00][dst_mac=DE:AD:BE:EF:01:24]
  25. 10/Sep/2013 23:52:47 [ n2n.c: 49] Marshalling hdr: public_ip=(2)0.0.0.0:0, private_ip=(2)0.0.0.0:7654
  26. 10/Sep/2013 23:52:47 [ n2n.c: 638] 84 bytes compressed into 87
  27. 10/Sep/2013 23:52:47 [ n2n.c: 681] ### Tx N2N Msg -> network
05-07 15:14