
Self-compiled OpenWrt on Raspberry Pi 4B

基础概念
- WAN: Wide Area Network
- LAN: Local Area Network
- WLAN: Wireless Local Area Network
- 网关: 在网络中,网关是一个网络设备(通常就是你的路由器),它负责将你的局域网(LAN)中的数据包转发到外部网络(WAN),反之亦然。没有网关,你家里的设备就无法访问互联网。
- DHCP (Dynamic Host Configuration Protocol): DHCP 是一种网络协议,它的主要作用是自动为连接到网络的设备(比如你的手机、电脑)分配 IP 地址、子网掩码、默认网关(也就是路由器的地址)以及 DNS 服务器地址等网络配置信息。这样你就无需手动去设置这些复杂的参数了。
- IPV4: IPv4 是一种用于在互联网上识别设备和路由数据包的地址系统。每个连接到互联网的设备(电脑、手机、服务器等)都会被分配一个独一无二的 IPv4 地址,就像你家有一个独一无二的门牌号一样。这个地址通常由四组数字组成,每组数字在 0 到 255 之间,用点分隔,例如
192.168.1.1
或203.0.113.45
,它是一个 32 位的二进制数。 - 子网掩码: 也是一个 32 位的二进制数,它的作用是告诉你,一个 IP 地址中,哪些部分是网络号,哪些部分是主机号,比如如果是
255.255.255.0
,那么前 24 位都是 1,那么前 24 位是网络号,后八位是主机号。 - CIDR (Classless Inter-Domain Routing): 无类别域间路由 表示法,它是一种更简洁、更灵活的 IP 地址和子网掩码的表示方法。例如
192.168.1.10/16
代表子网掩码是前 16 位都是 1,即255.255.0.0
。 - 同一网段:如果两个设备经过子网掩码的计算,网络号相同,那么两个设备就是处在同一网段,只有处在同一网段的两个设备才能互相访问。
Openwrt 是什么?
OpenWrt 是一个开源的、高度模块化、高度可定制的嵌入式 Linux 操作系统,主要用于取代路由器等嵌入式设备的原厂固件。它把一台普通的路由器变成了一个功能强大的、可自由定制的网络平台。
eth0
,eth1
等代表以太网接口,是物理层面上的接口的代号。WAN
:广域网接口,负责连接外部互联网。LAN
:局域网接口,负责连接内部网络设备。AP(Access Point)
:无线接入点,只负责发送无线信号。
整体网络流程
具体原理我也不太懂,我只能简单说下这个过程。
首先是校园网的网线接口(一端连接至运营商提供的光猫),连接至树莓派的 WAN
接口,这里如果树莓派是一个正常的电脑,那么登录验证之后它就已经可以正常上网了。
树莓派刷入了 OpenWrt 系统,安装了若干插件和配置,使其拥有修改数据包的能力,这时将其 Lan
接口连接到任意一台电脑上,便可以进行有线的网络共享,此时的终端流量会首先经过树莓派处理,再统一发送给外网。
这时,如果连接的这台电脑开启无线热点,所有的无线设备便都可以连接,并且所有的流量统一经过树莓派来处理。
但是受限于电脑发送无线信号的能力,此时的网速并不会跑满校园网的 500Mbps,所以只需要把电脑换成路由器就好啦。路由器有两个功能,一个是提供无线接入点(发送无线信号),另一个是分发流量,而分发流量的工作此时已经完全交给了树莓派(作主路由器),所以我们登录路由器的后台,将其工作模式修改为有线中继模式(作 AP),此时它便只提供发送无线信号的作用,不处理任何流量。
树莓派作为 DCHP 服务端,它的 LAN 口静态地址为 192.168.1.1
,即系统管理面板默认地址,子网掩码为 255.255.255.0
,那么它将为所有连接的设备分配一个同一网段的 ipv4
地址,比如路由器就被分配到了 192.168.1.136
,其它设备的是 192.168.1.x
反防代理检测
参考视频:【正片】面对校园网的多设备检测,「我」的解决方案是——_哔哩哔哩_bilibili
参考文章:自编译Openwrt固件实现绕过校园网多设备检测 - KINDYEAR Blog
突破思路
- 修改UA:UA2F/UA to 3F(编译时嵌入)
- IPid:第三方插件rkp-IPid(编译时嵌入)
- TTL:Kmod-iptables-ipot
- 防火墙组件拒绝 flash 检测
- 反时间戳:使用内置的 NTP 服务器给下游设备授时
编译并刷入固件
编译环境:WSL Ubuntu24.04
目标设备:树莓派4B
1. 安装必要的依赖包
1 | sudo apt update && sudo apt upgrade |
1 | sudo apt install -y ack antlr3 aria2 asciidoc autoconf automake autopoint binutils bison build-essential \ |
如果安装速度慢,请自行更换镜像源或配置代理。
2. 拉取 OpenWrt
1 | git clone https://github.com/openwrt/openwrt.git |
切换到最新版本的分支:
1 | git branch -a # 查看所有可选分支 |
安装并更新 Feeds 源:
1 | ./scripts/feeds clean |
3. 安装插件
1 | git clone https://github.com/Zxilly/UA2F.git package/UA2F # UA2F |
再次更新 Feeds 源:
1 | ./scripts/feeds update -a |
4. 修改 MD5 标识
解决后续更新软件包而内核版本不符的问题
在 openwrt 根目录创建 vermagic
文件:
1 | vi vermagic |
在 Index of /releases/ 选择当前版本的一个小版本,如我选择 24.10.3
然后进入 targets/bcm27xx/bcm2711/packages
其中 bcm27xx/bcm2711
是处理器 SOC 的架构,我的树莓派 4B 是这个,其它自行查阅。
然后找到 kernel_6.6.104~5642ee3ae5a6da3ce336f51cf968083c-r1_aarch64_cortex-a72.ipk
在 vermagic
中写入 5642ee3ae5a6da3ce336f51cf968083c-r1
(根据自己的型号调整)
然后编辑 openwrt/include/kernel-defaults.mk
将 130 行修改为:
1 | # grep '=[ym]' $(LINUX_DIR)/.config.set | LC_ALL=C sort | $(MKHASH) md5 > $(LINUX_DIR)/.vermagic |
然后编辑 openwrt/package/kernel/linux/Makefile
将 29 行修改为:
1 | #STAMP_BUILT:=$(STAMP_BUILT)_$(shell $(SCRIPT_DIR)/kconfig.pl $(LINUX_DIR)/.config | $(MKHASH) md5) |
5. 配置固件各模块
此段建议查阅参考视频。
1 | make menuconfig |
修改 Target 为自己的架构
需要添加的模块:
Kernel modules
Other modules
- [x]
kmod-rkp-ipid
- [x]
Network
Routing and Redirection
- [x]
ua2f
- [x]
Firewall
- [x]
iptables-mod-conntrack-extra
- [x]
iptables-mod-filter
- [x]
iptables-mod-ipopt
- [x]
iptables-nft
- [x]
iptables-mod-u32
- [x]
- [x]
ipset
LuCI
Collections
- [x]
luci
- [x]
Modules
- [x]
luci-compat
Translations
- [x]
Chinese Simplified (zh_Hans)
- [x]
- [x]
Applications
- [x]
luci-app-argon-config
- [x]
luci-app-store
- [x]
luci-app-ttyd
- [x]
luci-app-ua2f
- [x]
保存并离开。
6. 内核编译编译
1 | make kernel_menuconfig -j$(nproc) V=cs |
Networking support
Networking options
- [x]
Network packet filtering framework (Netfilter)
Core Netfilter Configuration
- [x]
Netfilter NFNETLINK interface
- [x]
Netfiler LOG over NFNETLINK interface
- [x]
Netfilter connection tracking support
- [x]
Connection tracking netlink interface
- [x]
NFQUEUE and NFLOG integration with Connection Tracking
- [x]
- [x]
保存并离开。
7. 开始编译
预下载:
1 | make download -j$(nproc) V=cs |
编译:
1 | make -j$(nproc) V=cs |
编译时间取决于电脑性能,耗时有点长。
8. 刷入系统
此处不多啰嗦,自行搜索,编译好的包在 openwrt/target
目录下。
Windows 下刷入:
先使用 SD Card Formatter
将 TF 卡格式化,然后使用 balenaEtcher
进行固件刷入
OpenWrt 配置
1. 访问后台
将树莓派通过网线连接电脑,并手动修改电脑 ip
为:192.168.1.x
,x
为任意不超过 255 的数字。
然后在浏览器中访问 192.168.1.1
,用户名为 root
,密码为 password
,如果与其它运营商管理后台冲突,建议断开其它网络连接。
2. 配置启动项
- 系统
- 启动项
- 本地启动脚本
- 启动项
1 | # Put your custom commands here that should be executed once |
然后保存。
3. 系统时间同步
- 系统
- 系统
常规设置:时区 Asia/Shanghai
时间同步:
- [x] 启用 NTP 客户端
- [x] 作为 NTP 服务器提供服务
- 绑定 NTP 服务器,接口绑定为连接终端设备/AP 路由器的那个接口(LAN 口)
- [x] 使用 DHCP 通告的服务器
- 候选 NTP 服务器
4. UA2F
- 服务
- 防检测
- [x] 启用/开机自启
- [x] 自动配置防火墙
- [x] 处理内网流量
- 防检测
5. 网络
提供我的接口配置,可参考上文 [[#整体网络流程]]
这里我的 eth1
是外接的 USB 无线网卡,连接的是 AP 模式的路由器,eth0
是板载千兆网卡,连接的是学校自带的网口。
配置好防火墙区域,并开启 LAN 口的 DHCP 服务。
6. 网络测试
这时你就可以用网线连接 LAN 口以及自己电脑的网线接口,看看是否可以正常上网了(需要认证一遍校园网登录),如果可以的话,把电脑 IP 改为自动,看看是否还能正常上网(如果不可以,说明 DHCP 服务配置有误,分配到了错误的网段)
如果此时并没有路由器,可以在开启无线功能,模式为接入点 AP,网络接口为 LAN 口,此时可以正常连接上网。经测试,树莓派 4B 的无线速率在百兆左右。
测速
如果你来到了这一步,恭喜你,可以开始最后轻松加愉快的测速环节了。
内网测速
使用工具 iperf3
,在路由器上安装后开启服务端
1 | iperf3 -s |
在终端设备中安装后开启客户端:
1 | iperf3 -c [服务端IP] |
外网测速
使用 [speedtest CLI
](Speedtest CLI: Internet speed test for the command line) 进行测速,贴一张我跑满校园网的截图:
树莓派:
1 | wget https://install.speedtest.net/app/cli/ookla-speedtest-1.2.0-linux-aarch64.tgz |
WSL:
1 | wget https://install.speedtest.net/app/cli/ookla-speedtest-1.2.0-linux-x86_64.tgz |
完结撒花🎉
- Title: Self-compiled OpenWrt on Raspberry Pi 4B
- Author: Falling_Sakura
- Created at : 2025-09-25 21:08:00
- Updated at : 2025-10-12 20:07:13
- Link: https://vercel.fallingsakura.top/be6ff393.html
- License: This work is licensed under CC BY-NC-SA 4.0.