使用n2n搭建虚拟局域网

n2n是一个P2P(peer to peer)的网络工具。与我们之前介绍过的ngrok不同,n2n不是简单的将端口暴露到具有公有ip的服务器上,而是存在一个supernode,supernode的作用是帮助client完成点到点的连接,完成连接之后客户机相当于处在同一个局域网内。
n2n项目页面:https://github.com/ntop/n2n

服务端

这里以Ubuntu客户端为例

1
2
3
4
5
6
sudo apt-get install subversion build-essential libssl-dev autoconf
git clone https://github.com/ntop/n2n.git
cd n2n
./autogen
make
sudo make install

运行服务端程序
supernode -l 5000 -v
这句命令表示监听5000端口,-v用于输出日志,便于调试。

客户端安装

MacOS

brew install autoconf
brew install automake
brew cask install tuntap 这一步需要管理员权限,安装完成后需要在System Preferences → Security & Privacy → General中允许程序运行。参考这个页面:https://github.com/ntop/n2n/blob/master/doc/n2n_on_MacOS.txt

1
2
$ cd /usr/local/include
$ ln -s ../opt/openssl/include/openssl .

然后同样的,进入n2n文件夹,执行

1
2
3
./autogen
make
sudo make install

运行客户端程序
sudo /usr/local/sbin/edge -d edge0 -a 10.0.0.10 -c mynetwork -u 1000 -g 1000 -k passwd -l server-ip:5000 -m ae:e0:4f:e7:47:5b
参数说明:

“-a <IP地址>”选项(静态地)指定了分配给 TAP 接口的 VPN 的 IP 地址。如果你想要使用 DHCP,你需要在其中一台边缘节点上配置一台 DHCP 服务器,然后使用“-a dhcp:0.0.0.0”选项来代替。
“-c <组名>”选项指定了 VPN 组的名字(最大长度为 16 个字节)。这个选项可以被用来在同样一组节点中创建多个 VPN。
“-u”和“-g”选项被用来在创建一个 TAP 接口后降权放弃 root 权限。edge 守护进程将会作为指定的用户/组 ID 运行。
“-k <密钥>”选项指定了一个由 twofish 加密的密钥来使用。如果你想要将密钥从命令行中隐藏,你可以使用 N2N_KEY 环境变量。
“-l <IP地址:端口>”选项指定了超级节点的监听 IP 地址和端口号。为了冗余,你可以指定最多两个不同的超级节点(比如 -l <超级节点 A> -l <超级节点 B>)。
“-m ”给 TAP 接口分配了一个静态的 MAC 地址。不使用这个参数的话,edge 命令将会随机生成一个 MAC 地址。事实上,为一个 VPN 接口强制指定一个静态的 MAC 地址是被强烈推荐的做法。否则,比如当你在一个节点上重启了 edge 守护程序的时候,其它节点的 ARP 缓存将会由于新生成的 MAC 地址而遭到污染,它们将不能向这个节点发送数据,直到被污染的 ARP 记录被消除。

Ubuntu

Ubuntu客户机下的安装与服务器是一样的。

运行客户端程序
sudo /usr/sbin/edge -d edge0 -a 10.0.0.11 -c mynetwork -u 1000 -g 1000 -k passwd -l sparkydog.top:2333 -m ae:e0:4f:e7:47:5c

测试连接
在客户机A中ping客户机B的虚拟ip地址,如10.0.0.10 ,如果ping通,说明配置成功。
edge是一个后台常驻进程,如果想要停止edge,需要找到对应pid手动kill。
使用命令ps aux | grep edge或者sudo lsof -t -i:5644可以得到edge进程的pid

路由器

openwrt路由器直接运行opkg install n2n就可以。我的路由器是小米的R2D,不能直接使用opkg的源。
我使用了一个针对小米路由器的第三方的工具箱,项目页面: https://github.com/monlor/Monlor-Tools
通过工具箱可以安装Entware。Entware有自己的仓库,同样使用opkg进行包管理,比原生的仓库具有更好的兼容性。
安装Entware后运行source /etc/profile
然后就可以通过opkg安装n2n了。

这样,我们所有的主机设备和路由器都进入了一个虚拟的局域网内,机器之间可以方便的互相访问。

管理vlan中的节点

很多时候我们需要查询当前vlan中的节点ip,使用sudo nmap -sP 10.0.0.0-255进行查看。