本文記錄 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
實際可用吞吐量會低於理論值,但對以下用途通常已經足夠:
- 4G / 5G 行動網路分享
- 家用路由器 WAN 備援
- 外出臨時網路
- SSH / 遠端維護
- 一般瀏覽、串流、下載
真正需要在意的是穩定性。
對路由器來說,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 使用場景,它就是更合理的選擇。