需要的硬件和软件

硬件

  • 一台有网线接口的电脑
  • 内存2GB以上的树莓派4B+
  • 8GB以上的小SD卡,可以插在树莓派上
  • SD卡的读卡器
  • 一根网线
  • 显示器(非必须),Micro USB - HDMI线(非必须)

软件

  • Balena Etcher,MacBook用户可以选择下载这个,也可以选择用命令行代替
  • VM Virtual Box和Ubuntu虚拟机,非必须,用于编译OpenWrt固件,不过也可以选择下载别人编译好的固件。有一点需要注意,我第一次编译60GB就足够了,但是第二次希望编译一个固件库,想把所有功能全部选上,60GB不够,建议分配128GB储存
  • SecureCRT或PuTTy,非必须,不知道大家用什么命令行终端,但是我MacBook和Windows都是用系统自带的命令行终端

获得镜像

下载镜像

可以从OpenWrt的官网下载镜像

OpenWrt Images

但我是比较能折腾的,我找到了这个仓库: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:
      - ext4 # ext4格式的固件可方便地调整分区大小
      - squashfs # squashfs格式的固件可恢复出厂设置
      - KernelPartitionSize: 64 # boot分区大小为64M
      - RootFilesystemPartitionSize: 2048 # root分区大小为2048M
    
    # 可选工具
    BaseSystem:
      - block-mount # 在LuCI界面添加<挂载点>菜单
      - blockd # 自动挂载设备
      - wireless-tools # 无线扩展工具
    Administration:
      - htop # 添加htop命令
    
    # 文件系统
    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 # 文件共享
        - luci-app-aria2 # 下载工具
        - luci-app-cloudflared
        - luci-app-ddns
        - luci-app-diskman
        - luci-app-dockerman
        - 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
      	- drill
      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
      - 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],意思是作为一个模块编译

    Compile Module

    使用如下命令可以编译

    make package/luci-app-diskman/compile V=s
    
  • 编译完成后在/bin/packages/aarch64_cortex-a72/luci文件夹下能找到luci-app-diskman_v0.2.11_all.ipk

  • 打开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,勾选workflowwrite:packages

GitHub PAT Permissions

尝试了一下如果只选择必要的插件,是可以编译成功的,但是如果选择的插件多了Runner分配的14GB储存是不够的,需要拆分工作流。

制作Docker镜像

如果希望将OpenWrt系统制作为Docker镜像

  • 首先解压镜像文件,这里我们选择openwrt-bcm27xx-bcm2711-rpi-4-ext4-factory.img.gz

    gzip -d openwrt-bcm27xx-bcm2711-rpi-4-ext4-factory.img.gz
    
  • 挂载镜像文件

    sudo losetup -fP openwrt-bcm27xx-bcm2711-rpi-4-ext4-factory.img
    sudo mount /dev/loop0p2 /mnt
    
  • 制作rootfs.tar

    sudo tar -C /mnt -czf rootfs.tar .
    sudo umount /mnt
    sudo losetup -d /dev/loop0
    
  • 创建Dockerfile

    FROM arm64v8/alpine:latest
    ADD rootfs.tar /
    CMD ["/sbin/init"]
    
  • 构建Docker镜像

    sudo docker buildx build --platform linux/arm64 -t openwrt-docker --load .
    
  • 上传到Dockerhub

    sudo docker tag openwrt-docker dockerhub-username/openwrt-docker:latest
    sudo docker push dockerhub-username/openwrt-docker:latest
    
  • 然后回到树莓派,拉取镜像,注意这里最好用命令行

    docker pull dockerhub-username/openwrt-docker:latest
    
  • 创建一个容器来运行镜像

    docker run -it --name openwrt-docker dockerhub-username/openwrt-docker:latest
    

烧录

直接烧录的image我们选择openwrt-bcm27xx-bcm2711-rpi-4-squashfs-factory.img.gz

Windows

可以使用Balena Etcher或者其他的disk imager软件将image烧录到SD卡中,非常简单,按顺序一步一步来即可

Balena Etcher for Windows

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的随便一个数

    IP Config

    当树莓派就跟电脑在相同子网后,在浏览器中输入192.168.1.1,就能登录到OpenWrt的GUI(LuCI)了,默认用户名和密码是rootpassword

  • 大功告成了

    Initial Page

    Status Page

连接路由器

  • 我家主路由器使用的子网为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'
            option ip6assign '60'
    
  • 禁用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,我需要这么修改:

    Windows Configure Gateway

  • MacBook也一样

    MacBook Configure Gateway

    MacBook Configure DNS

  • 同样的iPhone也可以设置,这里我就不放图了

  • 因为怕炸网我暂时先使用这种非侵入式的设置,它只影响把网关设置为软路由的终端,这样一旦网坏了只影响部分设备,或者我修改一下网关修改到主路由器的IP地址就可以了

详见:软路由做旁路由三步搞定!openwrt软路由 R2S R4S openwrt软路由上网设置

安装插件

卸载插件

  • 可以在System → Software → Installed中卸载插件
  • 注意直接编译进内核固件的插件无法卸载

安装插件

直接安装

国外使用

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

国内使用

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
自己编译
  • 首先需要在Ubuntu上编译插件

    make menuconfig
    

    在LuCI → Applications可以把固件全选上,毕竟我们是做个固件库,之后有啥需求就装啥。选择时应该模块化,按空格让前面括号里出现一个M。保存后回到命令行开始编译

    make -j1 V=s
    
  • 编译完成后在bin\packages中就能找到我们编译的全部插件了,而且都为.ipk格式

常见使用场景

去广告

外网访问我的Windows台式机

Wireguard
  • Wireguard因为比OpenVPN轻量化速度更快,因此是我目前首选
  • 所需插件(具体配置路径见这里
    • kmod-wireguard
    • luci-proto-wireguard
    • wireguard-tools
    • luci-app-wireguard(可以不选,而且在我的menuconfig没找到)
  • 配置参考:OpenWrt配置Wireguard | Kunyang’s Blog
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

文件管理