前言 openwrt 是一个自由的、兼容性好的嵌入式 linux 发行版。作为软路由玩家必备的一款神器,可以实现诸如去广告,多拨和科学上网等多种功能。本文介绍openwrt在各种平台上的部署流程。

要实现的目标

  • 1.IPv6 分配到每个设备;
  • 2.NAT类型为NAT1(全锥形);
  • 3.可控的流量记录与IP控制/QOS;
  • 4.可靠的硬件加速;
  • 5.多线多播/宽带提速;
  • 6.PPPoE拨号,替代一部分光猫功能;
  • 7.智能DNS配置与去广告;
  • 8.VPN配置回家;
  • 9.实现透明代理。

大致思路

  • 使用高性能的X86主机管理拨号和 DHCP 内网的工作,其他无线路由器桥接做AP,Mesh组网;
  • 使用绕过中国流量模式,国内流量不经过代理内核直接直连,加快国内网站访问。保持尽可能高的 NAT 等级;
  • 不使用旁路由,所有流量过主路由;由于第二点代理挂了也不影响国内正常上网;
  • 国内外域名分流查询,国内域名查运营商 DNS ,国外域名经代理查国外 DoH ,直接返回真实 IP;
  • 良好的国内 IPv6 支持,只对国内域名返回 IPv6 AAAA 结果,国外域名只用 IPv4;
  • 兼容 Adguard Home ,方便管理域名黑白名单;
  • 对能直连的国外服务能返回最优的节点,而不是绕路其他地方;

选择合适的设备

无论是传统的无线路由器还是小主机都有成为openwrt路由的潜力。截止到今天,已经有20多个品牌(小米,华硕,锐捷,华三等)30多种架构(x86,ipq,bcm,mtd等)支持刷入openwrt;你可以在这个网站找到符合你预算和其他要求的,能刷机的路由器。 传统家用无线路由器由于主频低,内存小,并不适合作为软路由;而 NAS-软路由一体式 又有 all in boom 的风险,因此推荐X86平台作为物理机。当然,也可以采用 armbian 平台或是开发板,例如网心云老母鸡、树莓派等设备。截至本文撰写时间,二手平台上的价格不太利好:一台J1900平台的售价往往在200左右,而专门的多网口工控机价格在200到1000不等,树莓派更是成为了理财产品,需要慎重选择。

选择合适的系统

除了openwrt主线外,还可以选择:

  • LEDE 高质量,更新快速,具有新特性的openwrt分支。

  • iStoreOS iStoreOS是openwrt的一个分支,iStoreOS 提供了软件中心:iStore,以及较美观的界面和docker支持,对新手体验较好。

  • ImmortalWrt 是一个原版openwrt的分支,中文优化好,更新也勤快,内置镜像源可以直连下载&更新。

如何得到一个openwrt系统

  1. 使用编译好的现成的镜像:
  • 恩山论坛上的"高大全","精品小包"等等,但存在一定风险;
  • 使用官方固件下载得到一个最小化的系统,再一步步添加自己要用的包;注意需要根据你的uboot来选择,注意固件名称是否带了uboot_mod!
  1. 自行编译:
  • Openwrt.ai在线编译 一个固件;
  • 可以使用GitHub action 云编译一个固件;
  • 可以在本地linux环境中进行编译。
  1. ImageBuilder

Toolchain/SDK/ImageBuilder

特性ToolchainSDKImage Builder
包含内容仅交叉编译工具链(二进制版 GCC、ld、musl、binutils)完整交叉编译环境 + feeds 脚本 + package 目录,用于 .ipk 包开发预编译的根文件系统 + opkg 包(无需源码编译),用于快速定制固件映像
典型用途用于编译第三方程序或 CI,如 hello-world 示例编写和编译 .ipk 包,本地或自动化环境中离线开发快速生成可刷写的固件镜像,集成所需包且无需完整源码树
解压即用✅✅✅
在源码树中的作用make toolchain/install 自动识别并使用跳过编译流程源码树中不会触发 SDK 安装,需要手动解压并进入其目录使用不使用源码树,直接在 Image Builder 根目录下运行 make image 等命令
大小较小(几十 MB)较大(上百 MB)中等(约数百 MB,因包含预编译包)
构建时间几秒到几分钟几分钟到十几分钟(取决于 feeds 大小)极快,可在几十秒到几分钟内完成定制镜像
兼容性与对应 Release 完全匹配与对应 Release 完全匹配与对应 Release 完全匹配
使用难度简单,只需解压并设置 PATH适中,需要理解 feeds 机制及包管理最简单,适合终端用户或快速测试环境

X86平台安装流程

  1. 安装准备:
  1. 进入PE环境:
  • 打开微PE,将其安装进U盘中,安装完成后将 img 工具和 openwrt 包一起放进去;
  • 将U盘插入目标主机,进入 BIOS-boot 设置U盘优先启动,各主板进入 BIOS 的按键不同,不确定的话建议都试一遍。
  1. 格式化硬盘并写盘
  • 进入PE环境中,可以看到存在名为“分区助手”的软件,打开它并将目标主机硬盘格式化;注意不要分区!不要分区!不要设置文件系统!否则后续可能无法编译!点击左上角提交并执行
  • 打开img写盘工具,将openwrt包写入硬盘,注意不要写进U盘里。
  1. 进入配置界面
  • 重启系统并快速拔出U盘,避免重新进入PE;这时系统开始运行了。注意Esir固件是不跑码的,无需担心。- 一个U盘与一台双网口物理机
  • 当看到 please press Enter to activate this console这个提示的时候系统就安装完毕了。可使用 passwd 命令设置密码。软路由将自动获取IP地址,随后我们在浏览器中打开该地址,即可看到 Lucl 界面。
  1. 如果你使用官方固件,注意:
  • 硬盘空间有一部分没有被格式化,可以手动格式化为ext4并挂载。
  • 注意初始IP往往是192.168.1.1,如果和光猫冲突需要在网络-接口中更改。
  • 基本系统主题比较简陋,可以使用luci-theme-argon。
  • 刷错主题无法打开luci:通过 SSH 登录路由器,切换到另一个已知正常的主题(例如 Bootstrap):
uci set luci.main.mediaurlbase='/luci-static/bootstrap'
uci commit luci
/etc/init.d/uhttpd restart
/etc/init.d/rpcd restart

然后重新访问 Web 界面,查看是否恢复正常。

X86平台本地编译完整openwrt

  • 系统版本:Debian 11 或者 Ubuntu LTS

  • 网络要求:科学上网环境,配置推荐 2H4G 以上

  • 编译依赖

sudo apt update
sudo apt install -y \
  ack antlr3 asciidoc autoconf automake autopoint binutils bison build-essential \
  bzip2 ccache clang cmake cpio curl device-tree-compiler diffutils diffstat findutils flex gawk \
  gcc-multilib g++-multilib git gettext gperf grep haveged help2man intltool \
  libelf-dev libfuse-dev libgmp3-dev libgl1-mesa-dev libgraphene-1.0-dev libglib2.0-dev \
  libltdl-dev libmpc-dev libmpfr-dev libncurses-dev libpython3-dev libreadline-dev libssl-dev \
  libtool lrzsz make mesa-common-dev msmtp ninja-build p7zip p7zip-full patch pkgconf \
  perl python-is-python3 python3 python3-dev python3-distutils-extra python3-pip python3-pyelftools \
  python3-setuptools qemu-utils rsync scons squashfs-tools subversion swig texinfo uglifyjs \
  upx-ucl unzip vim wget gnu-which xmlto xxd zlib1g-dev genisoimage llvm llvm-runtime docutils-common \
  ecj fastjar java-wrappers libeclipse-jdt-core-java libgnutls-dane0t64 \
  libgnutls-openssl27t64 libgnutls28-dev libidn2-dev libp11-kit-dev libtasn1-6-dev libtasn1-doc \
  libunbound8 libyaml-dev lld lld-18 nettle-dev python3-docutils python3-ply python3-roman re2c
  • 清理
sudo apt autoremove --purge
sudo apt clean
  • 新建一个用户,用于编译固件(可选)
useradd -m openwrt  # 新建一个名为 openwrt 的用户

不可以使用Root用户进行编译!!!

  • 修改用户默认的 Shell
apt install -y sudo
usermod -s /bin/bash openwrt
  • 切换用户
su openwrt
cd ~
  • 拉取源码,这里用的是 ImmortalWrt 24.10 分支源码:
git clone https://github.com/immortalwrt/immortalwrt.git
cd immortalwrt
  • 选择分支

如果你想要编译稳定版(stable),使用

git checkout xxx #例如git checkout v24.10.2

如果你想要编译最新版(snapshot),使用

git switch xxx #例如git switch openwrt-24.10
  • 添加软件源,可自行添加软件源至 feeds.conf.default 文件
vim feeds.conf.default

常用源

src-git kenzo https://github.com/kenzok8/openwrt-packages
src-git small https://github.com/kenzok8/small
src-git haibo https://github.com/haiibo/openwrt-packages
src-git liuran001 https://github.com/liuran001/openwrt-packages

常用仓库

src/gz kwrt_core https://dl.openwrt.ai/releases/24.10/targets/x86/64/6.6.83
src/gz kwrt_base https://dl.openwrt.ai/releases/24.10/packages/x86_64/base
src/gz kwrt_packages https://dl.openwrt.ai/releases/24.10/packages/x86_64/packages
src/gz kwrt_luci https://dl.openwrt.ai/releases/24.10/packages/x86_64/luci
src/gz kwrt_routing https://dl.openwrt.ai/releases/24.10/packages/x86_64/routing
src/gz kwrt_kiddin9 https://dl.openwrt.ai/releases/24.10/packages/x86_64/kiddin9
  • 单独添加(在更新并安装插件之前执行)例如:
git clone https://github.com/chenmozhijin/turboacc.git
  • 更新并安装插件
./scripts/feeds clean
./scripts/feeds update -a
./scripts/feeds install -a
./scripts/feeds update -a同步/更新 外部 feed(packages、luci、routing 等)的 Git 仓库到本地 feeds/ 目录
./scripts/feeds install -a把你在 feeds 里选要用的包 链接 到源码树的 package/feeds/,让它们参与编译
  • 执行 make menuconfig 命令进入编译菜单。
命令功能描述优点适用场景
make menuconfig以 ncurses 界面交互式地浏览、修改当前 .config 与最新 Kconfig 中的所有选项界面友好,支持搜索和分类;可直观调整想手动挑选/调整配置时
make oldconfig在命令行逐项对比 .config 与最新 Kconfig:保留原值、提示新增项、删除废弃项快速同步,只对新增选项发出提示;无需界面自动化脚本或快速同步配置时
make defconfig忽略当前 .config,直接加载架构/板级目录下的默认配置(defconfig)一键生成官方/平台推荐的「干净」配置想重置到官方默认或重新开始时
  • 预下载编译所需的软件包
make download -j8
  • 检查文件完整性
find dl -size -1024c -exec ls -l {} \;

检查文件完整性命令可以列出下载不完整的文件,小于1k的文件属于下载不完整,如果存在则用下面的命令删除,然后重新下载编译所需的软件包,再次检查.确认所有文件完整可大大提高编译成功率,避免浪费时间

find dl -size -1024c -exec rm -f {} \;
  • 最后编译固件(-j 后面是线程数,首次编译推荐用单线程)编译完成后输出路径是bin/targets.
make V=s -j1

或者使用 make world -j1 V=s 2>&1 | tee world_debug.log

如果报错可查看 grep -E "(error|fatal|Cannot install package)" world_debug.log -n
make层级目录示例说明
make[1]顶层 Makefile解析依赖,调度模块
make[2]tools/编译辅助工具
make[2]toolchain/编译交叉编译工具链
make[2]target/linux/编译内核及设备树
make[2]package/进入包管理,调度包构建
make[3]package/libs/libc单个包的 Makefile
make[3]package/utils/busybox单个包的 Makefile
make[4]build_dir/target-...包源码目录,运行源码的 make
make[4]build_dir/target-linux-...内核源码目录

自定义配置脚本

#!/usr/bin/env bash

set -e

# 检测项目类型(OpenWrt 或 ImmortalWrt)
DETECT_TARGET_FILE="package/base-files/files/etc/openwrt_release"
if [ -f "$DETECT_TARGET_FILE" ]; then
  if grep -qi "immortalwrt" "$DETECT_TARGET_FILE"; then
    TARGET_TYPE="ImmortalWrt"
  elif grep -qi "openwrt" "$DETECT_TARGET_FILE"; then
    TARGET_TYPE="OpenWrt"
  else
    TARGET_TYPE="OpenWrt"
  fi
else
  # 如果检测文件不存在,通过其他方式判断
  if [ -d "feeds/packages" ]; then
    TARGET_TYPE="ImmortalWrt"
  else
    TARGET_TYPE="OpenWrt"
  fi
fi

echo "📋 检测到目标类型:$TARGET_TYPE"

# 1. 默认 hostname
CONFIG_GEN_FILE="package/base-files/files/bin/config_generate"
if [ -f "$CONFIG_GEN_FILE" ]; then
  if [ "$TARGET_TYPE" = "ImmortalWrt" ]; then
    sed -i "s/ImmortalWrt/Dwrt/g" "$CONFIG_GEN_FILE"
  else
    sed -i "s/OpenWrt/Dwrt/g" "$CONFIG_GEN_FILE"
  fi
  echo "✅ Hostname 已修改为 Dwrt"
else
  echo "⚠️  $CONFIG_GEN_FILE 不存在,跳过 hostname 修改"
fi

# 2. 默认 IP 地址
if [ -f "$CONFIG_GEN_FILE" ]; then
  if grep -q "192.168.2.1" "$CONFIG_GEN_FILE"; then
    sed -i 's/192.168.2.1/192.168.1.1/' "$CONFIG_GEN_FILE"
    echo "✅ 默认 IP 已修改为 192.168.1.1"
  elif grep -q "192.168.1.1" "$CONFIG_GEN_FILE"; then
    echo "✅ 默认 IP 已经是 192.168.1.1"
  else
    echo "⚠️  $CONFIG_GEN_FILE 中未找到默认 IP 地址"
  fi
fi

# 3. 默认 root 密码
SHADOW_FILE="package/base-files/files/etc/shadow"
if [ -f "$SHADOW_FILE" ]; then
  HASH=$(openssl passwd -1 'password')
  if grep -q "^root::" "$SHADOW_FILE"; then
    sed -i "s|root::0:0:99999|root:${HASH}:0:0:99999|" "$SHADOW_FILE"
    echo "✅ root 密码已设置"
  elif grep -q "^root:" "$SHADOW_FILE"; then
    echo "⚠️  root 账户已设置密码,跳过"
  else
    echo "⚠️  $SHADOW_FILE 中未找到 root 账户"
  fi
else
  echo "⚠️  $SHADOW_FILE 不存在,跳过 root 密码设置"
fi

# 4. 设置默认 LuCI 主题为 argon
mkdir -p package/base-files/files/etc/uci-defaults
cat >package/base-files/files/etc/uci-defaults/99_set_theme <<'EOF'
uci set luci.main.mediaurlbase=/luci-static/argon
uci commit luci
EOF
chmod +x package/base-files/files/etc/uci-defaults/99_set_theme
echo "✅ LuCI 主题已设置为 argon"

# 5. 默认加载 BBR 拥塞控制算法
mkdir -p package/base-files/files/etc/sysctl.d
cat >package/base-files/files/etc/sysctl.d/99-bbr.conf <<'EOF'
net.core.default_qdisc=fq_codel
net.ipv4.tcp_congestion_control=bbr
EOF
echo "✅ BBR 拥塞控制算法已启用"

# 6. 修改默认 shell 为 bash
PASSWD_FILE="package/base-files/files/etc/passwd"
if [ -f "$PASSWD_FILE" ]; then
  if grep -q "/bin/ash" "$PASSWD_FILE"; then
    sed -i "s|/bin/ash|/bin/bash|g" "$PASSWD_FILE"
    echo "✅ 默认 shell 已修改为 bash"
  elif grep -q "/bin/bash" "$PASSWD_FILE"; then
    echo "✅ 默认 shell 已经是 bash"
  else
    echo "⚠️  $PASSWD_FILE 中未找到 ash 或 bash"
  fi
else
  echo "⚠️  $PASSWD_FILE 不存在,跳过 shell 修改"
fi

# # 7. 自定义 SSH 登录横幅
# mkdir -p package/base-files/files/etc
# if [ -f "scripts/custom-files/banner.txt" ]; then
#   cp scripts/custom-files/banner.txt package/base-files/files/etc/banner
#   echo "✅ 使用自定义 banner"
# else
#   cat >package/base-files/files/etc/banner <<'EOF'
# |   | _____   _____   ____________/  |______  |  |
# |   |/     \ /     \ /  _ \_  __ \   __\__  \ |  |
# |   |  Y Y  \  Y Y  (  <_> )  | \/|  |  / __ \|  |__
# |___|__|_|  /__|_|  /\____/|__|   |__| (____  /____/
#           \/      \/             By Dich    \/
# -----------------------------------------------------
# EOF
#   echo "✅ 默认 banner 已设置"
# fi
echo "✅ diy.sh 执行完毕"

目录说明

名称作用
Makefile整个 OpenWrt 构建系统的总入口点(顶层 Makefile),运行 make menuconfig、make 都依赖它
Config.inKconfig 系统的入口配置文件,决定 make menuconfig 菜单显示什么选项
config/构建系统的默认配置模板、菜单逻辑,和 menuconfig 相关
include/包含通用 makefile 片段的目录(比如编译选项、函数定义)
rules.mk所有包编译通用规则都写在这里,include $(TOPDIR)/rules.mk 是常见语句
feeds.conf.default定义 Feed 源(即可选的软件源),可用于管理外部包,比如 luci、packages
feeds/ (克隆后还没出现)./scripts/feeds update -a 后才会出现,用来保存外部 feed 的代码
package/OpenWrt 自带的核心包和第三方包(除 feeds 外的)都在这,结构是 package/<分类>/<包名>
target/支持的平台架构,比如 x86、ramips、ath79、mediatek 等都在里面
toolchain/编译器链、glibc/musl、binutils、gcc 都在这里构建
tools/构建工具目录,编译前工具如 m4、autoconf、xz、patch 等放在这
scripts/脚本工具目录,如 feeds 管理、镜像合并、menuconfig 支持等
LICENSES/所有包/组件的许可证归档
COPYINGOpenWrt 的主许可证(GPLv2)
README.md简要介绍如何开始使用 OpenWrt 的说明文档
BSDmakefile为 BSD 系统一些兼容 makefile,Linux 用户用不到

编译配置菜单

Target System (x86)                                # 选择目标平台
└── Subtarget (x86_64)                             # 选择 64-bit 子架构
    └── Target Profile (Generic)                   # “Generic” 表示通用 x86_64 设备
        └── Target Images                          # 固件镜像设置
            ├── ramdisk                            # 可选内存盘镜像
            │   ├── Compression                    # 压缩类型(如 none 表示无压缩)
            │   ├── Root filesystem archives       # 压缩存档:cpio.gz 或 tar.gz
            │   └── Root filesystem images         # 文件系统镜像:ext4、squashfs、Gzip
            └── Image Options                      # 镜像选项
                ├── Kernel partition size           # 内核分配分区大小
                ├── Root filesystem partition size # 根文件系统分区大小
                └── Make /var persistent            # 是否保留 /var 持久化

Global build settings                             # 全局构建设置
Advanced configuration options (for developers)  # 开发者高级选项
Build the OpenWrt Image Builder                  # 编译镜像构建器
Build the OpenWrt SDK                            # 构建交叉编译 SDK
Package the OpenWrt‑based Toolchain              # 打包 OpenWrt 工具链
Image configuration                              # 镜像总体配置页面

Base system         # 系统基础组件
Administration      # 管理工具(如 ssh、管理员脚本)
Boot Loaders        # 引导程序(如 grub、syslinux)
Development         # 编译/调试辅助工具
Extra packages      # 附加应用(如 wget、curl)
Firmware            # 固件工具
Fonts               # 字体支持
Kernel modules      # x86 内核模块驱动
Languages           # 编程语言包(如 Python3、Node.js)
Libraries           # 系统库依赖
LuCI                # Web UI 前端
└── Collections
└── Modules
└── Applications
└── Themes
└── Protocols
└── Libraries
└── default‑settings

Mail                # 邮件客户端
Multimedia          # 媒体工具(如 ffmpeg)
Network             # 网络功能(如 openvpn、wireguard)
Sound               # 音频相关软件
Utilities           # 常用实用程序(如 vim、htop)
Xorg                # 桌面环境支持(X11 图形系统)

清理编译

命令清除内容保留内容适用场景
make clean删除 bin/ 镜像、build_dir/ 编译产物.config、staging_dir/、toolchain/ 等小修改后重建镜像,速度快,常用于增量编译。
make dirclean和 make clean 一样,还删除 staging_dir/、toolchain/、logs.config彻底重建交叉编译环境,适合更改编译配置如 .config、feeds 等。
make distclean删除 make dirclean 的所有内容 + feeds 下载文件 + .config、patch 等所有状态只有源码目录保持不变专用于回到一个“零配置、重做一切”的状态,完全从头开始构建。

恢复所有修改(包括未跟踪文件):

git clean -fd
git restore --source=v24.10.2 --staged --worktree .

使用SDK快速编译包

首先新建一个文件夹并将SDK克隆下来:

mkdir imwrt-sdk
cd ./imwrt-sdk
wget https://downloads.immortalwrt.org/snapshots/targets/mediatek/filogic/immortalwrt-sdk-mediatek-filogic_gcc-14.3.0_musl.Linux-x86_64.tar.zst

新版本的SDK使用ZSTD压缩,因此解压的命令为

tar -I zstd -xvf ./immortalwrt-sdk-mediatek-filogic_gcc-14.3.0_musl.Linux-x86_64.tar.zst

随后进入该目录并和一般流程一样更新Feeds:

cd ./immortalwrt-sdk-mediatek-filogic_gcc-14.3.0_musl.Linux-x86_64/
./scripts/feeds update -a
./scripts/feeds install -a

更新完成后克隆你要编译的包的源码到package下:

cd ./package/
git clone https://github.com/Dichgrem/luci-app-nyn.git
cp ./luci-app-nyn/luci-app-zzz ./
cp ./luci-app-nyn/zzz ./
rm -rf ./luci-app-nyn
cd ../

随后开始编译,编译结果在对应架构的base目录下:

make package/luci-app-zzz/compile V=s

~/imwrt-sdk/immortalwrt-sdk-24.10.3-x86-64_gcc-13.3.0_musl.Linux-x86_64 dich@uos
❯ find ./ -name "zzz*.ipk"
./bin/packages/x86_64/base/zzz_0.1.1-r1_x86_64.ipk

更换Uboot并切换到openwrt

如果你想从immotalwrt切换回openwrt,可以使用以下步骤(以mt798x为例):

完整流程图

编译 kmod-mtd-rw
      ↓
解锁 MTD
      ↓
备份 BL2 / FIP
      ↓
刷 openwrt FIP
      ↓
Linux 启动 TFTP (192.168.1.254)
      ↓
U-Boot TFTP recovery
      ↓
启动 initramfs
      ↓
sysupgrade 刷正式系统
  • 1.先从 OpenWrt firmware selector 下载设备文件:
openwrt-mediatek-filogic-nokia_ea0326gmp-bl31-uboot.fip
openwrt-mediatek-filogic-nokia_ea0326gmp-initramfs-recovery.itb
  • 2.编译安装 kmod-mtd-rw

因为 BL2 / FIP 默认是只读的,必须安装 kmod-mtd-rw 才能写。如果你的固件仓库没有该模块,就要自己编译。或者可以去immortalwrt downloads下载。

  • 3.解锁 MTD

在路由器 SSH:

scp kmod-mtd-rw*.ipk root@192.168.1.1:/tmp

安装:

opkg install /tmp/kmod-mtd-rw*.ipk

加载模块:

insmod mtd-rw.ko i_want_a_brick=1
  • 4.备份关键分区

在路由器后台-系统-备份与更新-保存 mtdblock 内容下备份所有分区。

  • 5.刷写新 Bootloader

先上传文件:

scp openwrt-mediatek-filogic-nokia_ea0326gmp-bl31-uboot.fip root@192.168.1.1:/tmp

刷写:

mtd write /tmp/openwrt-mediatek-filogic-nokia_ea0326gmp-bl31-uboot.fip FIP

这一步实际上就是替换 U-Boot

  • 6.启动 TFTP

先设置网卡的ip:

sudo ip addr add 192.168.1.254/24 dev enp5s0f3u2
sudo ip link set enp5s0f3u2 up

然后创建tftp的工作目录,将要上传的itb放进去:

mkdir ~/tftp
cp openwrt-mediatek-filogic-nokia_ea0326gmp-initramfs-recovery.itb ~/tftp
cd ~/tftp
sudo tftpd -i 192.168.1.254 -p 69 -d ~/tftp
  • 7.进入 U-Boot TFTP recovery

路由器断电 -- 按住 RESET 或者 WPS -- 插电 -- 等 10 秒 --松开

U-Boot 会自动:

TFTP server: 192.168.1.254
Router IP:   192.168.1.1

并下载:

initramfs-recovery.itb

然后启动。

  • 8.进入 initramfs

启动成功后:

IP: 192.168.1.1
user: root
password: (空)

SSH:

ssh root@192.168.1.1
  • 9.刷正式系统

把 sysupgrade 传上去:

scp openwrt-mediatek-filogic-nokia_ea0326gmp-squashfs-sysupgrade.itb root@192.168.1.1:/tmp

执行:

sysupgrade -n /tmp/openwrt-mediatek-filogic-nokia_ea0326gmp-squashfs-sysupgrade.itb
  • 10.完成

重启后:

http://192.168.1.1

就是正式 OpenWrt。

Dwrt 方案

作用组件
主题argon
Shellbash
SSH 服务器dropbear
Web 服务器uhttpd
DNS/DHCP 服务dnsmasq‑full
加密库libopenssl
压缩算法zram-swap+zstd
拥塞控制kmod-tcp-bbr
防火墙nftables + iptables
调度模块BPF + kmod-sched-xxx
时间同步ntpd + ntp-utils
文本编辑vim-full + vim-runtime
编译优化LTO + O3

要启用的软件包:

base

openssh-sftp-server wget-ssl curl nano

cli

btop iperf3 tcpdump

luci

luci luci-i18n-base-zh-cn luci-compat luci-app-argon luci-app-ttyd luci-app-eqosplus luci-app-timecontrol luci-app-parentcontrol

lib

kmod-nft-queue kmod-ipt-conntrack kmod-ipt-nat kmod-nft-compat kmod-ipt-fullconenat kmod-ip6tables ca-certificates

常用科学插件

校园网多设备防检测

常见检测方法:

  • TTL检测法 解法:插件统一修复或使用桥接;使用kmod-iptables-ipot模块;
  • User-Agent 解法:统一经过singbox代理或使用UA2F/UA3F;
  • 时间戳检测法 解法:统一NTP服务器;

高性能开销检测方法:

  • IP-ID检测法 解法:UDP over TCP或rkp-IPid;
  • Flash cookie 解法:内置防火墙组件;
  • DPI检测法 深度包检测特征值 解法:代理协议;

高性能开销的检测方法会浪费大量性能,一般很少有学校这么做。IP-ID和Flash检测法如今已经不多见。

TTL修复:

依赖包
opkg install kmod-nft-core kmod-nft-bridge kmod-nft-net kmod-nft-offload kmod-nft-nat

首先检查 mangle 表是否存在
nft list tables

创建 mangle 表(如果不存在)
nft add table ip mangle

创建 POSTROUTING 链(如果不存在)
nft add chain ip mangle POSTROUTING { type nat hook postrouting priority 0 \; }


添加 TTL 规则
nft add rule ip mangle POSTROUTING ip ttl set 64

检查规则是否生效
nft list table ip mangle

Openwrt改AP模式

有时候我们使用X86做主路由,想让无线路由器只起到发射信号的作用,就可以将其改为AP模式,一般步骤为:

  • 更改lan地址,将lan口地址改到主路由下的一个IP;
  • 关闭DHCP服务;
  • 关闭WAN口;
  • 关闭防火墙的禁止转发规则,全部允许;
  • 将X86主路由的网线插到AP的任意一个LAN口。

关闭IPv6

  • 关闭 LAN IPv6 分配
uci set network.lan.ip6assign='0'
uci commit network
  • 关闭 DHCPv6 & RA
uci set dhcp.lan.ra='disabled'
uci set dhcp.lan.dhcpv6='disabled'
uci set dhcp.lan.ndp='disabled'
uci commit dhcp
  • 停掉 odhcpd
/etc/init.d/odhcpd stop
/etc/init.d/odhcpd disable
  • 重启网络
/etc/init.d/network restart

更新所有包

opkg update

opkg list-upgradable \
| awk '{print $1}' \
| grep -vE '^(base-files|busybox|libc|libgcc|libstdc\+\+|procd|netifd|ubus|uci|kernel|kmod-|fstools|mtd|fwtool)$' \
| xargs -r opkg upgrade

25.x以后:

apk update
apk upgrade

教学大纲备忘

<跟着佐大学openwrt开发入门培训班>教学大纲:

1.路由器硬件、软件的发展历史和演变。
2.路由器的硬件、软件架构分析。
3.OpenWRT开发环境配置。
4.make menuconfig常用选项的含义。
5.Bootloader、固件的关系,以及常见Flash布局方式。
6.固件结构分析,固件头的作用。
7.交叉编译工具链的原理和使用方法。
8.OpenWRT Package结构分析。
9.如何移植、编写简单的软件。
10.OpenWRT UI框架发展历史讲解,石像鬼、X-WRT、Luci。
11.基于uhttpd,lua编写简单的UI界面,基于Luci编写简单的UI界面。
12.OpenWrt常用命令使用方法讲解,bash/lua讲解。
13.OpenWrt UCI框架分析,/etc/config/network、/etc/config/wireless 等文件讲解。
14.OpenWrt sysupgrade命令实现原理分析。
15.OpenWrt 启动过程分析。
16.OpenWrt ipkg软件包结构分析。
17.OpenWrt mtd flash映射关系分析,art、eeprom、nvram、factory分区作用讲解。
18.OpenWrt挂载U盘、SD卡等,讲解hotplug的运行机制。
19.OpenWrt无线工作模式:station模式、ap模式、monitor模式讲解。
20.OpenWrt patch补丁原理。
21.OpenWrt ubus通讯分析。
22.NAND Flash与UBI、UBI卷、UBI固件。

已录制课程内容列表:

课时00-关于网络上盗版视频的看法.mp4
课时00-我为什么做OpenWrt开发视频教程?.mp4
课时01-路由器的软硬件构成上篇.mp4
课时01-路由器的软硬件构成下篇.mp4
课时02-路由器固件开发的一般流程是什么?.mp4
课时03-如何配置OpenWrt开发环境?.mp4
课时04-如何扩充虚拟机磁盘容量?.mp4
课时05-如何编译OpenWrt?.mp4
课时06-如何在Uboot下升级固件?MTK Uboot篇.mp4
课时06-如何在Uboot下升级固件?QCA Uboot篇.mp4
课时07-OpenWrt编译环境目录结构分析.mp4
课时08-如何使用文本编辑器vi、vim?.mp4
课时09-路由器的启动过程分析.mp4
课时10-make menuconfig 菜单选项分析.mp4
课时11-OpenWrt 文件系统目录结构分析.mp4
课时12-Makefile入门教程.mp4
课时13- OpenWrt package Makefile 分析.mp4
课时14-OpenWrt 启动过程分析.mp4
课时15-OpenWrt 常用命令.mp4
课时16-OpenWrt UCI框架分析.mp4
课时17-OpenWrt ubus框架分析.mp4
课时18-OpenWrt hotplug机制分析.mp4
课时19-OpenWrt opkg包管理机制分析.mp4
课时20-OpenWrt 常见文件系统介绍.mp4
课时21-OpenWrt 固件的结构分析、如何逆向解包.mp4
课时22-如何创建OpenWrt package.mp4
课时23-OpenWrt 如何创建开机自启动服务.mp4
课时24-OpenWrt opkg特性应用实例(升级时保留配置文件、opkg install remove 时保留配置文件).mp4
课时25-OpenWrt Cron 定时任务.mp4
课时26-OpenWrt GPIO框架及应用.mp4
课时27-OpenWrt 基于GPIO、Hotplug、DTS 的按键实验.mp4
课时28-OpenWrt vlan、switch、bridge、wan、lan、wlan、wifi等相关概念解析.mp4
课时29-OpenWrt 基于DTS适配RAM、Flash、复位键、波特率、端口布局实验.mp4
课时30-OpenWrt MTD 技术简析和相关工具使用.mp4
课时31-如何给OpenWrt打patch补丁.mp4
课时31-如何二次修改patch补丁.mp4 (2024年10月录制)
课时32-学员常见疑问答疑.mp4
课时33-OpenWrt mtd和sysupgrade实现相关知识补充(sysupgrade如何升级时保留配置文件).mp4
课时34-OpenWrt 移植软件实践之wifidog移植.mp4
课时35-OpenWrt 动态库、静态库的创建和使用.mp4
课时36-如何使用OpenWrt toolchain 交叉编译工具链.mp4
课时37-NAND Flash与UBI-01 NAND Flash相关知识.mp4    (2023年5月录制)
课时37-NAND Flash与UBI-02 UBI简介.mp4
课时38-UBI Flash Layout与UBI固件上篇.mp4    (2023年5月录制)
课时38-UBI Flash Layout与UBI固件下篇.mp4

<跟着佐大学openwrt开发进阶培训班>教学大纲:

01.讲解无线相关的知识,频率、频宽、Country Code、工作模式(AP、AP client、WDS...)、无线模式。(1课时)
02.交叉编译工具的使用方法详解。(1课时)
03.软件移植、内核模块移植实践课。(1课时)
04.简单讲解ARP、IP、TCP、UDP协议。(1课时)
05.讲解路由器核心功能之PPPoE Client,pppd。(1课时)
06.讲解路由器核心功能之DNS Server,dnsmasq。(1课时)
07.讲解路由器核心功能之DHCP Server,dnsmasq。(1课时)
08.讲解路由器核心功能之DHCP Client,dhcpc。(1课时)
09.讲解路由器核心功能之Firewall。(1课时)
10.讲解路由器核心功能之网桥。(1课时)
11.讲解路由器核心功能之Qos。(1课时)
12.讲解路由器核心功能之路由。(1课时)
13.讲解路由器核心功能之DDNS、NTP Client、HTTP Server。(1课时)
14.讲解iptables的命令使用方法和常见应用,讲解filter表、nat表、mangle表的区别及用途。(3-4课时)
15.OpenWrt UI开发入门,基于佐大自己研发的Tomato UI作为讲解范例。(3-4课时)
16.路由器常用调试命令讲解:ifconfig、ping、traceroute、ip、route、arp、wget、telnet、tftp、nc、netstat、nslookup、dig、iw、iwconfig、iperf。(1课时)
17.如何适配OpenWrt不支持的硬件(12课时)

已录制课程内容列表:

课时00-前言.mp4
课时01-无线相关的基本概念.mp4
课时02-交叉编译工具使用方法详解.mp4
课时03-移植闭源mt76x2e驱动上篇.mp4
课时03-移植闭源mt76x2e驱动下篇.mp4
课时04上-移植闭源mt7615e驱动之如何创建package.mp4
课时04中-移植闭源mt7615e驱动之如何移植驱动.mp4
课时04下-移植闭源mt7615e驱动之如何测试联调.mp4
课时05-GPIO高级应用之GPIO模拟时序读取FC手柄按键数值.mp4
课时06-TCPIP协议的基本概念(ARP、IP、TCP、UDP协议).mp4
课时07-路由器核心功能实现之PPPoE Client.mp4
课时08-路由器核心功能实现之DNS Server.mp4
课时09-路由器核心功能实现之DHCP Server.mp4
课时10-路由器核心功能实现之DHCP Client.mp4
课时11-路由器核心功能实现之NTP Client.mp4
课时12-路由器核心功能之网桥(virtual bridge).mp4
课时13-路由器核心功能之路由.mp4
课时14-路由器核心功能之QoS.mp4
课时15-路由器核心功能之firewall.mp4
课时16-路由器核心功能之DDNS.mp4
课时17-OpenWrt Web界面开发导论.mp4
课时18-OpenWrt Web界面开发之后端框架.mp4
课时19-OpenWrt Web界面开发之实践.mp4
课时20-路由器常用调试命令讲解.mp4
课时21-如何加密、解密路由器固件.mp4
课时22-如何适配OpenWrt不支持的硬件-01适配原理绪论.mp4                         (2022年新录制课程)
课时22-如何适配OpenWrt不支持的硬件-02如何研究官方文档.mp4
课时22-如何适配OpenWrt不支持的硬件-03阅读Rockchip官方文档.mp4
课时22-如何适配OpenWrt不支持的硬件-04阅读Uboot官方文档.mp4
课时22-如何适配OpenWrt不支持的硬件-05编译OpenWrt.mp4
课时22-如何适配OpenWrt不支持的硬件-06配置交叉编译工具链.mp4
课时22-如何适配OpenWrt不支持的硬件-07编译kernel.mp4
课时22-如何适配OpenWrt不支持的硬件-08编译Rockchip U-Boot.mp4
课时22-如何适配OpenWrt不支持的硬件-09构建刷机镜像之理论知识篇.mp4
课时22-如何适配OpenWrt不支持的硬件-10构建刷机镜像之操作篇上.mp4
课时22-如何适配OpenWrt不支持的硬件-11构建刷机镜像之操作篇下.mp4
课时23-如何逆向分析UBI固件  (2023年新录制课程)