前情提要可以看 n2n 的简单介绍。显然这个内网穿透应用需要长期在线运行,而为了能远程访问,最常见的能安心放在学校等地 24x7 运行的设备就是路由器或是树莓派了。树莓派用的是 Linux 系统,路由器用的主要是 Openwrt 和 LEDE。本文就将讨论在 Openwrt / LEDE 平台运行的 n2n 的编译。

交叉编译

在路由器上安装开发工具并编译程序显然不是很合适,毕竟 Flash 存储空间和 CPU 性能都极为有限,所以比较合适的编译方法就是在 Linux 平台上进行交叉编译。下面以 AR71xx 平台上的 Openwrt 为例,使用操作系统为 CentOS x64。

所需代码及依赖

编译步骤

获得 toolchain

  1. 创建开发用的目录并进入,这里选择的是用户主目录
1
$ cd ~
  1. 解压 SDK
1
$ tar jxvf OpenWrt-SDK-15.05.1-ar71xx-generic_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64.tar.bz2
  1. 提取 Toolchain
1
$ mv OpenWrt-SDK-15.05.1-ar71xx-generic_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64.tar.bz2/staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/ ~/mips_34kc_gcc
  1. 修改环境变量 vi ~/.bash_profile,增加如下代码:
1
2
3
4
5
6
...
PATH=~/mips_34kc_gcc/bin:$PATH
export PATH
STAGING_DIR=~/mips_34kc_gcc
export STAGING_DIR
...
  1. 引入环境变量
1
$ source ~/.bash_profile

编译 OpenSSL

  1. 解压代码并进入项目目录
1
2
$ tar zxvf openssl-1.0.2l.tar.gz
$ cd openssl-1.0.2l
  1. 执行设置脚本
1
$ ./config no-asm shared --prefix=~/mips_34kc_gcc
  1. 修改 MakeFile 文件 vi Makefile,搜索并修改下列部分:
1
2
3
4
5
6
7
...
CC= mips-openwrt-linux-gcc
...
AR= mips-openwrt-linux-ar $(ARFLAGS) r
RANLIB= mips-openwrt-linux-ranlib
...
NM= mips-openwrt-linux-nm
同时要删除文件里的 `-m64` 后缀(共两处)。
  1. 编译并安装
1
$ make && make install

编译 n2n

  1. 下载代码并进入项目目录
1
2
$ git clone https://github.com/meyerd/n2n.git
$ cd n2n/n2n-v2
  1. 修改 CMake 配置文件 vi CMakeLists.txt,在开头添加如下内容:
1
2
3
4
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAME_C_COMPILER mips-openwrt-linux-gcc)
SET(CMAKE_CXX_COMPILER mips-openwrt-linux-g++)
SET(CMAKE_FIND_ROOT_PATH ~/mips_34kc_gcc)
  1. 在 CMake 配置文件里添加链接库选项 -ldl
1
$ sed -i 's/ n2n)/ n2n dl)/g' CMakeLists.txt
  1. 新建 build 文件夹,用来存放编译出来的文件:
1
2
$ mkdir build
$ cd build
  1. 进行 CMake 设置,进行编译:
1
2
$ cmake ..
$ make
  1. 至此在目录里就生成了 supernodeedge 的二进制文件,传到路由器里就可以正常执行了。

参考

https://www.yjblog.net/post/123.html http://bbs.csdn.net/topics/392137961 http://blog.csdn.net/clirus/article/details/50151427 http://blog.csdn.net/idjoy/article/details/39908437