Hotdry.

Article

Android RNDIS Gadget 模式:让无 WiFi 老旧设备通过 USB 共享手机网络

针对无无线网卡的老旧设备,详解 Android USB RNDIS gadget 模式的配置流程、驱动兼容性处理,以及反向代理与网络桥接的落地参数。

2026-05-25systems

问题背景:当设备只有网线口

实验室或家庭环境中常会遇到这样的场景:一台服役十年以上的工控机、树莓派 Zero 或老旧笔记本,没有内置 WiFi 模块,周围也没有可用的有线网络,但手头有一部 Android 手机可以上网。此时,利用 Android 的 USB RNDIS(Remote Network Driver Interface Specification)gadget 模式,将手机作为 USB 网卡为老旧设备提供网络连接,是一种零成本且稳定的解决方案。

RNDIS 是微软定义的 USB 网络设备协议,Android 从 2.2 Froyo 版本起原生支持通过 USB 共享移动数据。与 WiFi 热点相比,USB tethering 的功耗更低、连接更稳定,且不受无线信号干扰。对于没有无线网卡的老旧设备而言,这是获取网络访问的最直接途径。

RNDIS Gadget 模式的工作原理

当 Android 设备开启 USB 网络共享时,它会将自身配置为 USB gadget 模式下的 RNDIS 设备。此时手机对外呈现为一个 USB 以太网适配器,主机端会识别到一个新的网络接口。在 Linux 系统中通常显示为 usb0rndis0,Windows 则识别为 "Remote NDIS based Internet Sharing Device"。

这种模式的本质是:手机作为 USB device,通过 gadget 驱动模拟网卡功能,将移动数据连接桥接到 USB 总线。数据流向为:移动网络 → 手机协议栈 → RNDIS gadget 驱动 → USB 总线 → 主机网络栈。

主机端配置:Linux 系统

识别设备与接口命名

连接手机并开启 USB 网络共享后,使用 ip linkdmesg | tail 查看新接口。常见命名包括:

  • usb0:通用 USB 网络接口
  • rndis0:明确标识为 RNDIS 设备
  • enp0s26u1u2:systemd 可预测网络接口名

接口名称可能因 USB 端口不同而变化,建议通过 udev 规则创建固定别名。

udev 规则自动配置

创建 /etc/udev/rules.d/90-android-tethering.rules

ACTION=="add|remove", SUBSYSTEM=="net", ATTR{idVendor}=="18d1", ENV{ID_USB_DRIVER}=="rndis_host", SYMLINK+="android"

18d1 是 Google 的 USB VID,不同厂商需替换为对应值。使用 lsusbudevadm info /sys/class/net/<interface> 查询实际 VID。

systemd-networkd 自动获取 IP

创建 /etc/systemd/network/50-android-tethering.network

[Match]
Name=usb0
# 或使用 SYMLINK 别名
# Name=android

[Network]
DHCP=yes
DNSOverTLS=yes

启用并重启服务:

sudo systemctl enable --now systemd-networkd
sudo systemctl enable --now systemd-resolved

Android 默认通过 DHCP 分配 192.168.42.0/24 网段的地址,网关为 192.168.42.129192.168.42.1,具体取决于厂商实现。

手动配置(无 systemd 场景)

对于老旧 Linux 发行版或嵌入式系统:

# 启用接口
sudo ip link set usb0 up

# 通过 DHCP 获取地址
sudo dhclient usb0

# 或静态配置(需与手机网段匹配)
sudo ip addr add 192.168.42.10/24 dev usb0
sudo ip route add default via 192.168.42.1 dev usb0

Windows 与 macOS 兼容性

Windows 驱动

Windows 7 及以上版本内置 RNDIS 驱动,连接手机后自动识别为网络适配器。若出现驱动问题,可手动安装 "Remote NDIS based Internet Sharing Device" 驱动。

Windows 10/11 可能将 USB 设备识别为 "USB Ethernet/RNDIS Gadget",在网络适配器设置中可查看连接状态。

macOS 限制

macOS 对 RNDIS 的支持较为有限。较新版本(Catalina 及以后)通常能自动识别,但可能需要安装第三方驱动如 "HoRNDIS"。对于 Intel Mac,也可考虑使用 USB 转以太网适配器作为替代方案。

网络桥接与 NAT 配置

当需要让多台设备共享这条 USB 网络连接时,可在主机上配置 NAT 或桥接。

启用 IP 转发与 NAT

# 启用内核转发
sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1

# 配置 MASQUERADE(假设 usb0 为上行,eth0 为下行)
sudo iptables -t nat -A POSTROUTING -o usb0 -j MASQUERADE
sudo iptables -A FORWARD -i usb0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o usb0 -j ACCEPT

网桥模式(设备直连同一网段)

若希望下游设备与手机处于同一二层网络:

# 创建网桥
sudo ip link add name br0 type bridge
sudo ip link set eth0 master br0
sudo ip link set usb0 master br0
sudo ip link set br0 up

注意:部分 Android 设备可能不支持桥接模式,此时 NAT 方案更为可靠。

反向代理方案:无网卡设备的替代路径

对于完全没有网络接口的老旧设备(如某些嵌入式开发板),可通过 ADB forward 配合 SOCKS 代理实现网络访问。

方案一:ADB Port Forward + SOCKS

在 Android 端安装 Proxy Server 类应用(如 ProxyDroid、Socks Server),监听本地端口(如 1080):

# 主机端转发
adb forward tcp:1080 tcp:1080

# 配置浏览器/应用使用 localhost:1080 作为 SOCKS5 代理

方案二:gnirehtet 反向 tethering

gnirehtet 是专为 Android 设计的反向 tethering 工具,通过 ADB 将 PC 的网络共享给手机。但在特定场景下,也可配合端口转发实现双向通信。

# 安装 gnirehtet
# 启动反向 tethering
gnirehtet run

常见问题与排障

接口未出现

  1. 确认使用数据线而非充电线(部分廉价线仅支持充电)
  2. 尝试切换 USB 端口(USB 2.0/3.0 兼容性差异)
  3. 检查手机 USB 配置模式,部分设备需在开发者选项中启用 "USB 网络共享"
  4. 对于老旧 Android 设备,可能需要手动加载 g_ether 内核模块

有接口但无流量

  1. 检查 DHCP 是否成功获取地址:ip addr show usb0
  2. 确认 DNS 配置:cat /etc/resolv.conf
  3. 检查 iptables 规则是否阻止转发:sudo iptables -L -v -n
  4. 部分运营商可能限制 tethering,尝试修改 TTL:sudo iptables -t mangle -A POSTROUTING -j TTL --ttl-set 64

连接不稳定

  1. 禁用 USB 休眠:echo -1 | sudo tee /sys/bus/usb/devices/<device>/power/autosuspend
  2. 使用 screentmux 保持会话,避免因网络切换导致 SSH 断开
  3. 配置 watchdog 脚本监控连接状态,断线自动重连

总结

Android RNDIS gadget 模式为无 WiFi 的老旧设备提供了一条可靠的网络通道。核心配置要点包括:识别 USB VID 并配置 udev 规则实现接口稳定命名、通过 systemd-networkd 或 dhclient 自动获取 IP、根据场景选择 NAT 或桥接模式实现多设备共享。对于极端老旧设备,ADB forward 配合 SOCKS 代理是可行的 fallback 方案。

这一方案的优势在于硬件门槛低(仅需 USB 线)、配置标准化(RNDIS 为通用协议)、功耗可控(有线连接比 WiFi 热点省电约 30-40%)。在 IoT 设备维护、工控系统调试、老旧硬件复活等场景中具有实用价值。

资料来源

systems

内容声明:本文无广告投放、无付费植入。

如有事实性问题,欢迎发送勘误至 i@hotdrydog.com