日前,由于项目需要一部分人驻场外地开发,于是项目组之前在同一局域网内开发的协作模式受到影响,导致 注册中心、网关等公共服务无法连接各业务服务端点。最直接的解决方式就是再造局域网环境,之前接触过花生壳,也了解 udp 打洞基本概念,于是想到可以两地远程连入一个自建局域网。
经过一番了解,了解到相关实现工具选择不少,如n2n、softether、frp、ZeroTier
等。
鉴于 n2n 多平台、p2p 通信以及部署简单等特性,选择使用 n2n。最终实现效果是各地电脑 vpn 拨入指定 n2n 服务器,即可处于同一局域网,实现内网穿透效果。
Linux 安装
编译安装
-
环境
yum install -y openssl-devel yum install -y cmake yum install -y net-tools yum install -y gcc gcc-c++ git clone https://github.com/meyerd/n2n.git cd n2n/n2n_v2
-
编译
mkdir build cd build cmake .. make && make install
服务端启动(supernode)
服务端运行,需要开放对应 UDP 端口 7654
supernode -l 7654
将服务端也作为客户端启动,加入到虚拟网络中。
edge -a 192.168.10.11 -c group -k password -l server-ip:port
客户端启动(edgenode)
edge -a 192.168.10.21 -c group -k password -l server-ip:port
查看状态
查看 edge 或者 supernode 进程
ps -ef | grep supernode
ps -ef | grep edge
macOS 安装
截止目前 Mojave 10.14.2 版本可用。
安装 n2n
brew install openssl
brew install cmake
git clone https://github.com/meyerd/n2n.git
cd n2n/n2n_v2
#编辑 n2n_v2/CMakeLists.txt 文件,找到 set(CMAKE_C_FLAGS 和 set(CMAKE_CXX_FLAGS 两行,在这两行的里面括号里面的部分,加入编译参数:
vi CMakeLists.txt
-I/usr/local/opt/openssl/include -L/usr/local/opt/openssl/lib
#在 n2n_v2 创建 build 文件夹,cmake .. 来创建 Makefile, 然后 make
sudo make install
sudo chmod -R 777 /usr/local/sbin
安装虚拟网卡
brew cask install tuntap
#查看是否有如下两个内核扩展
ls /Library/Extensions/tap.kext
ls /Library/Extensions/tun.kext
#校验内核扩展的参数
find /Library/Extensions/{tap,tun}.kext/ -type f | xargs shasum
#加载内核扩展
sudo /sbin/kextload /Library/Extensions/tap.kext
sudo /sbin/kextload /Library/Extensions/tun.kext
客户端启动
sudo edge -a 192.168.10.31 -c group -k password -l server-ip:port
Windows 安装
windows 版说明
n2n_v2 版本 windows 客户端需要自己编译,编译出来的 edge.exe 替换安装软件里的 edge2.exe 即可。
以下提供个人编译出的客户端程序:
- windows 版 n2n: n2n-gui 安装包
- 最新 windows 版编译 (2018-12-30):edge2
编译环境 windows10-64 位,各位也可参考下文自行编译。
windows 版本编译
过程:
- 安装 cmake
- 安装 Mingw
- 编译 exe 文件
- 重命名并替换软件安装中的 edg2.exe 文件