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 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.
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
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 está buscando.netsh interface ip show config
para 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 #2
se 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:
¡Buena suerte!
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).
gris azulado