问题背景:当设备只有网线口
实验室或家庭环境中常会遇到这样的场景:一台服役十年以上的工控机、树莓派 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 系统中通常显示为 usb0 或 rndis0,Windows 则识别为 "Remote NDIS based Internet Sharing Device"。
这种模式的本质是:手机作为 USB device,通过 gadget 驱动模拟网卡功能,将移动数据连接桥接到 USB 总线。数据流向为:移动网络 → 手机协议栈 → RNDIS gadget 驱动 → USB 总线 → 主机网络栈。
主机端配置:Linux 系统
识别设备与接口命名
连接手机并开启 USB 网络共享后,使用 ip link 或 dmesg | 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,不同厂商需替换为对应值。使用 lsusb 或 udevadm 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.129 或 192.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
常见问题与排障
接口未出现
- 确认使用数据线而非充电线(部分廉价线仅支持充电)
- 尝试切换 USB 端口(USB 2.0/3.0 兼容性差异)
- 检查手机 USB 配置模式,部分设备需在开发者选项中启用 "USB 网络共享"
- 对于老旧 Android 设备,可能需要手动加载
g_ether内核模块
有接口但无流量
- 检查 DHCP 是否成功获取地址:
ip addr show usb0 - 确认 DNS 配置:
cat /etc/resolv.conf - 检查 iptables 规则是否阻止转发:
sudo iptables -L -v -n - 部分运营商可能限制 tethering,尝试修改 TTL:
sudo iptables -t mangle -A POSTROUTING -j TTL --ttl-set 64
连接不稳定
- 禁用 USB 休眠:
echo -1 | sudo tee /sys/bus/usb/devices/<device>/power/autosuspend - 使用
screen或tmux保持会话,避免因网络切换导致 SSH 断开 - 配置 watchdog 脚本监控连接状态,断线自动重连
总结
Android RNDIS gadget 模式为无 WiFi 的老旧设备提供了一条可靠的网络通道。核心配置要点包括:识别 USB VID 并配置 udev 规则实现接口稳定命名、通过 systemd-networkd 或 dhclient 自动获取 IP、根据场景选择 NAT 或桥接模式实现多设备共享。对于极端老旧设备,ADB forward 配合 SOCKS 代理是可行的 fallback 方案。
这一方案的优势在于硬件门槛低(仅需 USB 线)、配置标准化(RNDIS 为通用协议)、功耗可控(有线连接比 WiFi 热点省电约 30-40%)。在 IoT 设备维护、工控系统调试、老旧硬件复活等场景中具有实用价值。
资料来源
- ArchWiki - Android tethering: https://wiki.archlinux.org/title/Android_tethering
- RNDIS Host Driver Documentation: Linux kernel Documentation/usb/rndis_host.txt
内容声明:本文无广告投放、无付费植入。
如有事实性问题,欢迎发送勘误至 i@hotdrydog.com。