Passwall 是 OpenWrt 系统一款非常优秀的网络服务插件,通过该插件,就可以方便的运行各种科学上网工具进行代理上网。所以,理论上也可以把 Passwall 看做是 OpenWrt 平台的代理客户端,通过调用其他工具软件,来实现代理及分流功能。
Passwall 如想正常工作,还需要安装其需要使用的组件软件包,有些是系统依赖,也有些是工具组件。这些软件包会在 passwall 发布新版本时随同其发行版一同发行。这样就会出现一个时间差,如果在 passwall 新版本发布前,某些组件已经有了更新,特别是 xary、sing-box 以及 naive 等基础工具,就不能在第一时间将其全部更新至最新版。虽然 passwall 工具包含组件更新功能,可以更新一部分组件,但是其他组件还是需要等待新版本的发布了。
如果不想等待,也可以自行编译 passwall_packages 组件软件包的,并且可以交叉编译,是不是很方便呢。
本文就以 naiveproxy 组件为例,实例演示如何在 Debian 编译最新版的 OpenWrt 软件包。
1] 配置编译环境
想要编译 OpenWrt 软件包,最方便的方法是使用官方提供的 SDK 工具。根据自己所使用编译主机的 CPU 架构,下载对应的 SDK 程序包即可。>>官方下载地址在这里<<
在下载页面,可以看到一个名为”openwrt-sdk-24.10.2-x86-64_gcc-13.3.0_musl.Linux-x86_64.tar.zst”的压缩包,这即为编译 OpenWrt 软件包的 SDK 工具(示例使用x86-64架构),Debian 系统需要使用该工具进行软件包的编译。
Debian 系统想要正常编译,磁盘空间建议不低于 40 GB,版本最好使用 12 以上,并且系统已经创建了一个具体 sudo 权限的普通用户(例如user)。
进入 Debian 系统,切换到普通用户,使用如下命令安装编译所需要的依赖包:
$ sudo apt update $ sudo apt install build-essential clang flex bison g++ gawk \ gcc-multilib g++-multilib gettext git libncurses5-dev libssl-dev \ python3-setuptools rsync swig unzip zlib1g-dev file wget
依赖包安装守成后,使用如下命令下载并解压 SDK 工具包:
$ wget https://downloads.openwrt.org/releases/24.10.2/targets/x86/64/openwrt-sdk-24.10.2-x86-64_gcc-13.3.0_musl.Linux-x86_64.tar.zst $ apt-get install zstd $ tar -I zstd -xvf openwrt-sdk-24.10.2-x86-64_gcc-13.3.0_musl.Linux-x86_64.tar.zst $ cd openwrt-sdk-24.10.2-x86-64_gcc-13.3.0_musl.Linux-x86_64/
此时,编译 OpenWrt 软件包的基础环境就搭建完成了。
2] 编译 naiveproxy 软件包
查看目录中的内容,可以看到如下结构:
图.1 OpenWrt SDK 工具包目录结构
独立于 OpenWrt 源码之外的软件包,会创建并保存在 feeds 目录中,所以需要单独进行拉取和更新。而管理 feeds 的配置文件就是 feeds.conf.default 文件,将自定义的软件包添加至该文件,就可以在之后的编译目录中看到这些软件包了。
例如想要把 passwall 和 passwall-packages 软件包添加到 feeds,命令如下:
$ echo "src-git passwall_packages https://github.com/xiaorouji/openwrt-passwall-packages.git;main" >> "feeds.conf.default" $ echo "src-git passwall https://github.com/xiaorouji/openwrt-passwall.git;main" >> "feeds.conf.default"
添加完成后,就需要使用如下命令下载 feeds 源中的软件包源码(在 SDK 工具目录下执行):
$ ./scripts/feeds update -a $ ./scripts/feeds install -a
由于以上两条命令会下载 github openwrt官网等外网的资源,所以建议编译主机最好有科学上网环境,以提高编译成功率。
命令执行完成后,会生成一个 feeds 目录,用于保存软件包的编译信息。对于 naiveproxy 来说,其主要的编译信息保存在”feeds/passwall_packages/naiveproxy/Makefile”文件中。查看该文件,发现其最新的”PKG_VERSION:=139.0.7258.62″,并不是 naiveproxy 的最新版,于是可以修改该文件的 PKG_VERSION 至最新版正确值”PKG_VERSION:=140.0.7339.123″。
由于该编译文件中还具有 hash 值核验功能,编译时下载的软件包与文件中指定的 hash 值相同才会继续编译,所以还要修改文件中的如下部分:
ifeq ($(ARCH_PREBUILT),aarch64_cortex-a53) PKG_HASH:=88b631884518ad25eaee00350445824bb962283cf7665519d4d7b242605a95a4 else ifeq ($(ARCH_PREBUILT),aarch64_cortex-a72) PKG_HASH:=c8196e4ac5e60c933cdce968b1e630abf3577de1258a4c330eb99ea8649a177a else ifeq ($(ARCH_PREBUILT),aarch64_generic) PKG_HASH:=7fa990948c429c36fd0778cd9125e08aed79d5e92be6675951540ddd7069b2fb else ifeq ($(ARCH_PREBUILT),arm_arm1176jzf-s_vfp) PKG_HASH:=51db374620c21797a732d11e17b7ddc31e9be681804ea3145938a24320aaa66a else ifeq ($(ARCH_PREBUILT),arm_arm926ej-s) PKG_HASH:=abf5db455d57de10dec4b5e5d37903293bcbbe80a3baeb33aded53fb4d503db1 else ifeq ($(ARCH_PREBUILT),arm_cortex-a15_neon-vfpv4) PKG_HASH:=4ea19599f0287da886c79b93d3ac7ae03727402587fa3af5fdd3d12ad2e2a58e else ifeq ($(ARCH_PREBUILT),arm_cortex-a5_vfpv4) PKG_HASH:=6824c79925f5cc9c3a8fd8a2090c982a0b30c0ce014aa90f99a2f36ed68ada9d else ifeq ($(ARCH_PREBUILT),arm_cortex-a7) PKG_HASH:=456c896ac9a26d41a6bc0aea74262780516203a143cfb530906ac9a580d35ab5 else ifeq ($(ARCH_PREBUILT),arm_cortex-a7_neon-vfpv4) PKG_HASH:=0ac6f60ba0b90ef38aa88f1172b7119e07ec775b1776594afb51452f5b4af125 else ifeq ($(ARCH_PREBUILT),arm_cortex-a7_vfpv4) PKG_HASH:=361341cd9300e071f06545d92bf355bd83fe415af7392cffcd503e9207f273e5 else ifeq ($(ARCH_PREBUILT),arm_cortex-a8_vfpv3) PKG_HASH:=04eaadc2c6cf300c788d8531cdf04821c91a751bae720c2fc4631ec6445a0cd8 else ifeq ($(ARCH_PREBUILT),arm_cortex-a9) PKG_HASH:=523af9336b72da3a32f38d1975e86f15bdc859234f8e7f0a3c664fc31da2ce3f else ifeq ($(ARCH_PREBUILT),arm_cortex-a9_neon) PKG_HASH:=b20c2e0c098503d8b57c6ab70d70de401bb642a474521ccf0e700756ad7ed8e1 else ifeq ($(ARCH_PREBUILT),arm_cortex-a9_vfpv3-d16) PKG_HASH:=9658d4f6a9a7e753774b1b231808c5267addc7cea94e2e93e7f823ec84e279e3 else ifeq ($(ARCH_PREBUILT),arm_mpcore) PKG_HASH:=cfdcc0bfd70c689b01af8ebcc712f8a1431aeba77a4bc1522444268f9864d12d else ifeq ($(ARCH_PREBUILT),arm_xscale) PKG_HASH:=5c7706b1cb19e27d4c0135feea6af245e19af684b9e2bb38c3cea80c9adb970c else ifeq ($(ARCH_PREBUILT),mipsel_24kc) PKG_HASH:=70e248ffa44a067ced6c178f3aef09097e7bbd6030cb7d3776866880ad954eb6 else ifeq ($(ARCH_PREBUILT),mipsel_mips32) PKG_HASH:=a49e6088ddb1af6135fa2a46ba5c55db66b4a2ecd46cb6daf3776181a2e62296 else ifeq ($(ARCH_PREBUILT),riscv64) PKG_HASH:=4f8163daea361188f8eec3c1794b78416b898aff226e33e82f8ae6f96d403ac3 else ifeq ($(ARCH_PREBUILT),x86) PKG_HASH:=02e38a354b26ed8ebe7a753bac2f8a4a4b4210a23dcb430de0ab88b88b689f92 else ifeq ($(ARCH_PREBUILT),x86_64) PKG_HASH:=df910463af15f53b5540dcb23a9858ba73dd2bc336eea9625ba0360bd3b29042 else PKG_HASH:=dummy endif
此部分记录的 hash 值是 139.0.7258.62 版本的 hash 值,显然与最新版不一致,于是可以根据 naiveproxy 给定的 OpenWrt 各种架构的 hash 值重新设置。例如 x86_64 架构 naiveproxy 软件包的 hash 值是”sha256:5903794ae52b3f9f249dfd825c78235087f4253c528fbe60085d025cf5fb791a”,于是可以将 Makefile 文件中”PKG_HASH:=df910463af15f53b5540dcb23a9858ba73dd2bc336eea9625ba0360bd3b29042″修改为”PKG_HASH:=5903794ae52b3f9f249dfd825c78235087f4253c528fbe60085d025cf5fb791a”,这样,软件包的版本和 hash 值就匹配了。对于其他架构的 hash 值,也可以根据需要进行修改,示例只编译 x86_64 架构,所以只修改了该架构的 hash 值。
修改完成后,就可以使用如下命令定义软件包了:
$ make menuconfig
图.2 配置 OpenWrt 软件包
选择到指定的软件包,按空格键选择编译选项,<> 表示不编译;<*>表示编译到固件;<M>表示编译生成单独的 ipk 文件,如果仅想编译生成软件包,则在对应软件包前设置成 <M>即可。
选择完成后,选择 <Exit> 退出软件包设定。
设定完成后,就可以使用中下命令编译生成软件包了:
make package/naiveproxy/compile V=99
如果一切顺利,就会在 bin 目录生成对应的软件包:
图.3 生成 naiveproxy 软件包
对于交叉编译,只需要在配置软件包时,选择对应的架构,并修改 Makefile 文件中的 hash 值即可。是不是很简单呢,希望大家都可以自己尝试编译 OpenWrt 的软件包。