19 votos

¿Cómo se configura el pass-through de internet (reverse-tether) en linux?

Tengo un HTC Desire S que tiene la opción de conectarse a través de usb, y utilizar la conexión a internet del ordenador. Esto funciona bien en Windows, pero estoy luchando para configurarlo en Ubuntu. Cuando me conecto y selecciono internet pass-through desde el menú usb, el dispositivo usb1 se crea y puedo hacer ping a su dirección ip. He probado varias configuraciones de iptables y la configuración de nat, pero no estoy seguro de si lo estoy haciendo bien, o si tiene que haber alguna configuración adicional...

Gracias por cualquier ayuda.

11voto

bluegray Puntos 161

Lo siguiente funciona durante un tiempo, pero sólo para el navegador.

Cuando conectes tu teléfono vía usb y elijas el paso a Internet, deberías obtener un nuevo dispositivo RNDIS (usb0 o usb1). Para ubuntu, edita /etc/network/interfaces y añade las siguientes líneas:

iface usb0 inet dhcp
iface usb1 inet dhcp

Esto asignará una IP automáticamente cuando se añada el dispositivo. Si no se asigna automáticamente una dirección de red a usb0 o usb1, hay que hacerlo manualmente.

Entonces tienes que configurar el NAT en tu ordenador linux. Algo así como:

sudo iptables -A POSTROUTING -t nat -j MASQUERADE
sudo echo 1 > /proc/sys/net/ipv4/ip_forward 

También necesitas un servidor DNS:

sudo apt-get install bind9

Esto funciona durante unos minutos, pero después de un tiempo el teléfono se rinde buscando HTC Sync y se desconecta.

Para teléfonos rooteados

Puedes conectarte permanentemente si tienes un teléfono rooteado (a mí me funcionó el fre3vo). Ejecuta lo siguiente con adb.

Habilitar el modo usb para la red y adb:

adb shell echo 6 > /sys/devices/platform/msm_hsusb/usb_function_switch

Asigna una IP al dispositivo usb0 en el teléfono:

adb shell ifconfig usb0 192.168.99.5 netmask 255.255.255.0 up

Añade una ruta por defecto. La IP debe ser la asignada a usb0 en linux:

adb shell route add default gw 192.168.99.1 dev usb0

Establezca el servidor DNS. Este es el servidor DNS abierto de google, pero puede ser la IP de tu ordenador linux si tienes un servidor DNS:

adb shell setprop net.dns1 8.8.8.8

2 votos

Según la leyenda, puedes falsificar la sincronización de HTC haciendo lo siguiente: En los teléfonos HTC, cuando conectas el usb y seleccionas el passthrough de internet, espera el HTC sync y se rinde. Está escuchando en el puerto 6000. Así que sólo tienes que falsificar HTC sync con netcat. Prueba esto en la línea de comandos: phoneip=$(arp -n | grep usb | awk '{print $1}') echo -n -e "\x00\x02\x00\x00" | nc $phoneip 6000 > /dev/null El valor hexadecimal de 00 02 00 00 es todo lo que busca.

0 votos

@geffchang, ¡Gracias! Para los usuarios de Windows, cuando el móvil está intentando conectarse a través del USB puedes ejecutar netsh interface ip show config para ver todos los nombres de las interfaces, y luego netsh interface ip show config name="Local Area Connection #2" para conseguir justo esa interfaz, donde Local Area Connection #2 es el nombre del nuevo adaptador. Puedes cambiarle el nombre para mayor comodidad.

3voto

DaMs Puntos 41

A hecho este pequeño bash para automatizar todo. Sólo tiene que conectar su teléfono en modo de carga a su ordenador y ejecutar este bash.

#!/bin/bash
/opt/android-sdk-update-manager/platform-tools/adb shell 'echo 6 > /sys/devices/platform/msm_hsusb/usb_function_switch'
sleep 1
/opt/android-sdk-update-manager/platform-tools/adb shell ifconfig usb0 192.168.99.5 netmask 255.255.255.0 up
sleep 1
/opt/android-sdk-update-manager/platform-tools/adb shell setprop net.dns1 8.8.8.8

get_ip ()
{
ifconfig usb0 | grep inet | awk '{print $2}' | sed 's/addr://' | grep .
}

echo "waiting for IP on computer usb0"
while [[ `get_ip` < 192 ]];do sleep 2; done
ip=`get_ip`
echo "IP adress is $ip "
/opt/android-sdk-update-manager/platform-tools/adb shell route add default gw $ip dev usb0
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

0voto

nonsleepr Puntos 326

Ya que no tengo acceso a la máquina Linux a mí mismo que no puedo probar esta solución, pero usted puede intentar los pasos descritos aquí (Google traducción de ruso).

Comentarios a la traducción:

  • "rutovanym" significa rooteado;
  • WB o BB significa Gran Hermano (de escritorio);
  • smarta es la abreviatura de "smartphone".

Buena suerte!

0 votos

Gracias, pero hay una forma más fácil que puentear las interfaces.

0voto

user2330377 Puntos 11

Ok, he aquí exactamente lo que hice, no rooting de HTC deseado:

Configuración de bind9 y NAT etc...

nota: 1: si usted acaba de hacer sudo echo 1 > /proc/sys/net/ipv4/ip_forward obtendrá un error de permisos, así que aquí tenéis una secuencia de comandos para el proceso de 2: puede hacer que iptables más específica acerca de cómo hace las cosas por agregar parámetros para dispositivos específicos.


cd ~
echo '!/bin/bash
apt-get install bind9
iptables -A POSTROUTING -t nat -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward' > setup_bind9_nat.sh

chmod +x setup_bind9_nat.sh
sudo ./setup_bind9_nat.sh

enchufe ahora en tu teléfono y selecciona "internet pase a través de"

espere a que el dispositivo aparece en: ifconfig verifique también en: arp

Me di cuenta de que tenía que desconectar el dispositivo, a continuación, vuelva a conectarlo para que aparezca en arp, las cosas no funcionan correctamente si arp no muestran el dispositivo.

El dispositivo, a continuación, se siente la espera de HTC Sync para enviar un mensaje de modo que usted tiene para burlarse de HTC Sincroniza mensaje:


#change this line to be more specific if you have more than one usb network device
phone_usb_device="usb"
get_ip ()
{
    arp -n | grep $phone_usb_device | awk '{print $1}'
}

#TODO: This needs a timeout and loop needs cleaning up, but works fine and borrowed from another post.
echo "waiting for IP on computer usb"
while [[ `get_ip` < 192 ]];do sleep 2; done
phoneip=`get_ip`
echo "IP adress is $phoneip "

echo -n -e "\x00\x02\x00\x00" | nc -q 2 $phoneip 6000 > /dev/null

Me pueden escribir una versión de esto usando D-Bus, para que la última parte se ejecuta automáticamente cuando el dispositivo está enchufado etc....

Ok aquí está mi trabajo en progreso, no pude encontrar nada "genéricos", en d-bus, así que optó por un poco de hack solución con udev.. Esto no es perfecta, por ejemplo, el comando se ejecuta dos veces, así que voy a ver si me puedes filtrar los parámetros de correlación un poco mejor, añadir también un tiempo de espera en el último guión, por si acaso y a ver si puedo cambiar de arp con algo un poco mejor, dicen buscar en /proc

aquí.s mi .reglas archivo de /etc/udev/reglas.d he creado


cat /etc/udev/rules.d/htc-desire.rules

Usted puede llamar cualquier cosa que te gusta, pero NO COMENZAR CON UN NÚMERO, de tal manera que se ejecute el último de todos.

Agregue lo siguiente al archivo como sudo utilizando un editor de estás choice, etc.....


#KERNEL=="usb?" or DRIVERS=="usb" not sure which is best, may need extra mode information too from usb device.
SUBSYSTEM=="net", DRIVERS=="usb", ATTRS{manufacturer}=="HTC", ATTRS{idProduct}=="0ffe", RUN+="/home/olli/chain_mock_htc_sync.sh $kernel"


Ubuntu is setup to create the file with the correct permissions already 


ls -lrt /etc/udev/rules.d/htc-desire.rules 
-rw-r--r-- 1 root root 248 Jun 26 22:09 htc-desire.rules

Básicamente, si usted no ve las 3 "r",


sudo chmod a+r /etc/udev/rules.d/htc-desire.rules 

Entonces tendrás dos archivos, uno para la cadena de la otra, ya que la EJECUCIÓN de la udev de bloquear todo lo demás (aunque se trate de ejecutar la última!!)...hmm... de todos modos:

He creado los archivos en mi directorio home, por ahora "/home/olli/" ... así que recuerda reemplazar '/home/olli/' poco con la dondequiera que usted cree los archivos:

así que para mí, cd de mi directorio home.


cd ~

crear un archivo llamado


chain_mock_htc_sync.sh

que contengan la siguiente:



#!/bin/bash
/home/olli/mock_htc_sync.sh "$1" &
exit

hacerlo ejecutable


chmod +x chain_mock_htc_sync.sh

crear otro archivo llamado


mock_htc_sync.sh

agrupa los siguientes


#!/bin/bash
#change this line to be more specific if you have more than one usb network device

phone_usb_device="$1"
get_ip ()
{
    arp -n | grep $phone_usb_device | awk '{print $1}'
}

#TODO: This needs a timeout and loop needs cleaning up, but works fine and borrowed from another post.
echo "waiting for IP on computer $phone_usb_device"
while [[ `get_ip`  /dev/null

Hacerlo ejecutable:


chmod +x mock_htc_sync.sh

Espero que debe tener una buena versión ordenada pronto como punto de venta. (probablemente mañana).

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X