Skip to content

如何为开发板编译 OpenWrt

约 2241 字大约 7 分钟

网络OpenWrthow-to

2025-09-23

目标

树莓派5 编译 ImmortalWrt 固件,支持以下功能:

  • USB 转千兆网卡,和板载网口分别作为 WAN 和 LAN 接口
  • Mihomo 局域网透明代理
  • Tailscale 子网路由实现远程访问内网资源

本文理论上适用于所有已被官方支持的硬件。

重要

操作前先读完全文。

为什么需要 OpenWrt?

1. 网速

校园网有线网带宽是上下对等 1000M,而无线网实测(非高峰期)不到 200M。

Wire SpeedWiFi Speed

希望搭建一个内网让更多设备使用高带宽低延迟的网络。

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”,然后在网上搜索即可。

RTL8153

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

3. 获取源码

-b 参数指定分支,我编译的是 OpenWrt 24.10 版本。

git clone -b openwrt-24.10 --single-branch --filter=blob:none https://github.com/immortalwrt/immortalwrt
cd immortalwrt

4. 获取 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

可以看到这样的界面:

Menu config

上方有操作指南。

Target System 选项中选择你的开发板对应的架构,例如树莓派是 BCM2712:

Select target system

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

Select subtarget

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

Select target profile

回到主菜单,Target Images 保持默认的 ext4 squashfs 两种格式。

进入 Kernel modules,选择 USB Support,勾选对应的 USB 网卡驱动:

USB driver

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

Tailscale

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

Nikki

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

Argon Theme

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

Save 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/ 目录下:

Firmware

提示

ext4squashfs 两种格式都可以刷写,ext4 格式可以直接读写分区,squashfs 格式体积更小。具体区别请自行 Google。

提示

factory 固件用于首次刷写,sysupgrade 固件用于升级(LuCI 系统-备份与升级)。

使用你喜欢的工具,比如 rufus 将固件刷写到 SD 卡中。

在板子上插入 USB 网卡,插入 SD 卡,接入电源,等待开机。分别尝试用网线将电脑连接到板载网口和 USB 网卡两个接口,其中有一个会默认配置为 LAN,可以通过 DHCP 获取一个 192.168.1.0/24 的地址:

LAN

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

LuCI 1LuCI 2

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