Reverse tethering como tener internet en tu móvil android a través de tu pc de escritorio via usb

Con la llegada de android 2.2 froyo y su tethering oficial a través de usb o wifi se ha echo muy popular poder compartir la conexión 3G de los móviles con android
hoy les traigo algo opuesto, como poder tener conexión en el teléfono a través de usb, resulta que tengo un htc g1 con android 2.1 (probé tambien la 2.2 pero no me funcionaba el gps)
tengo en el trabajo conexión por cable, no hay wifi entonces me vi obligado a intentar darle conexión por USB a mi G1, lo que hice es lo siguiente:

Requisitos:
android rooteado
alguna aplicación para hacer tethering USB
android eclair 2.1 (cyanogen mod 5) y froyo 2.2 tienen ya estas características.
GNU/Linux por supuesto (en windows no se si funcione me da igual)

Lo e probado en Debian Squeeze (testing) con Gnome debe funcionar tambien en otros escritorios com kde
conectar el móvil con USB

Habilitar el tethering USB ahí veremos que nuestro Networkmanager detecta el teléfono y creo una nueva interfaz de red llamada usb0

conexion usb htc g1
Podemos ver la interfaz y su dirección ip con ifconfig como root

root@deb-tonny:~# ifconfig 
eth0      Link encap:Ethernet  HWaddr 00:23:24:03:a4:99  
          inet addr:172.16.9.1  Bcast:172.16.15.255  Mask:255.255.248.0
          inet6 addr: fe80::223:24ff:fe03:a499/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:25548582 errors:0 dropped:0 overruns:0 frame:0
          TX packets:12884943 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:38066518704 (35.4 GiB)  TX bytes:893259029 (851.8 MiB)
          Memory:f0500000-f0520000 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:3855 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3855 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:614719 (600.3 KiB)  TX bytes:614719 (600.3 KiB)

usb0      Link encap:Ethernet  HWaddr 6e:e0:ea:5b:14:c5  
          inet addr:192.168.77.128  Bcast:192.168.77.255  Mask:255.255.255.0
          inet6 addr: fe80::6ce0:eaff:fe5b:14c5/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:9 errors:0 dropped:0 overruns:0 frame:0
          TX packets:103 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:880 (880.0 B)  TX bytes:27201 (26.5 KiB)

Al final se puede observar usb0 con la ip 192.168.77.128
vamos al teléfono y abrimos un terminal como root y escribimos el comando netcfg
 
$su
#netcfg
lo        UP         127.0.0.1          255.0.0.0                 0x00000049
dummy0    DOWN       0.0.0.0            0.0.0.0                   0x00000082
rmnet0    DOWN       0.0.0.0            0.0.0.0                   0x00001002
rmnet1    DOWN       0.0.0.0            0.0.0.0                   0x00001002
rmnet2    DOWN       0.0.0.0            0.0.0.0                   0x00001002
usb0      UP         0.0.0.0            0.0.0.0                   0x00001043
tether    UP         192.168.77.254     255.255.255.0             0x00001043

Si observan ahí están las interfaces de red que tiene nuestro móvil android, específicamente la interfaz tether tiene ya una ip en el mismo rango que nuestar pc es decir podemos hacer un ping desde y hacia el dispositivo, recomiendo la opcion -c de ping para q no se quede haciendo pings sin terminar

Ping desde el PC al móvil

root@deb-tonny:~# ping -c 3 192.168.77.254
PING 192.168.77.254 (192.168.77.254) 56(84) bytes of data.
64 bytes from 192.168.77.254: icmp_req=1 ttl=64 time=0.785 ms
64 bytes from 192.168.77.254: icmp_req=2 ttl=64 time=0.675 ms
64 bytes from 192.168.77.254: icmp_req=3 ttl=64 time=0.675 ms

--- 192.168.77.254 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.675/0.711/0.785/0.060 ms

De igual manera podrán hacer desde el terminal al PC
ahora nos toca agregar en el móvil como puerta de enlace la ip de nuestra máquina que es 192.168.77.128
con este comando

route add default gw 192.168.77.128 dev tether

Ahora nos falta solo compartir la conexión de internet desde nuestar pc
es decir darle acceso a usb0 para que pueda salir a internet por eth0
esto lo hacemos con iptables en nuestro PC

iptables -F
iptables -t nat -F
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -A FORWARD -s 192.168.77.0/0 -i usb0 -p tcp --dport 80 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -s 172.16.77.254 -j MASQUERADE

Podrían grabar en un archivo y ejecutar como script es mas cómodo
lo anterior sirve no solo para el móvil sino también para que otras maquinas puedan compartir la conexiion de internet.

Ahora si vamos al móvil tendremos ya navegación a través de nuestra red local.