n2n 是点对点类型的 vpn, 轻量级,容易安装与配置.

官方网站在这里

在安装使用中,还是碰到几个小坑,记录下来. 另外其版本有 v1,v2二个,这里都使用 v2版本. 其用法二个版本都一样,但不同版本通信协议不兼容, 所以所有节点都要使用相同的版本.

使用场景

边缘节点有三个

  • zte h610b 路由器,安装 tomato, 无公网 ip
  • RMBP 工作用电脑,安装 mac os, 内部 ip
  • hk vps 一台,安装 ubuntu,有 固定公网 ip,地址为 a.b.c.d

超级节点一个,也就是上面有 ip 的 vps.

安装记录

hk vps

ubuntu 上安装最简单. 但 apt-get install n2n 是 v1的版本.我这里要用 v2,自己编译下.

sudo apt-get install subversion build-essential libssl-dev
svn co https://svn.ntop.org/svn/ntop/trunk/n2n
cd n2n/n2n_v2
make

然后就能生成需要的二个文件,超级节点守护程序supernode及边缘节点通信程序edge. 安装libssl-dev 有时候会进坑,报错说已经安装的 ssl 版本太新. 修复方式是在/etc/apt 源里,添加对应的 updates 源,更新后再安装. 如:

deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted

首先启动超级节点,监听端口999

sudo ./supernode -l 999

然后本机也做为边缘节点启动

sudo ./edge -d n2n0 -a 10.1.1.10 -c ahuin2nvpn -u nobody -g nobody -k ahuin2nvpn -l a.b.c.d:999 -m ae:e0:4f:e7:47:1a

其中一个小坑就是 -m 参数. 如果不指定,会产生一个随机 mac 地址,这样至少调试的时候多次运行,会出现 mac 混乱. 但指定的 mac 地址,有些不会识别,比如随便写个 ab:ab:ab:ab:ab:ab, 程序不会识别并自动产生一个新的随机 mac. 跳坑方法是找个真实的 mac 地址,然后改动最后二位.

zte h610b 路由器

这个真的没有真 ip,用的移动光纤,给了个看上去象真的,其实是假的 ip.

tomato 有人做好了现成的版本, 打开 jffs 并挂载,然后把编译好的 n2n 放在/jffs/n2n 中. 备注:我用的地址1上的版本.

下载地址1 以及 下载地址2

加载一下 tun 设备

modprobe tun

运行很简单

./edge -d n2n0 -a 10.1.1.20 -c ahuin2nvpn -u nobody -g nobody -k ahuin2nvpn -l a.b.c.d:999 -m ae:e0:4f:e7:47:2a

运行后,ping 10.1.1.10能通,反之不行.

设置 iptables

iptables -I OUTPUT -o n2n0 -j ACCEPT
iptables -I INPUT -i n2n0 -j ACCEPT
iptables -I FORWARD -o n2n0 -j ACCEPT
iptables -I FORWARD -i n2n0 -j ACCEPT

ok,现在能与10.1.1.10互相 ping 通. 此时二台机器可以认为在同一个局域网.

RMBP 工作用电脑

mac 上坑最多. 前提之一开发环境已经就绪,git svn 都 ok. 我这里用 git

首先安装 tuntap, 在这里下载

下载源代码并编译:

git clone git://github.com/certik/n2n.git
cd n2n/n2n_v1
make

出错啦,编译失败. 有好人做了补丁, 打完后再 make, 通过.

或者手动修改, 删除void tunclose(tuntapdev *device); 这行,并将tunclose(device);替换为tuntapclose(device);,改动这二处就 ok.

mac 下会自动生成 tun 设备 tap0, 所以运行时不用指定-d 参数:

./edge -a 10.1.1.30 -c ahuin2nvpn -u nobody -g nobody -k ahuin2nvpn -l a.b.c.d:999 -m ae:e0:4f:e7:47:3a

大功告成,现在10.1.1.10, 10.1.1.20, 10.1.1.30三个节点都能互相 ping 通, 并互相访问所有端口,就象在同一个局域网里面.

问题

理论上超级节点并不参与数据转发, 不过我测试的时候,ping 包至少是转发了的, 估计是与边缘结点没有公共 ip 有关. 其他流量没测试.

n2n 是点对点的, 如果想要把边缘结点后面的局域网也连起来, 应该能 通过在节点上通过手动指定路由并做 nat来实现, 当然这样配置起来就麻烦多了.

n2n 的最佳应用,应该是通过外网访问内网,特别是内网没有公共 ip 的时候,比如移动光纤...

要通过 n2n 访问一些不存在的网站,要做额外工作,可能 openvpn 更适合.