如何为开发板编译 OpenWrt
目标
为 树莓派5 编译 ImmortalWrt 固件,支持以下功能:
- USB 转千兆网卡,和板载网口分别作为 WAN 和 LAN 接口
- Mihomo 局域网透明代理
- Tailscale 子网路由实现远程访问内网资源
本文理论上适用于所有已被官方支持的硬件。
重要
操作前先读完全文。
为什么需要 OpenWrt?
1. 网速
校园网有线网带宽是上下对等 1000M,而无线网实测(非高峰期)不到 200M。


希望搭建一个内网让更多设备使用高带宽低延迟的网络。
2. 安全性
THU 有线/无线网络会给每一个设备分配公网 IPv4 地址,基于安全性的考虑,学校信息化用户服务系统会时常扫描设备端口,尤其是 7890 (clash),11434 (Ollama) 等常见软件,如果机器防火墙配置不当容易导致账号被封。但是将主机放在内网中就不存在此类问题。
3. 透明代理与内网穿透
几乎所有设备都有上外网需求,尤其是 Windows 主机,由于存在 WSL 和部分不遵守系统代理的软件,再考虑到我使用的翻墙协议/分流/操作便捷性,我常常选择 Mihomo 内核的各类 GUI 客户端。
另一方面,我希望自己部署的一些服务能加密传输数据,部分小工具(如 LocalSend)也依赖内网环境,较好的解决方案是 Tailscale。
众所周知,现有的 Mihomo GUI 客户端开发迭代速度快,bug 很多。而且同时运行代理(TUN Mode)与内网穿透软件时会使得网络环境变复杂,DNS 和 IPv6 等配置难以调试,容易导致 Tailscale P2P 打洞成功率降低。
综合考虑,最好将主机的网络流量全部交给 OpenWrt 及其插件处理。
为什么不使用现成的固件?
- 我想严格按照个人需求定制固件。
- 树莓派5 比较新,只能用 OpenWrt 24.10 分支。然而官方软件包仓库里面缺少大量 Nikki 需要的网络支持,安装软件包时手动解决依赖问题不如从头编译方便。
这篇教程适合?
新手。会使用 Shell 和搜索引擎即可。
提示
部分校园网有严格的多设备检测机制(基于 UA/TTL/时钟偏移 等),本文不完全适合此类用户,不过可以参考这里的固件编译流程加入各类伪装组件。
网络拓扑
准备工作
1. 硬件
网上主流的方案是 x86 的迷你主机/工控机(性能强,兼容性好)以及 ARM 开发板/电视盒子(低功耗)。我使用的是一个闲置 树莓派5(4GB)。购买之前先确认板子是否受支持。
另外,如果你像我一样,板子只有一个 RJ-45 网口,考虑购买一个 USB 转千兆网卡。同样购买前确认一下网卡芯片是否有对应驱动:在 Kernel Modules 中搜索 kmod-usb-net,查看所有受支持的 USB 网卡。
提示
实测 RTL8153 芯片的网卡可以使用 RTL8152 驱动。
如果你手上有一张网卡但是不知道型号,可以接在电脑上,打开设备管理器,找到对应的网卡,在属性-详细信息-属性中选择“硬件 Id”,然后在网上搜索即可。

2. 编译环境
一个 Linux 机器,系统推荐 Ubuntu 24.04 LTS,可以是虚拟机,如果使用 WSL2 则根据官方文档进行额外配置:
echo 'export PATH=$(echo $PATH'" | sed 's|:/mnt/[a-z]/[a-z_]*\?/\?[A-Za-z]* [A-Za-z]* \?[A-Za-z]*\?[^:]*||g')" >> ~/.bashrc退出并重新进入 Shell 生效。
我编译的是 ImmortalWrt,ImmortalWrt 是 OpenWrt 的一个分支。不同分支的对比可以参考这个。
重要
进行下面步骤之前务必确保 Linux 机器已经配置好代理,从终端中可以访问 GitHub 等网站,避免后续下载源码/编译过程中因为网络问题失败。
提示
APT 换 TUNA 源
安装 Debian/Ubuntu 下编译 OpenWrt 所需的依赖:
# Method 1
sudo apt update -y
sudo apt full-upgrade -y
sudo apt install -y ack antlr3 asciidoc autoconf automake autopoint binutils bison build-essential \
bzip2 ccache clang cmake cpio curl device-tree-compiler ecj fastjar flex gawk gettext gcc-multilib \
g++-multilib git gnutls-dev gperf haveged help2man intltool lib32gcc-s1 libc6-dev-i386 libelf-dev \
libglib2.0-dev libgmp3-dev libltdl-dev libmpc-dev libmpfr-dev libncurses-dev libpython3-dev \
libreadline-dev libssl-dev libtool libyaml-dev libz-dev lld llvm lrzsz mkisofs msmtp nano \
ninja-build p7zip p7zip-full patch pkgconf python3 python3-pip python3-ply python3-docutils \
python3-pyelftools qemu-utils re2c rsync scons squashfs-tools subversion swig texinfo uglifyjs \
upx-ucl unzip vim wget xmlto xxd zlib1g-dev zstd# Method 2
sudo bash -c 'bash <(curl -s https://build-scripts.immortalwrt.org/init_build_environment.sh)'3. 获取源码
-b 参数指定分支,我编译的是 OpenWrt 24.10 版本。
git clone -b openwrt-24.10 --single-branch --filter=blob:none https://github.com/immortalwrt/immortalwrt
cd immortalwrt4. 获取 feeds
feeds 记录了 OpenWrt 的软件包信息。如果需要非官方的软件包,需要先添加对应的 feed 源。例如我需要 Nikki 进行透明代理,根据其文档添加源:
echo "src-git nikki https://github.com/nikkinikki-org/OpenWrt-nikki.git;main" >> "feeds.conf.default"添加完所有自定义的包之后,更新并安装 feeds(也就是获取软件包 Makefile):
./scripts/feeds update -a
./scripts/feeds install -a编译
1. 配置编译选项
进行编译选项的配置:
make menuconfig可以看到这样的界面:

上方有操作指南。
在 Target System 选项中选择你的开发板对应的架构,例如树莓派是 BCM2712:

回到主菜单,选择 Subtarget,选择具体的型号:

回到主菜单,选择 Target Profile,选择具体的开发板型号:

回到主菜单,Target Images 保持默认的 ext4 squashfs 两种格式。
进入 Kernel modules,选择 USB Support,勾选对应的 USB 网卡驱动:

回到主菜单,进入 Network,选择 VPN,勾选 Tailscale:

回到主菜单,进入 LuCI,选择 3. Applications,勾选 luci-app-nikki:

可以在 4. Themes 中勾选 luci-theme-argon,这个主题比较好看:

一路 Exit,保存配置到 .config 文件:

2. 下载软件包源码(可选)
如果对网络稳定性没有自信,可以先下载所有软件包源码:
make download -j$(nproc)等待下载完成,确保没有报错。
3. 编译
make -j$(nproc)作为参考,在一台 i9 13900-HX,内存 32GB 的机器上首次编译耗时不到 10 分钟。
不出意外的话,没有看到错误信息,那么恭喜你编译成功了。🎉 🎉 🎉
如果不幸出现了 Error,可以在编译命令后加上 V=s 重新编译,然后根据详细报错信息搜索解决方案或者让大模型分析。
刷写和测试
编译完成后,固件文件在 bin/targets/<target>/<subtarget>/ 目录下,例如我的 树莓派5 固件在 bin/targets/bcm27xx/bcm2712/ 目录下:

提示
ext4 和 squashfs 两种格式都可以刷写,ext4 格式可以直接读写分区,squashfs 格式体积更小。具体区别请自行 Google。
提示
factory 固件用于首次刷写,sysupgrade 固件用于升级(LuCI 系统-备份与升级)。
使用你喜欢的工具,比如 rufus 将固件刷写到 SD 卡中。
在板子上插入 USB 网卡,插入 SD 卡,接入电源,等待开机。分别尝试用网线将电脑连接到板载网口和 USB 网卡两个接口,其中有一个会默认配置为 LAN,可以通过 DHCP 获取一个 192.168.1.0/24 的地址:

访问 http://192.168.1.1,默认用户名为 root,密码为空,可以登录 OpenWrt 的 Web 界面 LuCI:


感谢看到这里,后续会出 OpenWrt 配置的文章。