[教學] 用 OpenWRT 做「真」 Wi-Fi 漫遊 (Wi-Fi Roaming)

這個功能屬於偏進階功能,OpenWRT 有一定的專業性,
如果實在不知道怎麼做,請不要貿然嘗試

得利於 OpenWRT 第三方韌體,
可以在家用設備上有做出商用等級才有的功能,
由衷的讚嘆開源的偉大

什麼是 WiFi 漫遊 (Wi-Fi Roaming)?

問題痛點

你可能會遇到類似的情境,
當你有二顆以上的 Wi-Fi AP 路由器,來覆蓋不同的區域,
但你只要一組 SSID 就好(先討論 2.4GHz 與 5GHz 分開的情況)

你可能會先下意識的把主要路由器與子機路由器,設定了同一組 Wi-Fi SSID 與密碼。
主要 Wi-Fi AP 路由器(下稱主機)連上 ADSL,
其他顆 Wi-Fi AP 路由器(下稱子機)插上 LAN 網路線,關閉 DHCP Server,二台路由器變成一個內網。

但,這樣雖然可以用,但不完美。

假設裝置連接上第一顆 Wi-Fi,
如果裝置移動了,
離開第一顆 Wi-Fi AP 的範圍,進入第二顆 AP 的範圍,
裝置會斷線 AP 再重連接入第二顆 AP 路由器,
雖然接上也是同一個網路,但這會造成有點惱人的小問題。

這個時候你就需要 802.11r802.11k/v
Wi-Fi Roaming 技術來「無縫」在不同 Wi-Fi AP 間切換。

802.11r(快速漫遊)

802.11r 又稱為「快速 BSS 轉換」(Fast BSS Transition, FT),主要解決無線裝置在不同存取點(AP)間切換時的延遲問題。傳統漫遊需重新進行完整的 802.1X 認證,可能耗時數百毫秒,導致語音或視訊通話中斷。802.11r 透過預先快取金鑰並簡化握手程序,將漫遊時間縮短至 50 毫秒以下,確保即時應用不受影響。此標準對企業環境中需要無縫移動的 VoIP 電話、視訊會議設備特別重要。

802.11k/v(智慧漫遊輔助)

802.11k(無線資源管理)讓 AP 向用戶端提供鄰近 AP 的資訊清單,使裝置能更快找到最佳切換目標,減少掃描所有頻道的時間與電力消耗。

802.11v(無線網路管理)則允許網路主動建議用戶端切換至負載較輕或訊號更佳的 AP,實現負載平衡並優化整體網路效能。

兩者常搭配 802.11r 共同運作,形成完整的智慧漫遊解決方案,提升大型無線網路的使用體驗。

配置

假設你的 Wi-Fi 路由器配置是這樣

  • 主要 Wi-Fi AP 路由器主機 (192.168.1.1): WAN 孔連接著 ADSL 網路,DHCP Server 開啟
  • 第二顆 Wi-Fi AP 路由器子機 (Dumb AP) (192.168.1.2): 主要延伸 主機 Wi-Fi 的訊號與範圍,
    DHCP Server 關閉(DHCP 純靠主要 AP 路由器)

操作步驟

第一步:更換驅動套件 (一定要做)

這邊我推薦用 ssh 操作,不然在更換套件可能會遇到斷線問題比較麻煩

  • 注意:移除時 WiFi 會斷線,建議使用電腦接網路線操作,或者操作完後重啟路由器。

ssh 的做法

OpenWrt 預設安裝的 wpad-basicwpad-mini
不支援 完整的 802.11r/k/v 功能或 LuCI 選項。
必須先更換套件,換成全功能的版本。

請在「主機」與「子機」上都執行:

電腦分別用 ssh 連接路由器

ssh [email protected]
ssh [email protected]

更新套件清單

opkg update 

查詢套件

opkg list-installed | grep wpad

記錄一下細節

# opkg list-installed | grep wpad
wpad-basic-mbedtls - 2025.08.26~ca266cc2-r1

我們主要目標是要找到 wpad-basicwpad-basic-wolfsslwpad-mini
我這邊是找到 wpad-basic-wolfssl 這個套件,
那我們用 wpad-wolfssl 套件取代它,
二個套件會衝突,不可同時安裝,所以在 ssh 指令列裡面做事比較方便。

我們移除 wpad-basic-mbedtls 套件,改安裝 wpad-wolfssl 套件

opkg remove wpad-basic-mbedtls && opkg install wpad-wolfssl

記錄一下細節

# opkg remove wpad-basic-mbedtls && opkg install wpad-wolfssl
Removing package wpad-basic-mbedtls from root...
Installing wpad-wolfssl (2024.09.15~5ace39b0-r2) to root...
Downloading https://downloads.openwrt.org/releases/24.10.4/packages/mipsel_24kc/base/wpad-wolfssl_2024.09.15~5ace39b0-r2_mipsel_24kc.ipk
Installing libwolfssl5.7.6.e624513f (5.7.6-r1) to root...
Downloading https://downloads.openwrt.org/releases/24.10.4/packages/mipsel_24kc/base/libwolfssl5.7.6.e624513f_5.7.6-r1_mipsel_24kc.ipk
Configuring libwolfssl5.7.6.e624513f.
Configuring wpad-wolfssl.

再查詢一次,就是我們需要的套件了

# opkg list-installed | grep wpad
wpad-wolfssl - 2024.09.15~5ace39b0-r2

備註:新版 24.10 之後與 SNAPSHOTS 版本,
opkg 套件管理器改成用 apk 套件管理器了

查詢套件

apk info | grep wpad

記錄一下細節

# apk info | grep wpad
WARNING: opening from cache https://downloads.openwrt.org/snapshots/targets/mediatek/filogic/packages/packages.adb: No such file or directory
WARNING: opening from cache https://downloads.openwrt.org/snapshots/packages/aarch64_cortex-a53/base/packages.adb: No such file or directory
WARNING: opening from cache https://downloads.openwrt.org/snapshots/targets/mediatek/filogic/kmods/6.12.67-1-aa4948ece684816486d1fa5040ce0bb3/packages.adb: No such file or directory
WARNING: opening from cache https://downloads.openwrt.org/snapshots/packages/aarch64_cortex-a53/luci/packages.adb: No such file or directory
WARNING: opening from cache https://downloads.openwrt.org/snapshots/packages/aarch64_cortex-a53/packages/packages.adb: No such file or directory
WARNING: opening from cache https://downloads.openwrt.org/snapshots/packages/aarch64_cortex-a53/routing/packages.adb: No such file or directory
WARNING: opening from cache https://downloads.openwrt.org/snapshots/packages/aarch64_cortex-a53/telephony/packages.adb: No such file or directory
WARNING: opening from cache https://downloads.openwrt.org/snapshots/packages/aarch64_cortex-a53/video/packages.adb: No such file or directory
wpad-basic-mbedtls

(這些 WARNING 可以先不用理會,關注在搜尋結果即可)

移除wpad-basic-mbedtls 套件,改安裝 wpad-wolfssl 套件

apk del wpad-basic-mbedtls && apk add wpad-wolfssl

記錄一下細節

# apk del wpad-basic-mbedtls && apk add wpad-basic-wolfssl
(1/1) Purging wpad-basic-mbedtls (2025.08.26~ca266cc2-r1)
  Executing wpad-basic-mbedtls-2025.08.26~ca266cc2-r1.pre-deinstall
OK: 22.4 MiB in 159 packages
(1/2) Installing libwolfssl5.8.4.e624513f (5.8.4-r1)
  Executing libwolfssl5.8.4.e624513f-5.8.4-r1.post-install
(2/2) Installing wpad-wolfssl (2025.08.26~ca266cc2-r1)
  Executing wpad-wolfssl-2025.08.26~ca266cc2-r1.post-install
OK: 25.3 MiB in 161 packages

安裝完成後,記得要 重啟路由器
不然新的選單不會出現。

LuCI 網頁管理做法

  1. 登入 LuCI,進入 System (系統) -> Software (軟體)
  2. 點擊 Update lists (更新清單)
  3. 在 Filter 搜尋 wpad
  4. 移除 wpad-basicwpad-basic-wolfsslwpad-mini (看你原本裝哪個)。
    • 注意:移除時 WiFi 會斷線,建議使用電腦接網路線操作,或者操作完後重啟路由器。
  5. 安裝 wpad (通常是指向 wpad-wolfsslwpad-openssl 的完整版)。
    • 推薦安裝 wpad-openssl (或 wpad-wolfssl)。
  6. 安裝完成後,記得要 重啟路由器
    不然新的選單不會出現。

第二步:設定 802.11r (Fast Transition)

現在進入 LuCI 設定漫遊參數。請在「主機」和「子機」的 2.4GHz5GHz 介面都要做一樣的設定。

  1. 進入 Network (網路) -> Wireless (無線)
  2. 對你的 SSID 點擊 Edit (編輯)
  3. 切換到 Wireless Security (無線安全) 分頁。
  4. 確認 Encryption (加密模式)WPA2-PSK (相容性最好) 或 WPA2/WPA3 Mixed(這邊要每台都一致)。

WLAN roaming 頁籤裡

設定以下參數:

  • 勾選 802.11r Fast Transition (啟用快速切換)。
    (Enables fast roaming among access points that belong to the same Mobility Domain)

  • Mobility Domain (行動網域): 輸入一個 4 位數的十六進位碼,例如 4f57
    (4-character hexadecimal ID)
    關鍵點: 主機和子機必須設定 完全一樣 的代碼。

  • Reassociation Deadline: 保持預設值 (通常是 1000) 即可。
    (time units (TUs / 1.024 ms) [1000-65535])

  • FT Protocol (FT 協議): 選擇 FT over the Air (相容性較佳)。

  • 勾選 Generate PMK locally (本地生成 PMK)
    (When using a PSK, the PMK can be automatically generated. When enabled, the R0/R1 key options below are not applied. Disable this to use the R0 and R1 key options.)
    說明:勾選後路由器會自動處理金鑰,不需要手動輸入繁瑣的 R0KH/R1KH 列表。

點擊 Save (儲存)


第三步:啟用 802.11k 與 802.11v (輔助漫遊)

這兩個標準能幫助手機「提早」知道何時該切換,以及該切換到哪裡,避免手機死抓著遠處的訊號不放。

file

在同一個 在 WLAN roaming 頁籤裡 頁面中:
(需安裝完整版 wpad 才會出現這些選項)

802.11k (RRM) 的部分

  • 勾選 802.11k RRM
    (Radio Resource Measurement – Sends beacons to assist roaming. Not all clients support this.)
  • 勾選 Neighbour Report (預設會勾)
    (802.11k: Enable neighbor report via radio measurements.)
  • 勾選 Beacon Report (預設會勾)
    (802.11k: Enable beacon report via radio measurements.)

802.11v (WNM/BSS Transition) 的部分

  • (選填)勾選 WNM Sleep Mode (省電功能)。
    (802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode for stations).)

  • 勾選 BSS Transition
    (802.11v: Basic Service Set (BSS) transition management.)

最後按 Save & Apply (儲存並套用)


第四步:檢查頻道與功率 (最佳化)

為了避免干擾並讓漫遊更順暢:

  1. 頻道 (Channel):

    • 主機與子機的 SSID、密碼、加密方式、Mobility Domain 都要一樣
    • 但是 頻道 (Channel) 建議錯開
    • 例如:主機 2.4G 設 Ch 1,子機 2.4G 設 Ch 6。主機 5G 設 Ch 36,子機 5G 設 Ch 44。
    • 原因:若頻道相同,重疊區域的訊號會互相干擾,反而影響漫遊體驗。
  2. 發射功率 (Transmit Power):

    • 不要盲目調到最大 (Max)。
    • 適度降低功率(例如設為 20dBm 或 auto),讓兩個 AP 的訊號覆蓋範圍有適當的重疊(約 15-20%),但不要重疊太多,這樣手機才會願意切換。

總結檢查清單

設定項目 主機 (Master) 子機 (Slave) 備註
軟體套件 wpad-wolfssl wpad-wolfssl 必須移除 basic 版,改安裝 full 版
SSID MyWiFi (範例) MyWiFi (範例) 必須相同
密碼 xxxxxxxx xxxxxxxx 必須相同
802.11r 啟用 啟用
Mobility Domain 4f57 (範例) 4f57 (範例) 必須相同
FT Protocol FT over the Air FT over the Air
頻道 (Channel) 1 (範例) 6 (範例) 建議不同

設定完成後,當你在兩個 AP 之間移動時,手機應該會顯示 WiFi 訊號滿格但不會斷線重連(不會出現 4G/5G 圖示),這就代表漫遊成功了。

若不換套件,只有 wpad-basic 套件能做到什麼程度?

簡單來說:只能做到「同名 WiFi」,無法做到「漫遊」。

如果你只保留預設的 wpad-basic,因為它閹割了 802.11r/k/v 協議的支援,你的網路狀況會變成這樣:

  1. 黏滯效應 (Sticky Client): 手機連著客廳的主機,當你走到臥室(子機旁)時,即使客廳訊號只剩一格、臥室訊號滿格,手機依然會死抓著客廳的訊號不放,直到完全斷線才會切換。
  2. 切換會斷線: 當手機終於決定切換時,因為沒有 802.11r 的快速握手協議,手機必須重新執行完整的 4 次握手驗證。這會導致 3~5 秒的網路中斷(Line 通話會斷掉、遊戲會掉線、影片會轉圈圈)。
  3. 若不換 wpad 完整版,你設定相同的 SSID 意義不大,體驗會很差。強烈建議一定要更換。

Troubleshooting:如果路由器無法上網更新套件

如果你的 AP 路由器的症狀是「下面連接的電腦能上網(因為封包透過 Switch 直接轉發給主機),但路由器自己不能上網」。
這是因為你的 缺了「閘道器 (Gateway)」和「DNS」的設定

因為你是用 LAN 接 LAN,OpenWrt 預設認為 LAN 是內部網路,通常不會去設定 Gateway。
你必須手動告訴 AP 路由器:「如果要下載軟體,請找主機幫忙。」

假設你的 主機 (Main Router) 的 LAN IP 是 192.168.1.1

修改子機的 LAN 設定

  1. 登入子機的 LuCI。

  2. 進入 Network (網路) -> Interfaces (介面)

  3. 找到 LAN,點擊 Edit (編輯)

  4. General Settings (一般設定) 頁面中,確認以下設定:

    • IPv4 address (IPv4 位址): 應該已經設為固定 IP (例如 192.168.1.2),這是正確的,不要動它
    • IPv4 gateway (IPv4 閘道器): 這裡目前應該是空的,請填入主機 IP (例如 192.168.1.1)。
    • IPv4 broadcast (IPv4 廣播): 留空即可。
    • Use custom DNS servers (使用自訂 DNS 伺服器): 這裡也很重要。請填入主機 IP (192.168.1.1) 或者 Google DNS (8.8.8.8)。
    • 如果不填 DNS,路由器雖然連得到網路,但無法解析 downloads.openwrt.org 的網址,一樣無法安裝軟體。
  5. (選用檢查) 往下滑到 DHCP Server,確認它是勾選 Ignore interface (忽略介面/停用)

  6. 點擊 Save (儲存)

套用並測試

  1. 點擊右上角的 Save & Apply (儲存並套用)
    • 注意:如果你的子機 IP 和電腦不在同網段,改完可能會連不上管理頁面,請確保電腦 IP 是自動取得或手動設為同網段。
  2. 進入 Network -> Diagnostics (診斷)
  3. 點擊 Ping (預設是 openwrt.org)。
  4. 如果有看到類似 64 bytes from ... 的回應,代表子機已經可以自己上網了!

Troubleshooting:如果路由器跳出 SSL verify error

如果你的 AP 路由器跳出這個錯誤:

SSL verify error: unknown error

這個錯誤在 OpenWrt 的子機(AP 模式)上非常常見。

這通常不是網路不通,而是因為路由器的 「系統時間」跑掉了

原因說明

OpenWrt 路由器通常沒有內建電池,斷電重啟後時間會重置(例如回到 2018 年或 1970 年)。
當你執行 opkg update 時,系統會檢查軟體源伺服器的 SSL 安全憑證。但憑證都有「有效期限」,
如果你的路由器認為現在是 1970 年,它會判定伺服器的憑證「尚未生效」,因此報錯並拒絕連線。

解決方式:透過 LuCI 同步瀏覽器時間

這是最快讓時間恢復正常的方法,不需要打指令。

  1. 登入子機的 LuCI 介面。
  2. 進入 System (系統) -> System (系統)
  3. 找到 System Properties (系統屬性) 區塊。
  4. 你會看到 Local Time (本地時間) 可能顯示一個舊的日期。
  5. 點擊旁邊的 Sync with browser (與瀏覽器同步) 按鈕。
  6. 確認時間變正確後,點擊 Save & Apply
  7. 再次嘗試執行 opkg update,應該就正常了。

解決方式:修正 NTP 設定

為了避免下次重開機又發生一樣的問題,你需要讓子機知道去哪裡自動對時。

  1. 進入 System (系統) -> System (系統) -> Time Synchronization (時間同步)
  2. 勾選 Enable NTP client (啟用 NTP 客戶端)
  3. NTP server candidates (NTP 伺服器候選):
    • 因為 DNS 可能還沒完全穩,建議加入你的 主機 IP (例如 192.168.1.1) 作為第一順位 (前提是主機有開 NTP 服務,OpenWrt 主機預設都有開)。
    • 或者加入 Google 的 NTP IP:216.239.35.0

參考資料

https://openwrt.org/docs/guide-user/network/wifi/roaming

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *