¿Cómo se configura el paso a través de Internet (anclaje inverso) en Linux?

Tengo un HTC Desire S que tiene la opción de conectarse a través de usb y usar la conexión a Internet de la computadora. Esto funciona bien en Windows, pero tengo problemas para configurarlo en Ubuntu. Cuando me conecto y selecciono Internet pass-through desde el menú usb, se crea el dispositivo usb1 y puedo hacer ping a su dirección IP. Probé varias configuraciones de iptables y configuré nat, pero no estoy seguro de si lo estoy haciendo bien o si es necesario que haya alguna configuración adicional...

Gracias por cualquier ayuda.

Lo hice funcionar usando una combinación de información de trac.osuosl.org/trac/replicant/wiki/ReplicantUSBNetworking y translate.googleusercontent.com/… . Responda abajo.

Respuestas (4)

Lo siguiente funciona por un tiempo, pero solo para el navegador.

Cuando conecta su teléfono a través de USB y elige la transferencia de Internet, debe obtener un nuevo dispositivo RNDIS (usb0 o usb1). Para ubuntu, edite /etc/network/interfaces y agregue las siguientes líneas:

iface usb0 inet dhcp
iface usb1 inet dhcp

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

Luego, debe configurar NAT en su computadora Linux. Algo como:

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

También necesita un servidor DNS:

sudo apt-get install bind9

Esto funciona durante unos minutos, pero después de un rato el teléfono deja de buscar HTC Sync y se desconecta.

Para teléfonos rooteados

Puede conectarse permanentemente si tiene un teléfono rooteado (fre3vo funcionó para mí). Ejecute lo siguiente con adb.

Habilite el modo usb para red y adb:

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

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

adb shell ifconfig usb0 192.168.99.5 netmask 255.255.255.0 up

Agregar una ruta predeterminada. La IP debe ser la IP asignada a usb0 en linux:

adb shell route add default gw 192.168.99.1 dev usb0

Configure el servidor DNS. Este es el servidor DNS abierto de Google, pero puede ser la IP de su computadora Linux si tiene un servidor DNS:

adb shell setprop net.dns1 8.8.8.8
Según la leyenda, puede falsificar la sincronización de HTC haciendo lo siguiente: en los teléfonos HTC, cuando conecta el USB y selecciona el paso a través de Internet, espera la sincronización de HTC y se da por vencido. Está escuchando en el puerto 6000. Por lo tanto, solo necesita sincronizar HTC con netcat. Pruebe esto en la línea de comando: phoneip=$(arp -n | grep usb | awk '{print $1}') echo -n -e "\x00\x02\x00\x00" | nc $phoneip 6000 > /dev/nullel valor hexadecimal de 00 02 00 00es todo lo que está buscando.
@geffchang, ¡Gracias! Para los usuarios de Windows, cuando el dispositivo móvil intenta conectarse a través del USB, puede ejecutar netsh interface ip show configpara ver todos los nombres de la interfaz y luego netsh interface ip show config name="Local Area Connection #2"obtener solo esa interfaz, donde Local Area Connection #2se llama el nuevo adaptador. Puede cambiar el nombre de esto para su comodidad.

A hizo esta pequeña fiesta para automatizar todo. Simplemente conecte su teléfono en modo de carga a su computadora y ejecute 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

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

Comentarios a la traducción:

  • "rutovanym" significa enraizado;
  • WB o BB significa Gran Hermano (escritorio);
  • smarta es la abreviatura de "teléfono inteligente".

¡Buena suerte!

Gracias, pero hay una manera más fácil que unir las interfaces.

Ok, esto es exactamente lo que hice, no deseaba rootear HTC:

Configurar bind9 y NAT, etc...

nota: 1: si solo hace sudo echo 1 > /proc/sys/net/ipv4/ip_forward obtendrá un error de permisos, así que aquí hay un script para el proceso 2: puede hacer que iptables sea más específico sobre cómo hace las cosas al 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

ahora conecte su teléfono y seleccione 'internet pass through'

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

Descubrí que tenía que desconectar el dispositivo y luego volver a conectarlo para que apareciera en arp, las cosas no funcionan correctamente si arp no muestra el dispositivo.

Luego, el dispositivo esperará a que HTC Sync le envíe un mensaje, por lo que debe simular el mensaje de HTC Sync:


#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

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

Ok, aquí está mi trabajo en progreso, no pude encontrar nada 'genérico' en d-bus, así que opté por una solución un poco pirateada usando udev. Esto no es perfecto, por ejemplo, el comando se ejecuta dos veces, así que Tendré que ver si puedo filtrar los parámetros coincidentes un poco mejor, también agregar un tiempo de espera en el último script, por si acaso y ver si puedo reemplazar arp con algo un poco mejor, digamos mirando en /proc

aquí está mi archivo .rules de /etc/udev/rules.d que creé


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

Puedes llamarlo como quieras, pero NO LO COMIENCES CON UN NÚMERO, de esa manera se ejecuta en último lugar.

Agregue lo siguiente al archivo como sudo usando un editor de su elección, 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 no ves esas 3 erres,


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

Luego, necesitará dos archivos más, uno para encadenar al otro, ya que RUN desde udev bloqueará todo lo demás (¡aunque se ejecute al final!) ... hmm ... de todos modos:

Creé los archivos en mi directorio de inicio por ahora "/home/olli/" ... así que recuerde reemplazar el bit '/home/olli/' con el lugar donde cree los archivos:

así que para mí, cd a mi directorio de inicio.


cd ~

crear un archivo llamado


chain_mock_htc_sync.sh

que contiene lo siguiente:



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

hazlo ejecutable


chmod +x chain_mock_htc_sync.sh

crear otro archivo llamado


mock_htc_sync.sh

que contiene lo siguiente


#!/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

Hazlo ejecutable:

chmod +x mock_htc_sync.sh

Con suerte, debería tener una buena versión ordenada tan pronto como sea posible. (probablemente mañana).