需要的硬件和软件
硬件
- 一台有网线接口的电脑
- 内存2GB以上的树莓派4B+
- 8GB以上的小SD卡,可以插在树莓派上
- SD卡的读卡器
- 一根网线
- 显示器(非必须),Micro USB - HDMI线(非必须)
软件
- Balena Etcher,MacBook用户可以选择下载这个,也可以选择用命令行代替
- VM Virtual Box和Ubuntu虚拟机,非必须,用于编译OpenWrt固件,不过也可以选择下载别人编译好的固件。有一点需要注意,我第一次编译60GB就足够了,但是第二次希望编译一个固件库,想把所有功能全部选上,60GB不够,建议分配128GB储存
- SecureCRT或PuTTy,非必须,不知道大家用什么命令行终端,但是我MacBook和Windows都是用系统自带的命令行终端
获得镜像
官网下载
可以从OpenWrt的官网下载镜像
但我是比较能折腾的,我找到了这个仓库:Lean,readme有比较详细的编译步骤,于是决定自己尝试一下。可以先在本地编译一次熟悉一下编译的流程,然后再使用GitHub Actions编译。
本地编译
第一次编译
-
首先在Ubuntu上clone repo
https://github.com/coolsnowwolf/lede.git
-
安装依赖包
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 cmake cpio curl device-tree-compiler fastjar flex gawk gettext gcc-multilib g++-multilib \ git gperf haveged help2man intltool libc6-dev-i386 libelf-dev libfuse-dev libglib2.0-dev libgmp3-dev \ libltdl-dev libmpc-dev libmpfr-dev libncurses5-dev libncursesw5-dev libpython3-dev libreadline-dev \ libssl-dev libtool lrzsz mkisofs msmtp ninja-build p7zip p7zip-full patch pkgconf python3 \ python3-pyelftools python3-setuptools qemu-utils rsync scons squashfs-tools subversion swig texinfo \ uglifyjs upx-ucl unzip vim wget xmlto xxd zlib1g-dev
-
更新feed并选择配置
cd lede ./scripts/feeds update -a ./scripts/feeds install -a make menuconfig
-
输入这个命令后就开启了配置页面,我使用的是树莓派4B,下面是这些配置的具体说明,可以按需选择编译。
# 编译的目标系统 TargetSystem: - Broadcom BCM27xx Subtarget: - BCM2711 boards (64 bit) TargetProfile: - Raspberry Pi 4B/400/4CM (64bit) # 镜像参数 TargetImages: - tar.gz # 如果需要打包成docker镜像 - ext4 # ext4格式的固件可方便地调整分区大小 - squashfs # squashfs格式的固件可恢复出厂设置 - KernelPartitionSize: 64 # boot分区大小为64M - RootFilesystemPartitionSize: 2048 # 根目录分区空间,单位为M,改大一点就不需要后期扩容了 # 可选工具 BaseSystem: - block-mount # 在LuCI界面添加<挂载点>菜单 - blockd # 自动挂载设备 - wireless-tools # 无线扩展工具 Administration: - htop # betetr top # 文件系统 KernelModules: Filesystems: - kmod-fs-ext4 - kmod-fs-f2fs - kmod-fs-ntfs - kmod-fs-squashfs - kmod-fs-vfat - kmod-fuse # 网卡支持 NetworkDevices: - kmod-xxx # 有线网卡支持,跟以下几项可根据需求选择性添加 NetworkSupport: - kmod-wireguard WirelessDrivers: - kmod-rt2800-usb # 添加Ralink RT5370芯片的USB无线网卡驱动 USBSupport: - kmod-usb-net: - kmod-usb-net-asix # 添加支持亚信的有线网卡支持 - kmod-usb-net-asix-ax88179 # 添加USB3.0的有线网卡芯片AX88179的驱动 - kmod-usb-net-rtl8152 # 添加USB2/3的有线网卡RTL8152/3芯片支持 - kmod-usb-net-sr9700 # 添加USB2.0的有线网卡SR9700芯片支持 - kmod-usb-core # 启用USB支持 - kmod-usb-hid # USB键鼠支持 - kmod-usb-ohci # 添加OHCI支持,老USB才需要 - kmod-usb-storage # 启用USB存储 - kmod-usb-storage-extras - kmod-usb-uhci # 添加UHCI支持,老USB才需要 - kmod-usb2 # 开启USB2支持 - kmod-usb3 # 开启USB3支持 # LuCI设置 LuCI: Collections: - luci # 开启luci Modules: Translations: - Chinese(zh-cn) # 中文支持 Themes: - luci-theme-agron # 添加主题 # LuCI应用 Applications: - luci-app-adguardhome # 去广告 - luci-app-advanced-reoot - luci-app-alist # 文件共享,alist编译比较耗费时间,完全没必要编译进内核,可以当作软件下载 - luci-app-aria2 # 下载工具 - luci-app-cloudflared - luci-app-ddns - luci-app-diskman - luci-app-dockerman # Docker - luci-app-filebrowser # 文件管理 - luci-app-filetransfer - luci-app-firewall # 防火墙 - luci-app-frps - luci-app-frpc # 内网穿透 - luci-app-hd-idle # 硬盘休眠 - luci-app-lucky - luci-app-opkg # 软件包 - luci-app-openvpn - luci-app-openvpn-server - luci-app-passwall 翻墙 - luci-app-qos # 服务质量 - luci-app-samba # 网络共享 - luci-app-smartdns # 优化科学上网 - luci-app-upnp # UPnP服务 - luci-app-usb-printer - luci-app-wol # 网络唤醒 Protocols: - luci-protocol-wireguard # 网络工具 Network: DownloadManager: - ariang # Aria2管理页面 FileTransfer: - curl # 添加curl命令 - wget-ssl # 添加wget命令 IP Addresses and Names: - ddns-scripts-cloudflare # 用于ddns - drill # DDNS VPN: - wireguard-tools # 实用工具 Utilities: Compression: - bsdtar # tar打包工具 - gzip # GZ 压缩套件 Disc: - fdisk # 磁盘分区工具 - lsblk # 磁盘查看工具 Filesystem: - f2fs-tools - ntfs-3g # NTFS读写支持 - resize2fs # 分区大小调整 Terminal: - screen # 添加screen - losetup - pciutils # 添加lspci命令 - qrencode # wireguard qrcode - usbutils # 添加lsusb命令
-
配置完成后选择Save,会保存为一个
.config
文件。在最后一步安装之前还需要安装screen,用于创建持久会话,否则如果不小心关了ssh之前编译的就都没了(你猜我是怎么知道的)sudo apt install screen screen -S buildlede
-
最后执行命令用8个线程下载dl库,第一次编译用1个线程编译。在这里一开始我用的AWS的Ubuntu一直下不下来,没有办法换成了本地的Ubuntu虚拟机才下载编译成功
make download -j8 make V=s -j1
-
然后就是等待编译,编译完成后在
bin\targets
可以选择openwrt-bcm27xx-bcm2711-rpi-4-squashfs-factory.img.gz
这个版本进行烧录
单独编译
有时候用着用着发现我们需要安装一个插件,这种情况下我们可以单独编译一个插件
-
编辑
.config
文件make menuconfig
-
找到我们想单独编译的插件,比如
luci-app-diskman
,这是个管理路由器上的磁盘和分区的插件,第一次编译选择为[*]
,意思是作为一个内置模块编译,不可以卸载。这次的话我们可以选择为[M]
,意思是作为一个模块编译使用如下命令可以编译
make package/luci-app-diskman/compile V=s
-
xxxxxxxxxx route add 192.168.2.0 MASK 255.255.255.0 192.168.100.1 METRIC 1bash
-
打开openwrt,System → File Transfer选择文件上传,右下角安装就可以了
-
我安装完后OpenWrt没有立刻出现新安装的插件,过了一段时间才出现的
如果要单独编译内核模块,比如kmod-wireguard
,可以在kernel module中选中它为[M],然后运行
make package/kernel/linux/compile V=s
很快编译就完成了,编译出来的包在bin/packages/<target>/<package-repo>/kmod-wireguard_xxx.ipk
第二次编译
-
拉取最新feeds
sudo sh -c "apt update && apt upgrade -y" git pull ./scripts/feeds update -a && ./scripts/feeds install -a
-
清除旧的编译产物(可选)
make clean # 源码有大规模更新或者内核更新后执行,以保证编译质量 # 此操作会删除 /bin 和 /build_dir 目录中的文件 make dirclean # 如果要更换架构,例如要从 x86_64 换到 MediaTek Ralink MIPS 建议执行以下命令深度清理 # 此操作会删除 /bin 和 /build_dir 目录的中的文件(make clean),以及 /staging_dir、/toolchain、/tmp 和 /logs 中的文件
-
编译
make defconfig make download -j8 find dl -size -1024c -exec ls -l {} \; make -j$(nproc) || make -j1 || make -j1 V=s
GitHub Actions编译
熟悉了本地编译的流程之后就推荐使用GitHub Actions进行编译了,这样可以把脏活累活全部交给云,本来想自己写Workflow的yaml
,但是找到了这个仓库,决定还是不重复造轮子了哈哈哈。
注意如果希望自动将Artifact发布到Release的话,需要赋予PAT权限,在Settings → Developer Settings → Personal access tokens → Tokens (classic) → 你的Token,勾选workflow
和write:packages
烧录
直接烧录的image我们选择
openwrt-bcm27xx-bcm2711-rpi-4-squashfs-factory.img.gz
Windows
可以使用Balena Etcher或者其他的disk imager软件将image烧录到SD卡中,非常简单,按顺序一步一步来即可
MacOS
MacOS也可以使用Balena Etcher将镜像导入到SD卡中,但是我不喜欢下乱七八糟的软件,干脆直接使用命令行了
-
找到SD卡的磁盘编号,这里我的SD卡磁盘为
/dev/disk4
diskutil list /dev/disk4 (external, physical): #: TYPE NAME SIZE IDENTIFIER 0: FDisk_partition_scheme *7.9 GB disk4 1: Windows_FAT_32 BOOT 67.1 MB disk4s1 2: Linux 109.1 MB disk4s2 (free space) 7.7 GB -
由于我这里以前装过一个不带GUI版本的OpenWrt,SD卡多了几个分区,这次打算重新装一个带着GUI的
-
首先恢复分区,这个命令同时把SD卡进行格式化
diskutil eraseDisk FAT32 SDCARD MBRFormat /dev/disk4
恢复分区之后
diskutil list /dev/disk4 (external, physical): #: TYPE NAME SIZE IDENTIFIER 0: FDisk_partition_scheme *7.9 GB disk4 1: DOS_FAT_32 SDCARD 7.9 GB disk4s1
-
输入以下命令卸载(但不移除) SD 卡,否则会显示busy
diskutil unmountDisk /dev/disk4
-
解压下载的image
gunzip ./openwrt-bcm27xx-bcm2711-rpi-4-squashfs-factory.img.gz
-
使用
dd
写入解压后的.img
文件,注意这一步千万不要抄错了磁盘编号,否则伤害不可逆,dd
是个很强的命令sudo dd if=/Users/xxx/Desktop/openwrt-bcm27xx-bcm2711-rpi-4-squashfs-factory.img of=/dev/disk4 bs=1M status=progress
如果不报错一般就是成功了
-
最后将SD卡从电脑拔出,插到树莓派上,启动树莓派,这时使用网线将树莓派的以太网接口和电脑的以太网接口相连。由于OpenWrt 默认将树莓派的
eth0
接口桥接到br-lan
并使用 IP 地址192.168.1.1
,我们要配置一下电脑端的Ethernet接口是否也在192.168.1.x
的子网,x可以选2 - 255的随便一个数当树莓派就跟电脑在相同子网后,在浏览器中输入
192.168.1.1
,就能登录到OpenWrt的GUI(LuCI)了,默认用户名和密码是root
和password
-
大功告成了
使用Docker容器
详见:将OpenWrt制作为Docker镜像 | Kunyang’s Blog
连接路由器
-
我家主路由器使用的子网为
192.168.2.x
,需要将树莓派改为这个子网下(当然如果主路由器子网为192.168.1.x
的话就不用多折腾这一步了)。我们先禁用桥接模式和修改IP地址vi /etc/config/network
修改文件为
config interface 'lan' option device 'eth0' option proto 'static' option ipaddr '192.168.2.66' option netmask '255.255.255.0' option gateway '192.168.2.1' option dns '192.168.2.1'
-
禁用DHCP,防止跟主路由器的DHCP冲突
vi /etc/config/dhcp
config dhcp 'lan' option interface 'lan' option ignore '1'
-
检查防火墙配置
vi /etc/config/firewall
config zone option name 'lan' list network 'lan' option input 'ACCEPT' option output 'ACCEPT' option forward 'ACCEPT'
-
应用设置
/etc/init.d/network restart
-
这时由于我们电脑还在
192.168.1.x
子网,但是树莓派已经到了192.168.2.x
子网了,所以连接必定是断开的,我们再把电脑端的Ethernet端口改回192.168.2.x
子网,就又能重新访问了 -
将树莓派与电脑断开连接,插到路由器的LAN口上,应该能正常访问网络,而且电脑也能访问树莓派了
设置旁路由
以上步骤只是将树莓派作为一个用网设备加入了家庭的局域网,我们的终端设备还是沿着主路由这条线进行通信,要想作为旁路由还需要进一步设置
-
其实很简单,我们只要将Wifi的网关从路由器之前DHCP自动分配的地址改为旁路由树莓派即可,假设我的主路由器IP地址为
192.168.2.1
,我的电脑IP地址为192.168.2.54
,我的树莓派的IP地址为192.168.2.66
,我需要这么修改: -
MacBook也一样
-
同样的iPhone也可以设置,这里我就不放图了
-
因为怕炸网我暂时先使用这种非侵入式的设置,它只影响把网关设置为软路由的终端,这样一旦网坏了只影响部分设备,或者我修改一下网关修改到主路由器的IP地址就可以了
详见:软路由做旁路由三步搞定!openwrt软路由 R2S R4S openwrt软路由上网设置
安装插件
卸载插件
- 可以在System → Software → Installed中卸载插件
- 注意直接编译进内核固件的插件无法卸载
安装插件
直接安装
国外源Arm
src/gz openwrt_core https://downloads.openwrt.org/releases/23.05.0/targets/bcm27xx/bcm2711/packages
src/gz openwrt_base https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a72/base
src/gz openwrt_luci https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a72/luci
src/gz openwrt_packages https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a72/packages
src/gz openwrt_routing https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a72/routing
src/gz openwrt_telephony https://downloads.openwrt.org/releases/23.05.0/packages/aarch64_cortex-a72/telephony
国外源x86
src/gz openwrt_core https://downloads.openwrt.org/releases/23.05.0/targets/x86/64/packages
src/gz openwrt_base https://downloads.openwrt.org/releases/23.05.0/packages/x86_64/base
src/gz openwrt_luci https://downloads.openwrt.org/releases/23.05.0/packages/x86_64/luci
src/gz openwrt_packages https://downloads.openwrt.org/releases/23.05.0/packages/x86_64/packages
src/gz openwrt_routing https://downloads.openwrt.org/releases/23.05.0/packages/x86_64/routing
src/gz openwrt_telephony https://downloads.openwrt.org/releases/23.05.0/packages/x86_64/telephony
国内源 Arm
src/gz openwrt_core https://mirrors.tencent.com/lede/snapshots/targets/bcm27xx/bcm2711/packages
src/gz openwrt_base https://mirrors.tencent.com/lede/snapshots/packages/aarch64_cortex-a72/base
src/gz openwrt_luci https://mirrors.tencent.com/lede/releases/18.06.9/packages/aarch64_cortex-a72/luci
src/gz openwrt_packages https://mirrors.tencent.com/lede/snapshots/packages/aarch64_cortex-a72/packages
src/gz openwrt_routing https://mirrors.tencent.com/lede/snapshots/packages/aarch64_cortex-a72/routing
src/gz openwrt_telephony https://mirrors.tencent.com/lede/snapshots/packages/aarch64_cortex-a72/telephony
国内源x86
src/gz openwrt_core https://mirrors.tencent.com/lede/releases/24.10.0-rc1/targets/x86/64/packages
src/gz openwrt_base https://mirrors.tencent.com/lede/releases/24.10.0-rc1/packages/x86_64/base
src/gz openwrt_helloworld https://mirrors.tencent.com/lede/releases/24.10.0-rc1/packages/x86_64/helloworld
src/gz openwrt_luci https://mirrors.tencent.com/lede/releases/24.10.0-rc1/packages/x86_64/luci
src/gz openwrt_packages https://mirrors.tencent.com/lede/releases/24.10.0-rc1/packages/x86_64/packages
src/gz openwrt_routing https://mirrors.tencent.com/lede/releases/24.10.0-rc1/packages/x86_64/routing
src/gz openwrt_telephony https://mirrors.tencent.com/lede/releases/24.10.0-rc1/packages/x86_64/telephony
自己编译
-
首先需要在Ubuntu上编译插件
make menuconfig
在LuCI → Applications可以把固件全选上,毕竟我们是做个固件库,之后有啥需求就装啥。选择时应该模块化,按空格让前面括号里出现一个M。保存后回到命令行开始编译
make -j1 V=s
-
编译完成后在
bin\packages
中就能找到我们编译的全部插件了,而且都为.ipk
格式
常见使用场景
去广告
- 所需插件(具体配置路径见这里)
- luci-app-adguardhome
- 配置参考:【韩风Talk】Openwrt插件对广告说不,怎么做?两款热门插件随你用!_哔哩哔哩_bilibili
外网访问我的Windows台式机
Wireguard
- Wireguard因为比OpenVPN轻量化速度更快,因此目前是我的首选
- 所需插件(具体配置路径见这里)
- kmod-wireguard
- luci-proto-wireguard
- wireguard-tools
- luci-app-wireguard(可以不选,而且在我的menuconfig没找到)
- 配置参考:OpenWrt配置Wireguard | Kunyang’s Blog
ZeroTire
-
所需插件
- luci-app-zerotire
-
配置参考:【韩风Talk】Openwrt的Zerotier插件玩法,异地组网不求人,大虚拟局域网走起!_哔哩哔哩_bilibili
OpenVPN
- 所需插件
- luci-app-openvpn
- luci-app-openvpn-server
- luci-i18n-openvpn-server-zh-cn
- luci-i18n-openvpn-zh-cn
- open-vpn-easy-rsa
- openvpn-openssl
文件管理
- 文件管理器
- luci-app-filebrowser
- luci-app-filetransfer
- luci-app-samba
- 配置参考:【韩风Talk】Openwrt文件管理的玩法合集,这期顺便解决中文乱码问题!_哔哩哔哩_bilibili
- 云盘管理器(目前把这两个迁移到了Debian上)
- luci-app-alist
- luci-app-cloudflared
- 配置参考:配置AList | Kunyang’s Blog