近期,仔细研究了一下 OpenWrt 这个软件路由系统,发现其可玩性还是挺高的。但是系统性讲解 OpenWrt 编译的内容就比较少,一般都是直接推荐某款固件。其实 OpenWrt 官方资料还是比较全的,不过因为是英文内容,一下劝退很多人。本文将以x86_64 虚拟机为例,详细讲解如何直接编译带有 Passwall 插件的 Lienol 版 OpenWrt 固件。

1] 编译环境准备

Lienol 版 OpenWrt 最新版为 22.03,与官方版保持一致,由大神作了相应修改,加入中文翻译和一些常插件,整体简洁实用,非常适合学习研究。当然,最主要的原因肯定是确定可以成功编译出固件。

编译环境推荐使用 Ubuntu 18 LTS x64,那就建一个 VMWare 的虚拟机,2核 CPU,4GB内存,磁盘空间由于需要编译,可以分配大一点,80-100GB均可,至于启动镜像就直接使用 Ubuntu 官方网站下载的 18.04 桌面版镜像。

对于编译环境,最主要的要求就是可以科学上网。由于虚拟机执行编译脚本的终端程序不太容易连接代理,并且稳定性不能保证。我采用的方案是通过宿主机的代理软件,然后截取虚拟机上的所有流量,实现简单可靠的科学上网。对于 windows 平台的虚拟机,使用 v2rayN 等代理软件的 tun 模式,即可实现虚拟机流量代理;而 mac OS 系统相对容易,使用 Proxifier 软件即可实现应用流量截取。

2] 包含 passwall 插件的 OpenWrt 固件编译

编译固件时,需要确认虚拟机可以全局科学上网,还有就是不要使用 root 用户进行编译。

首先使用如下命令安装依赖包:

$ sudo update
$ sudo apt-get -y install build-essential asciidoc binutils bzip2 curl gawk gettext \
git libncurses5-dev libz-dev patch python3.5 python2.7 unzip zlib1g-dev lib32gcc1 \
libc6-dev-i386 subversion flex uglifyjs git-core gcc-multilib p7zip p7zip-full msmtp \
libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake \
libtool autopoint device-tree-compiler g++-multilib antlr3 gperf

之后使用如下命令下载源代码:

$ git clone -b 22.03 --single-branch https://github.com/Lienol/openwrt openwrt

使用”cd openwrt”命令进入”openwrt”目录后,使用如下命令修改固件的源文件,以增加 passwall 应用的支持:

$ 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"

然后使用如下命令更新和安装软件源:

$ ./scripts/feeds clean
$ ./scripts/feeds update -a
$ ./scripts/feeds install -a

使用如下命令即可进入固件的配置选择界面:

$ make menuconfig

固件配置界面如下:

图.1 OpenWrt 固件配置主界面

固件配置可以使用键盘操作,方向键移动光标,空格键进行选择。光标移动至某项后,按下空格,前面的括号中显示”*”星号表示该项被选中为内置,如果显示为”M”表示编译为模块。

需要选择的编译项包括如下内容:

  • Target System:目标系统,也就是编译的架构,根据自己需求选择,示例使用 x86
  • Target Image:目标镜像,也就是编译后生成的文件格式,使用默认的 .gz 压缩格式即可,其他格式可以根据该文件转换
  • Luci:Lua语言开发的统一配置界面,也就是 OpenWrt 的 web 管理界面,其中包含 Applications 子项,用于管理应用和插件,其中就包含了添加的 passwall 插件

至于其他内容,保持默认选项即可。

passwall 应用位于配置选项的 Luci -> Applications -> Luci-app-passwall,选中后将括号中显示为”*”号表示同固件一同编译:

图.2 添加 passwall 配置至固件

之后可以进入下方的 Configuration 子项进行进一步配置:

图.3 选择 passwall 组件

选择需要使用的组件,将组件前面选择至星号表示一同编译,不需要的组件去掉星号即可。注意组件不要贪多,自己使用什么就选什么,组件越多就越增加编译不通过的风险。

全部配置项选择完成后,光标移动至”<Save>”后按空格键保存配置,之后至”<Exit>”选项退出配置界面。

系统会提示配置文件已经成功保存,可以进行固件编译了。

编译使用如下命令:

$ make -j8 download V=s
$ make -j1 V=s

第一条命令用于下载相关文件,第二条命令会进入正式编译。其中”-j”后面跟的参数为线程数,第一次编译建议使用单线程,容易定位故障。编译时注意全程科学上网,编译中出现的多数问题均由文件未下载全引起。

编译时间很长,等待编译完成,基全程未出现报错信息,则表示固件编译成功。编译好的固件会保存在”openwrt/bin/targets”目录中,会根据固件架构生成对应目录,最终生成的固件保存在对应目录中:

图.4 编译生成对应固件

3] 固件的转换与使用

固件目录中可以直接使用的是两个 combined 压缩文件,带 efi 的表示支持 uefi 启动。未例只使用普通启动的”openwrt-x86-generic-generic-squashfs-combined.img.gz”文件。

由于示例需要将镜像文件转换成虚拟机磁盘文件,以部署虚拟机,所以使用如下命令将镜像压缩文件转换成 VMWare 虚拟机磁盘文件:

$ gzip -dk openwrt-x86-generic-generic-squashfs-combined.img.gz
$ qemu-img convert -f raw openwrt-x86-generic-generic-squashfs-combined.img -O vmdk openwrt-x86-generic-generic.vmdk

生成的 vmdk 文件就是虚拟使用的磁盘文件。

使用 VMWare 虚拟机软件,新建一个虚拟机,将默认的磁盘移除,将生成的”openwrt-x86-generic-generic.vmdk”作为磁盘添加至虚拟机,之后就可以启动虚拟机了。

如无意外,即可通过192.168.1.1访问 OpenWrt 的管理界面了。当然,如果虚拟机网段不是该网段,则可以通过修改”/etc/config/netwrok”文件来修改管理界面 IP 地址:

图.5 修改 OpenWrt 管理界面 IP 地址

之后,就可以通过浏览器打开设置的管理 IP,来访问 OpenWrt 的管理界面了:

图.6 OpenWrt 管理界面

可以看到,passwall 已经作为内置服务编译成功了。之后就可以配置 passwall,并将虚拟机作为旁路网关代理科学上网了。

至此,Lienol 版 OpenWrt 加入 passwall 固件编译就全部完成。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注