type
status
date
slug
summary
tags
category
icon
password
😀
根据已有文件进行环境配置与交叉编译,最终实现将监测程序挂载到实际路由器H3C Magic NX30 Pro上运行。
 

前置工作

安装编译所需工具和依赖

在ubuntu终端上输入以下命令,完成更新和安装。
build-essential
编译工具包的元宝,包含make、gcc
clang
c/c++等语言的编译器前端
flex
生成词法分析器
bison
生成语法分析器
g++
GNU的c++编译器
gawk
文本处理工具,可以实现提取特征字段、计算数据等功能
gcc/++ -multilib
允许用户在64位系统上编译32位的程序
gettext
实现消息文本不同语言的翻译
libncurses5 -dev
提供图形化界面的开发库
libssl -dev
可以支持OpenSSL的加密功能,如 SSL/TLS 协议、加密算法
python3 - setuptools
构建和安装Python包,提供自动生成setup脚本、管理依赖关系等
rsync
用于在本地或远程主机之间同步文件和目录
swig
提供将现有的 C/C + + 库封装成可以被其他语言调用的包
unzip
解压工具
zlib1g - dev
压缩库的开发包
这部分完成后,后续编译会使用到。

Linux环境下加速访问github

由于后续SDK是在github仓库获取更新,直接访问的连接不太稳定,且下载速度较慢,故利用Clash配置VPN,节省下载时间。

下载安装Clash

clash下载地址: 下载地址,ubuntu22.04以及以上版本选择如下:
notion image

解压安装

编写配置文件

配置文件需要修改为 config.yaml 后放到 `~/.config/clash/config.yaml,根据自己的订阅网址找到配置文件,复制粘贴即可。

终端代理

默认终端不会启用代理,需要手动配置:
或者临时配置代理:仅当前运行窗口有效:

网络代理

ubuntu打开设置→网络,更改“网络代理”为“手动”,填写代理配置信息:

代理管理

浏览器进入 http://clash.razord.top/#/proxies 页面可以进行代理管理,
图形化界面中可以切换和详细配置,查看日志等。

Openwrt虚拟机运行程序编译

固件编译

除了直接使用官方提供的镜像外,还可以通过源码自行编译镜像,
在终端输入配置以下命令:
  • 如果下载速度缓慢,打开网络代理
  • make menuconfig 命令执行后进入一个图形化窗口,主要关注 Target System , Subtarget 和 Target Profile 这三项:
    • notion image
      比如在我的openwrt虚拟机上,选择为x86_64架构,Generic x86_64。
 
保存配置后退出,开始编译镜像,
  • 如果是ubuntu执行make;
  • WSL则需要声明环境变量PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin make
  • 待编译完成后在 ./bin/target 下可以找到对应镜像,文件可以直接写入到路由器的存储设备中(如闪存)或者VM中来安装和运行 OpenWrt 系统
💡
一般来说不会直接编译整个openwrt的包,因为对配置和时间要求比较高,大部分情况下建议直接下载官方镜像,安装openwrt系统。
这里仅作演示使用,在我实际开发过程中还是使用的编译后的镜像。

SDK编译源程序

  • OpenWrt的SDK(Software Development Kit,软件开发工具包)是专门为开发和编译OpenWrt额外软件包而准备的一套集成工具和环境。(更侧重于用户的应用开发)
  • SDK包含交叉编译工具链、头文件、Makefile 框架等,用户可以在本地直接编译 OpenWrt 支持的软件包。
  • SDK版本和 OpenWrt 固件版本是配套的,编译出来的包能确保兼容现在的系统,避免因 ABI 不一致导致的各种“无法安装”问题。
 
对于实际Openwrt虚拟机的SDK,我的为x86_64架构:SDK下载地址

编译打包

下载后解压:
解压后将项目源代码的文件包放入SDK的package目录,得到以下目录结构:
其中Makefile文件规定了编译规则,内容如下:
💡
注意Makefile文件一定要用TAB,而不是两个空格,否则编译时会报错;
同时中文注释的编码格式也有可能引起报错。
下来回到目录 openwrt-sdk-24.10.0-mediatek-filogic_gcc-13.3.0_musl.Linux-x86_64/ 下,执行命令:
执行make后会弹出一个类似make menuconfig 的图形化配置窗口,注意global settings,advanced configuation options,libraries,base system配置。
notion image
notion image
notion image
notion image
编译打包时注意最好使用 -j=1 单线程,避免多个线程之间相互依赖报错,造成报错信息混乱。
成功编译后,在/bin/package/x86_64/base里面找到相应.ipk文件:
notion image

上传运行

通过共享文件夹方式,上传lab2和libpcap程序包到Openwrt虚拟机,然后安装:
notion image
选择对应端口后可以看到,程序终端正确执行了流量监测的任务。

路由器H3C Magic NX30 Pro中运行程序编译

固件下载

在官网https://firmware-selector.openwrt.org/下搜索设备对应的固件
notion image
下载得到如下文件,即图中1,2,4项目:
notion image
将文件 openwrt-24.10.0-mediatek-filogic-h3c_magic-nx30-pro-initramfs-recovery.itb 重命名为 openwrt-mediatek-filogic-h3c_magic-nx30-pro-initramfs-recovery.itb

连接路由器

该款路由器(H3C Magic NX30 Pro)默认开启了telnet服务. 首先进入路由器管理网页设置登录密码。随后通过该密码与用户名 H3C 使用telnet服务进入路由器后台(telnet端口为99)

开启SSH服务

按照以下步骤开启 SSH:

固件备份

查看分区信息:
重点备份ubi、factory、pdt_data、plugin这几个分区
备份后使用scp命令传出并删除文件,避免存储空间不足。

OpenWrt 刷入

将前文下载的文件 openwrt-24.10.1-mediatek-filogic-h3c_magic-nx30-pro-bl31-uboot.fip 传入路由器中,使用 winscp 工具。
写入uboot:
随后需要将其刷入 kernel。先将路由器断电,按住背后 Reset 按钮不放,再插电,等待 10s 左右进入uboot。
接着使用 PC 机用网线连接到路由器的 LAN 口。在网络设置中将本机的IP设置为 192.168.1.X ,网关设置为 192.168.1.1。

交叉编译配置

下载SDK并构建项目目录

下载地址中下载该路由器版本的cortex_a53架构SDK,解压后进入目录,传入之前写好的lab2源程序包,依然得到如下结构:

交叉编译软件包

先更新并安装依赖项:
编写的Makefile文件如下:
在/openwrt-sdk-24.10.0-mediatek-filogic_gcc-13.3.0_musl.Linux-x86_64/feeds/base/package/boot/uboot-mediatek文件目录下找到自带的Makefile,修改第838行的目标设备,指定为本型号路由器:
💡
这是Openwrt的软件包BUG,如果不修改指定对应设备,编译时会一直尝试查找设备,进入如下死循环:
notion image
然后执行交叉编译:
编译后查看对应文件属性,确认是我们想要的架构的文件格式:
notion image

内存优化与传输运行

通过ubuntu和windows的共享文件夹和以及Openwrt和windows间的scp,上传对应编译后的软件包到/temp(临时)目录:
notion image
尝试安装libpcap时发现操作系统内存不足:
notion image
通过查看并删除不必要的大型文件,实现内存优化:
然后重新安装,移动可执行程序到系统目录usr/sbin/中稳定运行:
Powershell上通过SSH登录Openwrt终端(实际上重启后仍可以),选择端口,最终实现在路由器上稳定流量监测:
notion image

未来的改进方向

开发可视化界面

利用前后端分离技术,实现可视化图表的流量监测统计,优化展示界面。

利用USB拓展系统内存

目前的开发基于单型号路由器,由于路由器和Openwrt存储空间有限,如果后续增加应用功能会导致编译和烧录时的限制;
可以考虑挂载USB存储,再创建overlay的符号链接,拓展overlay分区,然后使用外部存储运行程序;
这样可以最大限度地解决存储空间限制这一问题。
 

📎 参考文章

💡
有关Notion安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~