Fix USB Tethering Not Working on Linux (Phone to PC)
USB tethering from your phone to Linux fails most often due to missing rndis driver or udev rules. Here's how to fix it in 2 minutes.
Quick answer
Run sudo modprobe rndis_host then unplug and replug your phone. If that fails, check lsusb and dmesg for missing drivers. On Android, turn off USB tethering, then back on. On iPhone, install libimobiledevice.
Why this happens
USB tethering turns your phone into a network adapter. Linux sees it as a USB Ethernet gadget, usually showing up as usb0, enp0s20f0u2, or similar. The problem? Your kernel doesn't have the right driver loaded, or your udev rules don't give NetworkManager permission to manage it. I've seen this on Ubuntu 22.04, Fedora 38, and Arch Linux — it's not a distro issue, it's a driver/module issue. Android uses RNDIS. iPhones use a proprietary protocol that libimobiledevice handles. If you're on a fresh install or a minimal kernel (like Arch or Alpine), you're probably missing the module.
Step-by-step fix
- Plug in your phone and enable USB tethering. Go to Settings > Network & Internet > Hotspot & Tethering (Android) or Settings > Personal Hotspot (iPhone). Toggle it on.
- Check if Linux sees the device. Run
ip link showorifconfig -a. Look forusb0,enp*something, oreth1. If nothing appears, rundmesg -wand watch the output while you toggle tethering. You'll see something likerndis_host 1-2:1.0 usb0: register 'rndis_host' at usb-...— that's good. If you seeunknown control messageorfailed to bind, the driver's missing or wrong. - Load the RNDIS driver (Android). Run
sudo modprobe rndis_host. Then unplug and replug your phone. Checkip linkagain. Ifusb0shows up, you're golden. If you getmodprobe: FATAL: Module rndis_host not found, you need to install the kernel module package. On Ubuntu/Debian:sudo apt install linux-modules-extra-$(uname -r). On Fedora:sudo dnf install kernel-modules-extra. On Arch:sudo pacman -S linux-headersand rebuild your kernel modules if you're using a custom kernel. Reboot after install if it still fails. - For iPhone users. Install
libimobiledeviceandusbmuxd. On Ubuntu:sudo apt install libimobiledevice6 usbmuxd. On Fedora:sudo dnf install libimobiledevice usbmuxd. Then restart the service:sudo systemctl restart usbmuxd. Then toggle tethering on your phone. If you still see nothing, runidevicepair pairand trust the device on your phone. This step trips up a lot of people — you have to unlock your phone and tap "Trust" when prompted. - Bring up the interface. Once
usb0shows up, NetworkManager should auto-configure it. If not, runsudo dhclient usb0(orsudo dhcpcd usb0on Arch). You should get an IP in the 192.168.42.x range. If you're using NetworkManager, go to Settings > Network and you'll see a new wired connection called "USB Ethernet" or "RNDIS" — just enable it. - Set up udev rules (if it still doesn't work). This is rare but happens on some phones. Create a file
/etc/udev/rules.d/99-android.ruleswith this line:SUBSYSTEM=="net", ACTION=="add", ATTR{interface}=="rndis*", NAME="usb0". Then runsudo udevadm control --reload-rules && sudo udevadm trigger. Unplug and replug.
Alternative fixes if the main one fails
- Try a different USB port. Sounds dumb, but USB 3.0 ports sometimes have issues with RNDIS. Use a USB 2.0 port (black, not blue/red). I've fixed this on a Dell XPS 13 where the right-side USB-C port wouldn't tether but the left-side one worked.
- Disable USB debugging on Android. In Developer Options, toggle off USB Debugging. Some phones (OnePlus, Xiaomi) treat tethering as a debugging feature and block it.
- Use a different tethering mode. On Android, try turning off USB tethering, enable "Bluetooth tethering" first, then switch back to USB. Forces the phone to renegotiate the connection.
- Check firewall rules. If you get an IP but no internet, run
ping 8.8.8.8. If that works, it's DNS. Edit/etc/resolv.confand addnameserver 8.8.8.8. If ping fails, your phone might be sharing a different subnet. Checkip route— your default gateway should point to your phone's IP (usually 192.168.42.129). - Restart NetworkManager.
sudo systemctl restart NetworkManager. Sometimes the daemon gets confused and ignores new interfaces.
Prevention tip
If you tether often, make the modprobe and udev rule persistent. Add rndis_host to /etc/modules (Ubuntu/Debian) or /etc/modules-load.d/rndis.conf (others). That way it loads at boot. Also set up the udev rule I mentioned above — it's a one-time thing that'll save you headaches later. On Android, keep USB tethering enabled even when not in use — some phones forget the configuration after disconnecting.
Was this solution helpful?