¿Cómo se configura el paso de Internet (enlace inverso) en Linux?

19

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 estoy luchando por configurarlo en Ubuntu. Cuando me conecto y selecciono el acceso a Internet 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.

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

Respuestas:

11

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.

Entonces necesita 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 tiempo 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

Configura 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
gris azulado
fuente
2
Según la leyenda, puede simular la sincronización de HTC haciendo lo siguiente: En los teléfonos HTC, cuando conecta el usb y selecciona el acceso a Internet, espera la sincronización de HTC y se da por vencido. Está escuchando en el puerto 6000. Por lo tanto, solo necesita falsificar la sincronización de HTC con netcat. Intente 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/null el valor hexadecimal de 00 02 00 00es todo lo que está buscando.
geffchang
@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 las interfaces y luego netsh interface ip show config name="Local Area Connection #2"obtener solo esa interfaz, donde se Local Area Connection #2llama el nuevo adaptador. Puede cambiar el nombre de esto por conveniencia.
Sam Hasler
3

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
DaMs
fuente
0

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

Comentarios a la traducción:

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

¡Buena suerte!

no dormido
fuente
Gracias, pero hay una manera más fácil que unir las interfaces.
bluegray
0

Ok, esto es exactamente lo que hice, no se desea 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: ifconfig compruebe que también está en: arp

Descubrí que tenía que desconectar el dispositivo y luego enchufarlo nuevamente para que aparezca en arp, las cosas no funcionan correctamente si arp no muestra el dispositivo.

El dispositivo esperará a que HTC Sync le envíe un mensaje, por lo que debe burlarse del mensaje HTC Syncs:


#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 un poco de solución de pirateo 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 buscando 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 COMIENCE CON UN NÚMERO, de esa manera se ejecuta al final de todo.

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 'r,


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

Entonces necesitará dos archivos más, uno para encadenar el otro, ya que RUN desde udev bloqueará todo lo demás (¡aunque se ejecute por última vez!) ... 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

contactando 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

Espero tener una buena versión ordenada tan pronto como sea posible. (probablemente mañana).

usuario2330377
fuente
0

Para la conexión inversa USB con Android y Linux sin rooting, vea mi respuesta aquí

salutepc
fuente