需要的硬件和软件
硬件
- 一台有网线接口的电脑
- 内存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: - squashfs - KernelPartitionSize: 64 - RootFilesystemPartitionSize: 2048 # 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 # 可选工具 BaseSystem: - block-mount # 在LuCI界面添加<挂载点>菜单 - blockd # 自动挂载设备 - wireless-tools # 无线扩展工具 Administration: - htop # better 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支持 # 网络工具 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命令
-
目前我使用的配置
TargetSystem: - Broadcom BCM27xx Subtarget: - BCM2711 boards (64 bit) TargetProfile: - Raspberry Pi 4B/400/4CM (64bit) TargetImages: - squashfs - KernelPartitionSize: 64 - RootFilesystemPartitionSize: 6144 LuCI: Themes: - luci-theme-agron Applications: - luci-app-accesscontrol - luci-app-adguardhome - luci-app-advanced-reoot - luci-app-arpbind - luci-app-ddns - luci-app-diskman - luci-app-filetransfer - luci-app-firewall - luci-app-frpc - luci-app-nlbwmon - luci-app-opkg - luci-app-samba - luci-app-sqm - luci-app-statistics - luci-app-upnp Protocols: - luci-protocol-wireguard Network: IP Addresses and Names: - ddns-scripts-cloudflare - drill - tcpdump Utilities: - qrencode
-
关于Target Images,这里总结一下:
- 如果你希望直接运行在物理主机,比如树莓派直接在SD卡刷固件,使用
squashfs
- 如果你想把OpenWrt打包成Docker镜像,选择
tar.gz
- 如果你想把主系统设置为PVE虚拟机,OpenWrt作为虚拟机的一个系统运行在MiniPC上,详见:x86 Mini PC安装PVE | Kunyang’s Blog
- 如果你暂时还没决定将来要怎么部署,可以先都选了
- 不同的架构的可选项是不一样的
RootFilesystemPartitionSize
是安装之后的系统大小,我树莓派的SD卡为8G因此选择了6144M,如果你想使用PVE的话这里就不需要纠结了,可以在PVE上分配硬盘的大小
- 如果你希望直接运行在物理主机,比如树莓派直接在SD卡刷固件,使用
-
配置完成后选择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地址就可以了
教程详见:
安装插件
卸载插件
- 可以在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
格式
常见使用场景
DDNS
去广告
- 所需插件(具体配置路径见这里)
- luci-app-adguardhome
配置参考:
外网访问我的Windows台式机
Wireguard
- Wireguard因为比OpenVPN轻量化速度更快,因此目前是我的首选
- 配置参考:OpenWrt配置Wireguard | Kunyang’s Blog
ZeroTire
- 所需插件
- luci-app-zerotire
配置参考:
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
配置参考:
- 云盘管理器,注意alist强烈不建议选上编译,会导致编译产物特别大
- luci-app-alist
- luci-app-cloudflared
- 配置参考:配置AList | Kunyang’s Blog