Search This Blog

23 January 2012

Reverse USB Tethering

I decided to give reverse usb tethering a shot. I don't know which devices easily support this, but I assume you have to be root. In my particular case, I was using an ICS device.  These steps could easily screw up your existing cell routing - so make sure your willing to risk it.

Step 0: Make sure the device is booted and connected via USB

Step 1: Enable tethering on the device side
  • Go to Settings
  • Under the Wireless & Networks, click on More
  • Click on Tethering & portable hotspot
  • Enable USB Tethering
Step 2: Get the IP Address of the device
malachi@onyx:~$ adb shell
root@android:/ # netcfg
lo       UP                            0x00000049 00:00:00:00:00:00
dummy0   DOWN                            0x00000082 62:bc:02:e1:d5:ea
rmnet0   DOWN                            0x00000000 00:00:00:00:00:00
rmnet1   DOWN                            0x00000000 00:00:00:00:00:00
rmnet2   DOWN                            0x00000000 00:00:00:00:00:00
rmnet3   DOWN                            0x00000000 00:00:00:00:00:00
rmnet4   DOWN                            0x00000000 00:00:00:00:00:00
rmnet5   DOWN                            0x00000000 00:00:00:00:00:00
rmnet6   DOWN                            0x00000000 00:00:00:00:00:00
rmnet7   DOWN                            0x00000000 00:00:00:00:00:00
sit0     DOWN                            0x00000080 00:00:00:00:00:00
rndis0   UP                      0x00001043 da:02:11:22:14:af
Step 3: Get the matching IP Address of the workstation
malachi@onyx:~$ ifconfig -a usb0
usb0      Link encap:Ethernet  HWaddr e2:31:b5:d7:f3:7b 
          inet addr:  Bcast:  Mask:
          inet6 addr: fe80::e031:b5ff:fed7:f37b/64 Scope:Link
          RX packets:1990 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1188 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:181334 (181.3 KB)  TX bytes:657452 (657.4 KB)
Step 4: Ping the device from the workstation
malachi@onyx:~$ ping
PING ( 56(84) bytes of data.
64 bytes from icmp_req=1 ttl=64 time=1.01 ms
64 bytes from icmp_req=2 ttl=64 time=0.605 ms

Step 5: Ping the workstation from the device
root@android:/ # ping
PING ( 56(84) bytes of data.
64 bytes from icmp_seq=1 ttl=64 time=0.427 ms
64 bytes from icmp_seq=2 ttl=64 time=0.397 ms
Step 6: Add workstation as the default gateway for the device
root@android:/ # route add default gw dev rndis0
Step 7: Get a list of DNS servers from the workstation
malachi@onyx:~$ cat /etc/resolv.conf
Step 8: Add them to the device
root@android:/ # setprop net.dns1
root@android:/ # setprop net.dns2
Step 9: Setup forwarding from usb0 to eth1 on the workstation
[ most people probably use eth0. Just use ifconfig to check which one is active]

malachi@onyx:~$ sudo su - root
[sudo] password for malachi:
root@onyx:~# echo 1 > /proc/sys/net/ipv4/ip_forward
root@onyx:~# exit
malachi@onyx:~$ sudo iptables --flush -t nat
malachi@onyx:~$ sudo iptables --table nat --append POSTROUTING --out-interface eth1 -j MASQUERADE
malachi@onyx:~$ sudo iptables --append FORWARD --in-interface usb0 -j ACCEPT
Step 10: ping google ;)

malachi@onyx:~$ adb shell
root@android:/ # ping
PING ( 56(84) bytes of data.
64 bytes from ( icmp_seq=1 ttl=51 time=11.8 ms
64 bytes from ( icmp_seq=2 ttl=51 time=11.9 ms
And finally, check things like the Browser...


  1. note: by default, if you reboot the device and set it up again, the IP on usb0 will probably be different.

  2. Nice, thanks :) Do you know where the IP on usb0 on the device come from? Any way to manually set the IP?

  3. You can manually set it (like you would any linux box) but I didn't have any luck when I did that

  4. Same here, permission denied when using ifconfig so I guess one must root it :(

  5. It does not show the IP address of usb0 when i run this "ifconfig -a usb0". Any suggestions?

  6. Try just 'ifconfig -a' to see which interface it is. Might be usb1 or something else for your machine.

  7. Its showing usb0 only with no inet address. It shows up when i set it manually.
    Does the above method work if you set the usb0 interface manually?

  8. I wouldn't expect so, but I am not in a position to test it right now.

  9. Part of this will no longer work in Marshmallow since Google removed netcfg