OpenWrt 软路由下运行 nConnect

内容分为三个部分 : 一、背景介绍; 二、编译; 三、运行。

一、背景介绍

1. 为什么要在软路由里运行 nConnect 服务端?

  • 在软路由里运行 nConnect 服务端有几个好处:
    • 最大好处是,通过反向代理,访问家里局域网中的所有设备;
    • 其次是,软路由基本上全天开机,并且性能上有比较大的冗余,所以最适合作为内网穿透的中转站;
    • 最后是,相比较于将 nConnect 服务端安装到群晖和电脑,通过软路由访问终端设备路径是最短的。(理论上是这样)
  • 当前面临的问题:
    • nConnect 服务端有群晖版、QNAP版、Windows版、 docker版,甚至有 Linux 的 arm64 版本,但就是无法运行在我的软路由里。(nConnect官方技术小伙伴给我的反馈是,我软路由环境里的C库不是stdc,而是musl C库, 等官方针对 musl libc 预先编译一个 nConnect 二进制,大家就不需要看我的教程了)
    • 折腾一周后, 所以就决定自己在软路由的环境里编译一个出来使用。

2. 硬件环境介绍

  • 软路由是性能还不错的 R2S;
  • R2S的CPU架构:ARMv8 Processor rev 4 (v8l) x 4 (1200MHz)

3. 系统环境介绍

  • 我在R2S里安装的系统是基于 openwrt-18.06 的分支 ImmortalWrt
  • 这个系统缺少了编译环境,所以第一步就是要先安装各种基础的编译工具

二、编译

编译的过程简单说就是三步, 1 搭建环境;2 下载源码; 3 编译;

但编译过程会有一些坑,根据编译环境里的改变,可能会遇到不一样的坑。遇到问题可以联系 NKN 的技术人员,只要他们有时间都会热心解答。 或者直接跟我要编译好的程序。

下面开始编译

  1. 搭建编译环境:

其实就是安装一些基础编译工具的过程,有两个方法:

  • 方法一,一句命令搞定 opkg install gcc automake autoconf libtool make golang
  • 方法二,打开 openwrt 的后台 > 系统 > 软件包,一个个安装以下编译工具:
    • gcc、automake、autoconf、libtool、make、golang

2. 下载源码

3. 开始编译

  • 进入 nConnect 源码目录:
    • cd /nkn/
  • 编译:
    • 方法一,make
    • 方法二, go build
  • 当源码目录下出现 nConnect 文件时即代表编译成功

4. 编译时遇到的坑

  • 编程时出现错误: /usr/bin/ld: cannot find -lpthread
  • 解决办法只需要创建一个空的libpthread,运行:ar -rc /usr/lib/libpthread.a

三、运行

  1. 首先进入 nConnect 的工作目录 (Working Directory):
  • cd /nkn
  • 这一步是必须的, 如果没进入工作目录,后面将打不开 nConnect 的配置页面

2. 运行 nConnect

  • 运行 ./nConnect -s --tuna --admin-http=172.0.0.1:6666
  • 后面的 6666 是端口地址,可以自定义
  • 注意:不能直接用绝对路径来运行,如: /nkn/nConnect -s --tuna --admin-http=172.0.0.1:6666

3. 运行成功后

用浏览器打开 「路由器的IP+端口」 的地址即可开始配置 nConnect 服务端, 如:192.168.1.1:6666

关于如何配置服务端请参考 nConnect 官方的其它教程。

四、 开机自启动

先来补充几个小知识:

  1. Systemd
  • ( d 即单词:daemon,亦称后台进程)
  • 网上搜索了解当虽然争议比较大,但比较新的 Linux 发行版基本上用的都是这个。
  • 通过命令 systemctl --version 检查版本时发现,我当前用的 Openwrt 没有 Systemd 。
  • 所以需要 procd + init.d 来替代,如下
  1. Procd (process management daemon)
  • Procd 是 Openwrt 中的进程管理服务, 它是一种守护进程,用来监控系统进程的状态,保证某些进程异常退出后自动重启。 需要结合 init 脚本使用。
  1. 初始化脚本管理:/etc/init.d/
  • /etc/rc.d/ 是 Linux 系统的启动目录
  • 但是所有的启动脚本都放在 /etc/init.d/, 再软链到/etc/rc.d。
  1. 管理服务的常用命令:
  • 以下两种命令都可以,结果一样
    • service nConnect + start , stop, restart, reload, status, enable, disable
  • /etc/init.d/nConnect + start , stop, restart, reload, status, enable, disable
  • 关键的三个命令
    • service nConnect start 启动服务
  • service nConnect stop 停止服务
  • service nConnect enable 将服务设为自启动

下面开始分五个步骤完成设置:

第一步:

  • 创建开机运行脚本:
    • vi /etc/init.d/nConnect
  • 填入以下内容
#!/bin/sh /etc/rc.common

START=99
USE_PROCD=1

start_service() {
    procd_open_instance nConnect run
    procd_set_param command sh /nkn/sr/run.sh
    procd_set_param respawn                           
    procd_close_instance                              
    echo service nConnect start
}

stop_service() {
    killall nConnect
    echo service nConnect stop
}

restart_service() {
    stop
    start
}

第二步:

  • 更改脚本权限,让脚本能够被执行
    • chmod -R 777 /etc/init.d/nConnect

第三步:

  • 创建执行脚本文件:vi /nkn/sr/run.sh
  • 填入以下内容
rm -f /nkn/nkn.log
echo service nConnect start
cd /nkn/sr/
./nConnect -s --tuna --admin-http="192.168.2.1:33333" > /nkn/nkn.log

第四步:

  • 打开开机自启动:
    • /etc/init.d/nConnect enable
  • 重启系统
    • reboot

第五步:

  • 验证是否打开了自启动
    • 在 Openwrt 后台 > 系统 > 启动项 里查看开机启动项,找到 nConnect,看下是否已经设为开机自启动
  • 验证是否成功启动 nConnect
    • 运行 ps -ef |grep nConnect
  • 如果看到 ………nConnect -s --tuna --admin-http=“192.168.2.1:33333” 则代表启动成功
  • 或者能打开 nConnect 即代表启动成功
3 Likes

完美~! 这么有质量的分享值得鼓励鼓励~!