Self-compiled OpenWrt on Raspberry Pi 4B

Self-compiled OpenWrt on Raspberry Pi 4B

Falling_Sakura

基础概念

  • 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):无线接入点,只负责发送无线信号。

整体网络流程

image.png

具体原理我也不太懂,我只能简单说下这个过程。

首先是校园网的网线接口(一端连接至运营商提供的光猫),连接至树莓派的 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
2
3
4
5
6
sudo apt install -y ack antlr3 aria2 asciidoc autoconf automake autopoint binutils bison build-essential \
bzip2 ccache cmake cpio curl device-tree-compiler fastjar flex gawk gettext gcc-multilib g++-multilib \
git gperf haveged help2man intltool libc6-dev-i386 libelf-dev libglib2.0-dev libgmp3-dev libltdl-dev \
libmpc-dev libmpfr-dev libncurses5-dev libncursesw5-dev libreadline-dev libssl-dev libtool lrzsz \
mkisofs msmtp nano ninja-build p7zip p7zip-full patch pkgconf python3 python3-pip libpython3-dev qemu-utils \
rsync scons squashfs-tools subversion swig texinfo uglifyjs upx-ucl unzip vim wget xmlto xxd zlib1g-dev

如果安装速度慢,请自行更换镜像源或配置代理。

2. 拉取 OpenWrt

1
2
git clone https://github.com/openwrt/openwrt.git
cd openwrt

切换到最新版本的分支:

1
2
git branch -a # 查看所有可选分支
git checkout openwrt-24.10 # 我当时的最新版是 24.10

安装并更新 Feeds 源:

1
2
3
./scripts/feeds clean
./scripts/feeds update -a
./scripts/feeds install -a

3. 安装插件

1
2
3
4
5
git clone https://github.com/Zxilly/UA2F.git package/UA2F # UA2F
git clone https://github.com/CHN-beta/rkp-ipid.git package/rkp-ipid # rkp-ipid
git clone https://github.com/jerrykuku/luci-theme-argon.git package/luci-theme-argon # luci theme
git clone https://github.com/jerrykuku/luci-app-argon-config.git package/luci-app-argon-config
git clone https://github.com/lucikap/luci-app-ua2f.git package/luci-app-ua2f

再次更新 Feeds 源:

1
2
./scripts/feeds update -a
./scripts/feeds install -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
2
# grep '=[ym]' $(LINUX_DIR)/.config.set | LC_ALL=C sort | $(MKHASH) md5 > $(LINUX_DIR)/.vermagic
cp $(TOPDIR)/vermagic $(Linux_DIR)/.vermagic

然后编辑 openwrt/package/kernel/linux/Makefile

将 29 行修改为:

1
2
#STAMP_BUILT:=$(STAMP_BUILT)_$(shell $(SCRIPT_DIR)/kconfig.pl $(LINUX_DIR)/.config | $(MKHASH) md5)
STAMP_BUILT:=$(STAMP_BUILT)_$(shell cat $(LINUX_DIR/.vermagic))

5. 配置固件各模块

此段建议查阅参考视频。

1
make menuconfig

修改 Target 为自己的架构

需要添加的模块:

  • Kernel modules
    • Other modules
      • [x] kmod-rkp-ipid
  • Network
    • Routing and Redirection
      • [x] ua2f
    • Firewall
      • [x] iptables-mod-conntrack-extra
      • [x] iptables-mod-filter
      • [x] iptables-mod-ipopt
      • [x] iptables-nft
      • [x] iptables-mod-u32
    • [x] ipset
  • LuCI
    • Collections
      • [x] luci
    • Modules
      • [x] luci-compat
      • Translations
        • [x] Chinese Simplified (zh_Hans)
    • Applications
      • [x] luci-app-argon-config
      • [x] luci-app-store
      • [x] luci-app-ttyd
      • [x] luci-app-ua2f

保存并离开。

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

保存并离开。

7. 开始编译

预下载:

1
make download -j$(nproc) V=cs

编译:

1
2
3
make -j$(nproc) V=cs
# 如果不行可以尝试单核编译
# make -j1 V=s

编译时间取决于电脑性能,耗时有点长。

8. 刷入系统

此处不多啰嗦,自行搜索,编译好的包在 openwrt/target 目录下。

Windows 下刷入:

先使用 SD Card Formatter 将 TF 卡格式化,然后使用 balenaEtcher 进行固件刷入

OpenWrt 配置

1. 访问后台

将树莓派通过网线连接电脑,并手动修改电脑 ip 为:192.168.1.xx 为任意不超过 255 的数字。

然后在浏览器中访问 192.168.1.1,用户名为 root,密码为 password,如果与其它运营商管理后台冲突,建议断开其它网络连接。

2. 配置启动项

  • 系统
    • 启动项
      • 本地启动脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# Put your custom commands here that should be executed once
# the system init finished. By default this file does nothing.

# 启用 UA2F
uci set ua2f.enabled.enabled=1

# 是否处理内网流量,如果你的路由器是在内网中,且你想要处理内网中的流量,那么请启用这一选项
uci set ua2f.firewall.handle_intranet=1

# 应用配置
uci commit ua2f

# 开机自启
service ua2f enable

# 启动 UA2F
service ua2f start

# rkp-ipid
iptables -t mangle -N IPID_MOD
iptables -t mangle -A FORWARD -j IPID_MOD
iptables -t mangle -A OUTPUT -j IPID_MOD
iptables -t mangle -A IPID_MOD -d 0.0.0.0/8 -j RETURN
iptables -t mangle -A IPID_MOD -d 127.0.0.0/8 -j RETURN
# iptables -t mangle -A IPID_MOD -d 10.0.0.0/8 -j RETURN
# 这里参考自己的树莓派的 IP 地址处在哪个内网网段中,比如我的处在这个网段九就要把这个注释掉,否则流量发不出去
iptables -t mangle -A IPID_MOD -d 172.16.0.0/12 -j RETURN
iptables -t mangle -A IPID_MOD -d 192.168.0.0/16 -j RETURN
iptables -t mangle -A IPID_MOD -d 255.0.0.0/8 -j RETURN
iptables -t mangle -A IPID_MOD -j MARK --set-xmark 0x10/0x10

# 防时间戳检测
iptables -t nat -N ntp_force_local
iptables -t nat -I PREROUTING -p udp --dport 123 -j ntp_force_local
iptables -t nat -A ntp_force_local -d 0.0.0.0/8 -j RETURN
iptables -t nat -A ntp_force_local -d 127.0.0.0/8 -j RETURN
iptables -t nat -A ntp_force_local -d 192.168.0.0/16 -j RETURN
iptables -t nat -A ntp_force_local -s 192.168.0.0/16 -j DNAT --to-destination 192.168.1.1

# TTL
iptables -t mangle -A POSTROUTING -j TTL --ttl-set 64

# 拒绝 AC 进行 Flash 检测
iptables -I FORWARD -p tcp --sport 80 --tcp-flags ACK ACK -m string --algobm --string " src=\"http://1.1.1." -j DROP

exit 0

然后保存。

3. 系统时间同步

  • 系统
    • 系统

常规设置:时区 Asia/Shanghai

时间同步:

4. UA2F

  • 服务
    • 防检测
      • [x] 启用/开机自启
      • [x] 自动配置防火墙
      • [x] 处理内网流量

5. 网络

提供我的接口配置,可参考上文 [[#整体网络流程]]

image.png

这里我的 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) 进行测速,贴一张我跑满校园网的截图:

image.png

树莓派:

1
2
3
wget https://install.speedtest.net/app/cli/ookla-speedtest-1.2.0-linux-aarch64.tgz
tar -zxf ookla-speedtest-1.2.0-linux-aarch64.tgz
./speedtest

WSL:

1
2
3
wget https://install.speedtest.net/app/cli/ookla-speedtest-1.2.0-linux-x86_64.tgz
tar -zxf ookla-speedtest-1.2.0-linux-x86_64.tgz
./speedtest

完结撒花🎉

  • 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.
Comments