Configurar el anclaje USB manualmente con root

He agotado los métodos documentados para habilitar mediante programación el anclaje USB :

  • El servicemétodo no funciona en mi teléfono (Samsung Note 4). Parece ser una especie de API protegida, y empujarla no adbtiene ningún efecto.

  • El shell inputmétodo no es aplicable, ya que requiere que el dispositivo esté desbloqueado, y no parece haber una forma de desbloquear de forma programática y no destructiva un dispositivo bloqueado con una huella digital.

Por lo tanto, estoy buscando lograr este objetivo "de la manera difícil", es decir, hacer todo lo que hace el espacio de usuario de Android cuando toca la casilla de verificación Anclaje USB.

Por lo que puedo decir, esto implica los siguientes pasos (la mayoría de los cuales serían similares a cómo lo haría en una máquina Linux):

  1. Establezca una conexión IP a la computadora host a través de USB. Esto implica poner USB en rndismodo, configurar rutas, asignar una IP, etc.

    Ya descubrí cómo lograr esto y publiqué la respuesta aquí .

  2. Inicie una dnsmasqinstancia para asignar una IP a la PC conectada a través de DHCP y reenviar solicitudes de DNS.

    Este paso no debería ser necesario si no necesita la detección del servidor DNS y asignar direcciones IP estáticas en las interfaces USB usted mismo.

  3. Habilite el reenvío de IP ( /proc/sys/net/ipv4/ip_forward).

  4. Configure iptablespara habilitar el reenvío/enmascaramiento.

  5. Actualice las tablas de enrutamiento para la contabilidad del tráfico.

Me las arreglé para escribir un montón de secuencias de comandos que replican exactamente los efectos visibles (descritos anteriormente) como los realiza el sistema operativo Android al habilitar la conexión USB a través de su interfaz de usuario. Para crear los scripts, registré el estado del sistema ( iptables -S, ip route show table all) con y sin anclaje, luego convertí las diferencias en comandos de shell para aplicar los cambios al sistema. Sin embargo, mis réplicas aún no son suficientes; alguna parte del sistema permanece sin configurar, lo que impide que pase el tráfico.

¿Alguien tiene alguna idea de lo que me podría estar perdiendo o de cómo puedo reducir/depurar el problema?

Respuestas (1)

Un amigo me hizo saber que hay más de una sysctlconfiguración para el reenvío (una global y una por interfaz, luego más para IPv6).

En mi teléfono, las configuraciones relevantes son:

vars=(
    net.ipv4.conf.all.accept_redirects=0
    net.ipv4.conf.all.forwarding=1
    net.ipv4.conf.default.forwarding=1
    net.ipv4.conf.ip6tnl0.forwarding=1
    net.ipv4.conf.lo.forwarding=1
    net.ipv4.conf.p2p0.forwarding=1
    net.ipv4.conf.rmnet0.forwarding=1
    net.ipv4.conf.rmnet1.forwarding=1
    net.ipv4.conf.rmnet2.forwarding=1
    net.ipv4.conf.rmnet3.forwarding=1
    net.ipv4.conf.rmnet4.forwarding=1
    net.ipv4.conf.rndis0.forwarding=1
    net.ipv4.conf.sit0.forwarding=1
    net.ipv4.conf.wlan0.forwarding=1
    net.ipv4.ip_forward=1
    net.ipv6.conf.all.forwarding=2
    net.ipv6.conf.all.proxy_ndp=2
    net.ipv6.conf.default.forwarding=2
    net.ipv6.conf.ip6tnl0.forwarding=2
    net.ipv6.conf.lo.forwarding=2
    net.ipv6.conf.p2p0.forwarding=2
    net.ipv6.conf.rmnet0.forwarding=2
    net.ipv6.conf.rmnet1.forwarding=2
    net.ipv6.conf.rmnet2.forwarding=2
    net.ipv6.conf.rmnet3.forwarding=2
    net.ipv6.conf.rmnet4.forwarding=2
    net.ipv6.conf.rndis0.forwarding=2
    net.ipv6.conf.sit0.forwarding=2
    net.ipv6.conf.wlan0.forwarding=2
) ; sysctl "${vars[@]}"

¡Con estos y los otros, el reenvío y la conexión funcionan!