在 OpenWrt/ImmortalWrt 环境下,当路由器之间具备网线连接时,最标准的组网方式并非无线 802.11s Mesh,而是基于 802.11k/v/r 协议的 Dumb AP 模式(有线回程)。这种方案能提供最低的切换延迟(<50ms)和最高的网络吞吐量。本文仅探讨主副路由通过网线直连环境下的Mesh组网方法。


一、 环境准备

1. 软件环境:更换全功能版 wpad

OpenWrt 默认自带的 wpad-basic 删减了漫游协议。要实现 Mesh 漫游,必须安装全功能版本。
注意: 此操作会重启无线,请务必通过有线网线连接路由器。

  • 使用 apk 包管理器 (新版OpenWrt系统):

    apk update
    apk del wpad-basic-mbedtls wpad-basic-wolfssl
    apk add wpad-openssl
  • 使用 opkg 包管理器 (传统OpenWrt系统):

    opkg update
    opkg remove wpad-basic-mbedtls wpad-basic-wolfssl --force-depends
    opkg install wpad-openssl

2. 硬件连接:Dumb AP 模式设置

若副路由已经配置为AP模式,则直接将副路由的WAN 口接入主路由的LAN 口;
若副路由为路由器模式,则参考下方修改配置:

  • 物理连接:主路由 LAN 口 -> 副路由 LAN 口。
  • 副路由核心设置

    1. 修改 IP:在 网络 -> 接口 -> LAN 中,设为与主路由同网段地址(如 192.168.1.2)。
    2. 关闭 DHCP:在 LAN 接口设置下方,勾选 “忽略此接口”
    3. 设置网关:将副路由的 IPv4 网关和 DNS 指向主路由 IP(192.168.1.1)。
    4. 禁用 IPv6 通告:将副路由 LAN 的“路由通告服务”和“DHCPv6 服务”设为“已禁用”。

二、 无线配置核心参数(所有节点同步)

为了实现无缝切换,主路由与副路由的所有频段(2.4G/5G)必须严格统一参数。

1. 基础一致性

  • SSID (名称):全屋统一,不区分 2.4G/5G(如 Purvar WiFi),若区分2.4G/5G则注意Mobility Domain (移动域)需使用不同的值。
  • 加密方式:建议统一使用 WPA2-PSK(CCMP)WPA3-SAE
  • 密码:全屋必须一致。

2. 漫游协议参数 (802.11k/v/r)

进入 网络 -> 无线 -> 接口配置 -> 无线安全,勾选以下选项:

参数项推荐值说明
802.11r Fast Transition开启核心协议:允许秒级切换不掉线
Mobility Domain (移动域)8080关键:所有路由器、所有频段必须填入相同的 4 位十六进制数
FT over DS开启针对有线回程优化,提高协议传输速度
Generate PMK locally开启本地生成成对主密钥,简化握手过程
802.11k (RRM)开启向手机提供邻居列表,缩短扫描耗时
802.11v (BSS Transition)开启允许路由器建议手机切换到更好的节点

若Luci页面上部分参数项不可见,可通过修改/etc/config/wireless 文件方式进行配置,找到对应 SSID 的 config wifi-iface 部分,按 i 进入编辑模式,手动添加以下三行:

option ieee80211k '1'
option ieee80211v '1'
option bss_transition '1'

至此你已经完成了Mesh组网配置,可以重启路由器后使用手机移动到各个不同的房间进行WiFi漫游测试并投入使用。


三、 进阶调优:解决“死粘”信号问题

如果发现手机切换不灵敏,通常是因为信号覆盖过强导致手机不愿重连。

1. 调整发射功率

建议将所有节点的 Transmit Power(发射功率)降低至 15dBm - 18dBm

2. 弱信号剔除 (命令行方式)

若 LuCI 界面无此选项,可编辑 /etc/config/wireless,在 wifi-iface 部分添加:

option disassoc_low_ack '1'
option rssi_threshold '-70'

3. 安装调度程序 (usteer)

usteer 是官方推荐的本地调度策略工具。它不需要复杂的图形界面,能在后台自动实现“频谱引导(Band Steering)”,将支持 5G 的设备引导至更高速的 5G 频段,并辅助漫游决策。

apk add usteer
/etc/init.d/usteer enable
/etc/init.d/usteer start

四、 验证漫游状态

配置完成后,建议在副路由终端验证协议是否真正运行,确保配置已生效而非“心理作用”:

  1. 检查协议加载

    # 注意:路径通常为 /var/run/hostapd/,使用 -i 指定你的无线接口名(如 wlan0 或 wlan1)
    hostapd_cli -p /var/run/hostapd/ -i wlan0 status

    在输出信息中确认包含以下关键字段:

    • ft_supported=1 (802.11r)
    • rrm=1 (802.11k)
    • bss_transition=1 (802.11v)
  2. 查看邻居报告

    # 查看当前节点是否已识别到局域网内的其他漫游节点
    hostapd_cli -p /var/run/hostapd/ -i wlan0 rrm_neighbor_report_conf

    如果输出了另一台路由器的 BSSID(MAC 地址),说明全屋漫游拓扑已成功建立。


结语

通过以上步骤,你已经在 OpenWrt 上构建了一个标准的、基于 IEEE 协议的有线回程 Mesh 系统。这套方案最大的优势在于其协议透明性:它不绑定特定品牌,只要设备支持 802.11k/v/r 协议,就能在全屋移动时获得近乎零感知的网络接力体验,真正做到游戏不掉线、视频不卡顿。

在OpenWrt 编译环境中使用make menuconfig 命令进入配置界面后,需要勾选如下组件:

  • Kernel modules
    USB Support:

    kmod-usb-core
    kmod-usb-ohci
    kmod-usb-uhci
    kmod-usb2
    kmod-usb3
    kmod-usb-net
    kmod-usb-net-rndis
    kmod-usb-net-cdc-ether
    kmod-usb-serial
    kmod-usb-serial-option
    kmod-usb-net-ipheth #iOS设备支持
  • Utilities

    usb-modeswitch
    usbutils

    libimobiledevice:

    usbmuxd #iOS设备支持
  • Libraries
    libimobiledevice:

    libimobiledevice #iOS设备支持

完成上述组件添加后,编译出的OpenWRT固件将支持4G/5G无线网卡和Android、iOS设备通过USB共享网络给路由器。

如果不打算购买蜂窝无线网卡,可以充分利用闲置的手机充当4G/5G无线网卡,达到变废为宝的效果。

此文章已于2025/08/16更新:根据评论内容添加iPhone等iOS设备支持。

如果你的设备CPU为ARM架构,或者使用MacOS ARM 环境的虚拟机,需要在Ubunbtu 操作系统下编译LEDE固件,请参考如下步骤:

1.安装Ubuntu 24 ARM操作系统
MacOS M2/M4环境下,可使用 FusionVirtualbox 安装 Ubuntu,Ububtu ISO下载地址如下:

https://cdimage.ubuntu.com/releases/24.04/release/ubuntu-24.04.2-live-server-arm64.iso

2.安装编译依赖

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 clang cmake cpio curl device-tree-compiler flex gawk gettext \
genisoimage git gperf haveged help2man intltool 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 llvm lrzsz 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

注意:相较LEDE官网提供的x86架构的Ububtu依赖,以上代码已移除如下包,否则将无法在ARM环境下安装(如下包为在x86_64上进行32位编译而设计的,在ARM系统上,LEDE/OpenWrt的构建系统会自己下载并编译对应的交叉编译工具链,而不是依赖宿主系统提供*-multilib包):

gcc-multilib
g++-multilib
libc6-dev-i386

下载安装适用于ARM环境的go:

wget https://www.purvar.cn/uploads/shell/installgo.sh
sh installgo.sh
source ${PROFILE_FILE}

3.下载源代码,更新 feeds 并选择配置

git clone https://github.com/coolsnowwolf/lede
cd lede
./scripts/feeds update -a
./scripts/feeds install -a
make menuconfig

特别注意,ARM环境下需要添加此步操作:
Languages > Go > Configuration > External bootstrap Go root directory
按上面的环境安装后,go应该默认在 /usr/local/go/bin/go目录下,请将 /usr/local/go/bin/go 写入这项配置后保存,否则后续编译将无法正常进行。
如需要确认go的安装路径,请使用如下命令查询:

which go

4.下载 dl 库,编译固件 (-j 后面是线程数,第一次编译推荐用单线程)

make download -j8
make V=s -j1

如需二次编译:

cd lede
git pull
./scripts/feeds update -a
./scripts/feeds install -a
make defconfig
make download -j8
make V=s -j$(nproc)

如果需要重新配置:

rm -rf .config
make menuconfig
make V=s -j$(nproc)

编译完成后输出路径:bin/targets

关于其他环境的编译方法,请移步Lean的LEDE官网