与常见的Wi-Fi热点共享相比,USB RNDIS共享有几个独特优势:
注意:不同品牌手机甚至不同系统版本,其RNDIS实现和DHCP行为可能有细微差别。例如,早期一些MIUI版本分配的网段是192.168.42.0/24,而华为EMUI可能使用其他网段。了解这一点对后续手动配置IP有帮助。
2. 前期准备:硬件、软件与手机端设置
成功的部署始于充分的准备。你需要确认以下几个环节都已就绪。
2.1 硬件清单与兼容性确认
请准备好以下硬件:
首先,通过SSH登录到你的OpenWrt设备,检查USB主机控制器是否正常识别。运行以下命令:
lsusb
如果看到类似下面的输出,说明USB基础功能正常:
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
接下来,在手机上操作。以常见的MIUI 14和原生Android 13为例,开启USB网络共享的路径如下:
MIUI (小米/红米):
进入 设置 -> 连接与共享。找到 USB网络共享 或 移动网络共享。将手机通过USB线连接到OpenWrt设备。此时该选项会从灰色变为可点击,打开开关。
原生Android / 类原生系统:
进入 设置 -> 网络和互联网 -> 热点和网络共享。开启 USB网络共享。
连接成功后,手机状态栏通常会显示一个USB图标或“正在共享网络”的提示。此时,回到OpenWrt的终端,再次运行lsusb,你应该能看到一个新的设备出现,例如:
Bus 001 Device 004: ID 2717:ff80 Xiaomi Inc. Mi/Redmi series (RNDIS)

这里的2717:ff80就是小米手机的VID和PID。记下这个信息,如果后续驱动加载有问题,可以用于针对性排查。
2.2 OpenWrt软件包安装:驱动与工具
OpenWrt官方固件为了保持精简,默认通常不包含RNDIS驱动。我们需要手动安装。首先更新软件包列表:
opkg update
接下来安装核心驱动包。对于绝大多数安卓手机,只需要安装以下两个包:
opkg install kmod-usb-net kmod-usb-net-rndis
安装完成后,建议也安装usbutils工具包,它包含lsusb命令,便于查看USB设备详情:
opkg install usbutils
为了应对更复杂的场景或未来可能使用其他类型的USB网卡(如4G上网棒),你也可以考虑一次性安装一组更全的USB网络驱动模块。下面这个组合提供了广泛的兼容性:
opkg install kmod-usb-net \
kmod-usb-net-rndis \
kmod-usb-net-cdc-ether \
kmod-usb-net-cdc-ncm \
kmod-usb-net-cdc-mbim \
usbutils
安装过程如果遇到内核版本不匹配的错误,可能是因为你安装的kmod包与当前运行的内核版本不一致。这时你需要寻找与你的OpenWrt固件版本和内核完全匹配的软件包,或者考虑重新编译固件时将这些模块直接集成进去。
安装成功后,无需重启,可以立即检查驱动是否加载以及接口是否出现:
# 检查rndis_host内核模块是否加载
lsmod | grep rndis
# 查看网络接口,寻找usb0
ifconfig -a
如果一切顺利,你应该能在ifconfig -a的输出中看到一个usb0接口,尽管它可能还没有IP地址(inet字段为空)。
3. 网络接口配置:从命令行到LUCI图形界面
驱动就位,接口出现,接下来就是让OpenWrt通过这个新接口上网。这里提供两种方法:纯命令行配置和LUCI网页界面配置。前者更底层、适合脚本化,后者更直观、适合新手。

3.1 方法一:命令行快速配置与测试
首先,我们手动启动usb0接口并尝试通过DHCP获取IP。这能快速验证手机到OpenWrt的链路是否通畅。
# 启动usb0接口
ip link set usb0 up
# 使用udhcpc(OpenWrt内置的DHCP客户端)获取IP
udhcpc -i usb0 -v
如果成功,你会看到类似下面的输出,表明已经从手机的DHCP服务器获得了IP地址(例如192.168.42.100)和网关信息:
udhcpc: started, v1.31.1
udhcpc: sending discover
udhcpc: sending select for 192.168.42.100
udhcpc: lease of 192.168.42.100 obtained, lease time 3600
udhcpc: setting default routers: 192.168.42.129
此时,再次运行ifconfig usb0,就能看到配置好的IP地址。你可以尝试ping一下网关(上面例子中是192.168.42.129)或外网地址(如114.114.114.114),测试基础连通性。
提示:如果udhcpc失败,可能是手机没有正确提供DHCP服务。可以尝试为usb0手动设置一个静态IP,必须与手机RNDIS服务的网段在同一子网。例如,如果手机端是192.168.42.129/24,可以执行:ifconfig usb0 192.168.42.100 netmask 255.255.255.0 up,然后设置路由:route add default gw 192.168.42.129。
临时测试成功后,我们需要将配置固化到OpenWrt的网络系统中。使用uci命令修改配置文件:
# 创建一个新的接口配置,命名为'mobile_wan'(名字可自定)
uci set network.mobile_wan=interface
uci set network.mobile_wan.proto='dhcp'
uci set network.mobile_wan.ifname='usb0'
# 将该接口添加到防火墙的WAN区域
uci add_list firewall.@zone[1].network='mobile_wan'
# 注意:firewall.@zone[1]通常对应WAN区,如果不确定,可用`uci show firewall`查看
# 提交更改
uci commit network
uci commit firewall
# 重启网络服务使配置生效
/etc/init.d/network restart
3.2 方法二:LUCI网页界面可视化配置
对于不习惯命令行的用户,OpenWrt的LUCI管理界面提供了更友好的配置方式。
登录LUCI:在浏览器中输入OpenWrt设备的IP地址(通常是192.168.1.1),使用用户名和密码登录。进入网络接口:点击顶部菜单 网络 -> 接口。添加新接口:点击页面下方的 添加新接口 按钮。配置接口参数:防火墙设置:在新接口的配置页面,进入 防火墙设置 选项卡,将其分配到 wan 区域。这是关键一步,否则流量无法正确转发。保存并应用:点击 保存&应用。
为了让你更清晰地了解不同配置方式的差异和最终效果,可以参考下表:
配置项目命令行配置 (uci)LUCI界面配置最终配置文件 (/etc/config/network)
接口定义
uci set network.mobile_wan=interface
点击“添加新接口”并命名

config interface 'mobile_wan'
协议类型
uci set network.mobile_wan.proto='dhcp'
下拉选择“DHCP客户端”
option proto 'dhcp'
物理接口
uci set network.mobile_wan.ifname='usb0'
在设备列表勾选“usb0”
option ifname 'usb0'
防火墙区域
uci add_list firewall.@zone.network...
在接口页的防火墙标签选择“wan”
在 /etc/config/firewall 中关联
生效方式
uci commit; /etc/init.d/network restart
点击“保存&应用”

修改后需重启网络或相关服务
配置完成后,回到LUCI的“接口”总览页面,你应该能看到新建的 4G_Backup 接口,并且其状态应该显示为“已分配IP”和运行时间。此时,整个OpenWrt设备应该已经可以通过手机的4G/5G网络访问互联网了。你可以在LUCI的“状态”->“实时信息”中看到通过usb0接口的流量统计。
4. 高级调优与故障排查实战
基础功能实现后,我们可以进一步优化稳定性、实现自动切换,并解决一些常见问题。
4.1 负载均衡与故障转移(MWAN3)
如果你的OpenWrt设备有多个WAN口(例如,原有的有线宽带 + 现在的USB 4G备份),可以使用mwan3软件包实现负载均衡或故障转移。这样,当主宽带断开时,流量可以无缝切换到4G链路。
首先安装mwan3:
opkg update
opkg install luci-app-mwan3 mwan3
安装后,在LUCI界面会出现“网络”->“负载均衡”菜单。配置思路如下:
定义成员:为你的有线WAN(如eth0.2)和USB WAN(usb0)分别创建成员,设置不同的权重和跃点数。定义策略:创建策略,例如“主用有线,备用4G”。定义规则:根据目标IP或端口,将流量指向不同的策略。
一个简单的故障转移配置示例(在/etc/config/mwan3中):
config member 'wan_member_wired'
option interface 'wan'
option metric '10' # 优先级更高
config member 'wan_member_4g'
option interface '4G_Backup'
option metric '20'
config policy 'balanced_policy'
list use_member 'wan_member_wired'
list use_member 'wan_member_4g'
config rule 'default_rule'
option dest_ip '0.0.0.0/0'
option use_policy 'balanced_policy'
4.2 常见问题与解决方案
在实际操作中,你可能会遇到以下问题:
问题1:ifconfig -a 看不到 usb0 接口。
问题2:能获取IP,但无法ping通外网。
问题3:USB连接时断时续,网络不稳定。

问题4:手机锁屏或休眠后,网络断开。
4.3 自动化脚本与热插拔(hotplug)
为了让USB网络共享实现“即插即用”,我们可以利用OpenWrt的hotplug系统。当USB设备插入或移除时,系统会触发事件,我们可以编写脚本自动配置网络。
创建一个热插拔脚本:
cat > /etc/hotplug.d/usb/10-usb-net << 'EOF'
#!/bin/sh
# 当USB网络设备添加时执行
case "$ACTION" in
add)
# 等待接口稳定
sleep 2
# 启动接口并获取IP
ifup mobile_wan 2>/dev/null
logger -t USB-NET "USB network device added, interface brought up."
;;
remove)
# 当设备移除时,关闭接口
ifdown mobile_wan 2>/dev/null
logger -t USB-NET "USB network device removed, interface shut down."
;;
esac
EOF
chmod +x /etc/hotplug.d/usb/10-usb-net
这个简单的脚本会在USB设备插入时自动启用你之前配置好的mobile_wan接口。你可以根据需求,在其中加入更复杂的逻辑,比如检测到特定VID/PID的手机才执行操作。
5. 扩展应用:从应急备份到特定场景部署
掌握了核心技能后,这个方案可以衍生出多种有趣且实用的玩法。
场景一:户外移动办公/旅行热点将树莓派+旧手机+充电宝组合,放入一个小包,你就拥有了一个可移动的、能运行丰富服务(如内网穿透、文件共享、广告过滤)的智能热点。相比普通移动Wi-Fi,它的可定制性和功能强大得多。
场景二:网络质量补充与叠加在宽带信号不佳但手机信号满格的房间,用此方案将手机放在窗边,通过USB线连接室内的OpenWrt路由器,可以有效改善该区域的网络质量。甚至可以通过MWAN3,将宽带和4G流量叠加,提升总体带宽。
场景三:低成本物联网网关对于某些物联网项目,设备所在地可能只有蜂窝网络覆盖。利用一台旧手机和OpenWrt开发板(如联发科MT7688的小板),可以搭建一个极低成本的4G物联网网关,负责本地设备的数据汇聚和远程上传。
性能考量:USB 2.0的理论带宽是480Mbps,实际传输速率通常在200-300Mbps左右,这对于4G甚至5G网络(在理想条件下)的峰值速率来说是足够的瓶颈。但考虑到实际4G/5G基站共享和信号衰减,USB 2.0的带宽在绝大多数场景下都绰绰有余。如果你的手机和OpenWrt设备都支持USB 3.0,并使用对应的数据线和端口,可以获得更佳的吞吐量。
最后,关于编译固件。如果你经常使用此功能,为了省去每次安装驱动的麻烦,可以在自行编译OpenWrt固件时,直接在内核配置中选中相关模块。在make menuconfig中,路径大致是:
Kernel modules -> USB Support -> kmod-usb-net-rndis
将其编译进内核(*)或作为模块(M)。这样刷入的固件就天生支持RNDIS设备了。
折腾的过程难免会遇到几个坑,比如驱动不匹配、接口不启动、防火墙阻拦。但每解决一个问题,你对OpenWrt和Linux网络栈的理解就会加深一层。我自己的那套树莓派+旧小米手机的应急组合,已经稳定运行了大半年,期间经历了三次宽带故障,都做到了无缝切换,家人甚至没察觉到网络曾经断过。这种用极低成本换取高可靠性的满足感,或许就是开源和DIY最大的乐趣所在。




