跳至內容
Miles
返回

ASUS RT-BE58 Go 使用 iPhone USB 網路分享時,為什麼建議強制使用 USB 2.0?

本文記錄 ASUS RT-BE58 Go 搭配 iPhone USB 網路分享,也就是 USB Tethering 時,為什麼在某些情況下應該強制使用 USB 2.0,而不是 USB 3.x。

重點先講:

如果你的 RT-BE58 Go 使用 iPhone USB Tethering 時,USB 3.x 會出現 ipheth -75 / -EOVERFLOW,
那麼最實際的解法不是換更高級的 USB 3.x 線,而是強制走 USB 2.0。

另外,本文後面的 /jffs/scripts 自訂腳本依賴 Asuswrt-Merlin。


問題現象

在 ASUS RT-BE58 Go 上使用 iPhone USB 網路分享時,如果接在 USB 3.x 模式下,系統可能會在一段時間後出現網路卡死、斷線或無法繼續收封包的情況。

常見核心日誌如下:

kernel: ipheth 2-1:4.2: ipheth_rcvbulk_callback: urb status: -75

這個錯誤不是一般 TCP/IP 網路層問題,而是發生在 Linux 的 iPhone USB 網卡驅動 ipheth 收 USB bulk IN 資料時。

其中:

-75 = -EOVERFLOW

意思是 USB host 收到的資料量超過這次 URB 預期可接收的 buffer 大小,因此核心回報 overflow。


崩潰原因:不是單純線材壞掉,而是 USB 模式與舊版 ipheth 驅動不相容

RT-BE58 Go 這類路由器使用的 Linux kernel 與 ipheth 驅動通常不是最新主線版本。

在 Asuswrt-Merlin 3006.102.7_2 的 ipheth.c 裡,可以看到 IPHETH_BUF_SIZE 定義為 1514,IPHETH_IP_ALIGN 定義為 2,而 RX URB 實際提交時使用的接收長度是:

IPHETH_BUF_SIZE + IPHETH_IP_ALIGN

也就是大約 1.5KB 等級。

同一份 ipheth.c 裡的 ipheth_rcvbulk_callback(),也正是這類核心日誌的來源:

ipheth_rcvbulk_callback: urb status: -75

這代表目前這份驅動的接收假設比較接近傳統 Ethernet frame 的大小,而不是大型聚合封包。

問題在於,iPhone 在 USB 3.x / xHCI 環境下,可能採用更進階的 USB 網路封裝或較大的接收資料聚合方式。換句話說,iPhone 端可能不再只是送出單一小 Ethernet frame,而是把多個網路封包聚合後,一次透過 USB bulk 傳給 host。

這時候就會出現落差:

iPhone 實際送來的 USB bulk 資料量 > ipheth 這次 URB 準備好的接收 buffer

結果就是:

ipheth_rcvbulk_callback: urb status: -75

也就是 -EOVERFLOW。

更直白地說,這不是「網速太快」本身造成的問題,而是:

iPhone 在 USB 3.x 下使用的傳輸型態,超出了舊版 ipheth 驅動的接收假設。

為什麼強制使用 USB 2.0 會變穩?

強制使用 USB 2.0 的本質,是利用硬體層級的降級來避開軟體相容性問題。

需要注意一個精確用語:

USB 2.0 High-Speed bulk endpoint 的最大 packet size 是 512 bytes,但這不代表「一次 bulk transfer 只能傳 512 bytes」。實際上,一次 URB 仍然可以承載多個 USB transaction。

所以更準確的說法不是:

USB 2.0 限制 bulk transfer 最大只能 512 bytes

而是:

USB 2.0 的傳輸條件與裝置協商結果,可能使 iPhone 不啟用 USB 3.x 下較大的資料聚合或進階封裝行為。

因此,當我們把連線限制在 USB 2.0 模式時,iPhone 較可能走傳統、保守、舊版 ipheth 能處理的傳輸路徑。

結果就是:

避開 USB 3.x 下可能觸發的大封包 / 聚合封裝
降低 ipheth 接收 buffer overflow 機率
讓 USB Tethering 長時間運作更穩定

這是一個典型的 workaround:

不是修好 kernel driver,而是避開會觸發 bug 的條件。

USB 2.0 會不會影響效能?

多數情境下,不會成為主要瓶頸。

USB 2.0 的理論頻寬是:

480 Mbps

實際可用吞吐量會低於理論值,但對以下用途通常已經足夠:

真正需要在意的是穩定性。

對路由器來說,USB 3.x 模式如果會觸發 ipheth overflow,實務價值反而不如 USB 2.0。因為再高的理論頻寬,只要連線會卡死,就沒有意義。

結論:

與其追求 USB 3.x 的理論速度,不如使用 USB 2.0 換取長時間穩定。

建議結論

如果你的 RT-BE58 Go 使用 iPhone USB 網路分享時,USB 3.x 會出現:

ipheth_rcvbulk_callback: urb status: -75

那麼建議直接採用以下策略:

強制 iPhone USB Tethering 走 USB 2.0

這比修改 kernel、backport 新版 ipheth、重編韌體更實際。

原因很簡單:

維護成本低
風險低
可回復
穩定性高
不需要碰 kernel

ASUS RT-BE58 Go 設定筆記

前提:必須使用 Asuswrt-Merlin

以下設定依賴 Asuswrt-Merlin 的自訂腳本機制。

請先確認你已經使用:

Asuswrt-Merlin

而不是:

ASUS 官方原廠韌體

並且在管理介面啟用:

Administration > System > Enable JFFS custom scripts and configs

如果沒有啟用 JFFS 自訂腳本,/jffs/scripts/init-start、/jffs/scripts/nat-start 這類腳本不會在開機或 NAT 初始化時自動執行。


持久化 iPhone Trust / Pairing 資料

為什麼需要處理 /var/lib/lockdown?

iPhone 第一次透過 USB 連接路由器時,通常需要在 iPhone 上點選:

信任這部電腦?

Linux 端會把 iPhone 的 pairing record 存在:

/var/lib/lockdown

但在路由器系統上,/var/lib 很可能位於 RAM / tmpfs。也就是說,重開機後資料可能消失。

結果就是:

路由器重開機後,iPhone 可能又跳出「信任這部電腦?」提示

因此,我們可以把 /var/lib/lockdown 導向 JFFS 上的持久化目錄:

/jffs/ios-lockdown

這樣 pairing record 就可以跨重開機保留,避免 iPhone 一直反覆跳出是否信任此裝置的訊息。


/jffs/scripts/init-start

建立檔案:

vi /jffs/scripts/init-start

內容如下:

#!/bin/sh
sh /jffs/scripts/ios-lockdown-persist.sh

設定可執行權限:

chmod +x /jffs/scripts/init-start

/jffs/scripts/ios-lockdown-persist.sh

建立檔案:

vi /jffs/scripts/ios-lockdown-persist.sh

內容如下:

#!/bin/sh

PERSIST="/jffs/ios-lockdown"
RUNTIME="/var/lib/lockdown"

# Prefer the router admin username from NVRAM.
# If this does not work on your firmware, replace ADMIN manually.
ADMIN="$(nvram get http_username)"
[ -z "$ADMIN" ] && ADMIN="admin"

mkdir -p /var/lib "$PERSIST"

if [ -d "$RUNTIME" ] && [ ! -L "$RUNTIME" ]; then
    cp -p "$RUNTIME"/*.plist "$PERSIST"/ 2>/dev/null
    rm -rf "$RUNTIME"
fi

if [ -L "$RUNTIME" ]; then
    rm -f "$RUNTIME"
elif [ -e "$RUNTIME" ]; then
    rm -rf "$RUNTIME"
fi

ln -s "$PERSIST" "$RUNTIME"

chown "$ADMIN":root "$PERSIST" 2>/dev/null
chmod 2775 "$PERSIST" 2>/dev/null

chown "$ADMIN":root "$PERSIST"/*.plist 2>/dev/null
chmod 666 "$PERSIST"/*.plist 2>/dev/null

logger -t ios-lockdown "lockdown path linked to $PERSIST, owner=$ADMIN"

exit 0

設定可執行權限:

chmod +x /jffs/scripts/ios-lockdown-persist.sh

手動執行一次:

sh /jffs/scripts/ios-lockdown-persist.sh

檢查結果:

ls -l /var/lib/lockdown
ls -l /jffs/ios-lockdown

你應該會看到 /var/lib/lockdown 指向 /jffs/ios-lockdown。

如果你的韌體環境無法正確從 nvram get http_username 取得管理者帳號,可以把:

ADMIN="$(nvram get http_username)"
[ -z "$ADMIN" ] && ADMIN="admin"

改成:

ADMIN="你的路由器管理者帳號"

TTL 規則設定

重要提醒

TTL 規則不是用來修復 ipheth 的 -EOVERFLOW 問題。

這兩件事要分清楚:

USB 2.0 降級:用來規避 ipheth / USB 3.x 相容性問題
TTL 規則:用來調整路由器轉發封包出去時的 TTL 值

也就是說:

TTL=65 不會修好 USB 3.x 下的 ipheth overflow

如果你的問題是:

ipheth_rcvbulk_callback: urb status: -75

真正有效的 workaround 是 USB 2.0,而不是 TTL。

TTL 規則只應視為額外的路由行為調整。實際使用時,也需要自行確認電信業者合約與資費規範。


/jffs/scripts/nat-start

建立檔案:

vi /jffs/scripts/nat-start

內容如下:

#!/bin/sh

IFACE="$(nvram get wan0_ifname)"
[ -z "$IFACE" ] && IFACE="eth1"

logger -t ttl-fix "nat-start running, iface=$IFACE"

# Optional: try loading TTL-related modules
modprobe xt_HL 2>/dev/null
modprobe xt_hl 2>/dev/null
modprobe ipt_TTL 2>/dev/null
modprobe ipt_ttl 2>/dev/null

# Remove all duplicate existing rules
while iptables -t mangle -D POSTROUTING -o "$IFACE" -j TTL --ttl-set 65 2>/dev/null; do
  :
done

# Add one clean rule
if iptables -t mangle -A POSTROUTING -o "$IFACE" -j TTL --ttl-set 65; then
  logger -t ttl-fix "TTL rule applied on $IFACE"
else
  logger -t ttl-fix "FAILED to apply TTL rule on $IFACE"
fi

設定可執行權限:

chmod +x /jffs/scripts/nat-start

手動執行一次:

sh /jffs/scripts/nat-start

確認規則:

iptables-save 2>/dev/null | grep -Ei 'ttl'

你應該會看到類似:

-A POSTROUTING -o eth1 -j TTL --ttl-set 65

如果要觀察規則命中數:

watch 'iptables -t mangle -vnL POSTROUTING --line-numbers'

建議的最終穩定方案

如果目標是讓 RT-BE58 Go 長時間穩定使用 iPhone USB 網路分享,建議採用以下組合:

1. 安裝 Asuswrt-Merlin
2. 啟用 JFFS custom scripts and configs
3. 強制 iPhone USB Tethering 使用 USB 2.0
4. 使用 ios-lockdown-persist.sh 持久化 /var/lib/lockdown pairing record
5. 視需求加入 TTL 規則
6. 長時間觀察 /tmp/syslog.log 是否還有 ipheth -75

其中最關鍵的是:

強制 USB 2.0

因為它直接避開 USB 3.x 下可能觸發 ipheth overflow 的條件。

而 ios-lockdown-persist.sh 的重點則是:

避免每次路由器重開機或重新掛載後,iPhone 又反覆跳出「信任這部電腦?」提示。

排錯指令整理

看 ipheth 錯誤

grep -Ei 'ipheth|urb status|EOVERFLOW' /tmp/syslog.log

看 TTL 相關 log

grep 'ttl' /tmp/syslog.log

看 TTL 規則

iptables-save 2>/dev/null | grep -Ei 'ttl'
iptables -t mangle -vnL POSTROUTING --line-numbers
watch 'iptables -t mangle -vnL POSTROUTING --line-numbers'

看 iPhone lockdown pairing record

ls -l /var/lib/lockdown
ls -l /jffs/ios-lockdown

看自訂腳本是否存在且可執行

ls -l /jffs/scripts/init-start
ls -l /jffs/scripts/nat-start
ls -l /jffs/scripts/ios-lockdown-persist.sh

看 WAN interface

nvram get wan0_ifname
ifconfig
ip link show 2>/dev/null

看 USB 裝置資訊

lsusb

如果系統有提供 lsusb -t,也可以檢查目前跑在 USB 2.0 還是 USB 3.x:

lsusb -t

總結

RT-BE58 Go 使用 iPhone USB Tethering 時,USB 3.x 可能觸發舊版 ipheth 驅動的接收 buffer overflow,典型錯誤是:

ipheth_rcvbulk_callback: urb status: -75

-75 代表 -EOVERFLOW,表示 USB host 收到的資料超過這次 URB buffer 能接收的大小。

最務實的解法不是硬改 kernel,也不是盲目更換高規格 USB 3.x 線材,而是反過來:

強制使用 USB 2.0

這會犧牲理論介面頻寬,但通常換來更高的長時間穩定性。

另外,若希望 iPhone 不要一直跳出「信任這部電腦?」提示,應該把 /var/lib/lockdown 的 pairing record 持久化到 /jffs/ios-lockdown。

整體來看,最合理的配置是:

USB 2.0 解決穩定性問題
ios-lockdown-persist.sh 解決 iPhone 信任狀態持久化問題
nat-start 裡的 TTL 規則則是額外的路由行為調整

對行動網路分享而言,穩定性比 USB 3.x 的理論頻寬更重要。只要 USB 2.0 的實際吞吐量足以覆蓋你的 4G / 5G 使用場景,它就是更合理的選擇。


參考資料


分享文章:

上一篇
用 iPhone 捷徑直接開啟中油 Pay 付款碼
下一篇
OKX 轉帳 USDT 至 Bybit:遺漏 TON Tag 的自助追回過程