4 votos

¿Cómo enviar todo el tráfico de Internet a un servidor proxy SOCKS5 en la red local?

Tengo la inspiración aquí . Parece que AFWall+ es capaz de crear una política de reenvío NAT para mantener todo el tráfico que pasa a través de un proxy SOCKS5 y hacer creer a las aplicaciones de Google que no están conectadas a través de una VPN (las aplicaciones de Google implementan medidas de seguridad adicionales cuando se conectan a través de VPNService y si estás en China no pasarás el control de seguridad - las solicitudes de control de seguridad no pasan por VPN, por lo que se EOF porque GFW matará estas solicitudes, leer más aquí ).

Así que mi pregunta es, si digamos que tengo un servidor socks5 funcionando en 192.168.1.1:1088 que hace un túnel de todas las conexiones a través de vmess protocolo (alias V2Ray ) a los servidores remotos en los EE.UU., ¿cómo creo mi guión personalizado? Lo he intentado:

IP6TABLES=/system/bin/ip6tables
IPTABLES=/system/bin/iptables
ULIMIT=/system/bin/ulimit
PORT=1088
SERVER=192.168.1.1
$ULIMIT -n 4096
$IP6TABLES -F
$IP6TABLES -A INPUT -j DROP
$IP6TABLES -A OUTPUT -j DROP
$IPTABLES -t nat -F OUTPUT
$IPTABLES -t nat -A OUTPUT -o lo -j RETURN
$IPTABLES -t nat -A OUTPUT -d 127.0.0.1 -j RETURN
$IPTABLES -t nat -A OUTPUT -p tcp --dport 53 -j DNAT --to-destination $SERVER:$PORT
$IPTABLES -t nat -A OUTPUT -p udp --dport 53 -j DNAT --to-destination $SERVER:$PORT
$IPTABLES -t nat -A OUTPUT -p tcp -j DNAT --to-destination $SERVER:$PORT
$IPTABLES -t nat -A OUTPUT -p udp -j DNAT --to-destination $SERVER:$PORT

Esto no funciona. Así que..:

  1. ¿Creé un guión equivocado? ¿Cómo creo un guión que hace lo que quiero hacer?
  2. ¿Hay otras configuraciones que debería habilitar primero? No marqué ninguna aplicación, así que asumo que eso significa que todas las aplicaciones pasan por un script personalizado, ¿cierto?

6voto

Jack Wade Puntos 231

El enlace que usted ha proporcionado no es la creación de SOCKS, sino un proxy transparente es decir, toma el tráfico TCP/UDP y SOCKSify antes de enviarla a través de shadowsocks túnel. Pero tienes que hacer que el tráfico SOCKS-aware antes de dirigirnos al representante de SOCKS. Configure las aplicaciones individuales (que tienen soporte incorporado para SOCKS) o aplique el proxy en todo el sistema de forma transparente (lo que está tratando de hacer).

LIMITACIONES DEL PROXY DE LOS CALCETINES:

Parece que AFWall+ es capaz de crear una política de reenvío de NAT

Los usos de AFWall+ iptables en la parte trasera y puede ejecutar tu guión en los cambios de la red. Hacer cumplir el proxy global es (al menos parcialmente) posible con proxificador aplicaciones como ProxyDroid (que es iptables -y SocksDroid (que está basado en VPN/enrutamiento). No tengo ninguna afiliación con ninguno de los dos.

Si se trabaja manualmente desde el CLI, se puede usar un sistema transparente Redireccionador de TCP/UDP al proxy como redsocks en combinación con iptables . shadowsocks proporciona su propia herramienta similar ( ss-redir ), también lo hace Tor.

No marqué ninguna aplicación, así que asumo que eso significa que todas las aplicaciones pasan por un guión personalizado, ¿verdad?

No. El problema con el iptables El enfoque es que el SOCKS5 es un protocolo de capa 5 en el modelo OSI. Así que no puede llevar todo el tráfico de todas las aplicaciones . La mayoría del tráfico generado por las aplicaciones es TCP que funciona bien con SOCKS y es fácil de configurar. Pero algunos juegos, aplicaciones VoIP y sobre todo el DNS tradicional generan UDP tráfico que no es soportado por muchos proxies SOCKS5. Por ejemplo. openssh y tor ambos no lo hacen, shadowsocks sin embargo tiene Asociado de UDP características. Pero no funciona con simple DNAT o REDIRECT (probablemente porque SO_ORIGINAL_DST no está disponible para los enchufes UDP, no conozco los detalles). Es posible que sólo se pueda redirigir el tráfico hacia un socket fijo (IP:PORT), por ejemplo, un servidor DNS o un servidor de juegos.

TPROXY es la alternativa aquí, pero el problema es que sólo funciona con PREROUTING es decir, el tráfico que viene del exterior, no el generado en el dispositivo. Así que tienes que hacer una configuración extra para enrutar tu tráfico en el dispositivo sin NATing hacia un servidor proxy local (normalmente una puerta de enlace por defecto) donde configurarás TPROXY .

¿Complicado? Es por eso que VPN es preferible. Incluso si necesitas usar un proxy para burlar los firewalls, el túnel VPN a través del proxy te ahorra las complejidades de la redirección del tráfico . La VPN opera a un nivel inferior en la pila de red (L2/L3 en OSI), por lo que transporta sin problemas todo el tráfico IP incluyendo los ecos ICMP ( ping ) etc. que no puede ser enviado a través de SOCKS. Otro punto a favor es que la VPN puede ser atravesada por un túnel proxies transparentes - como shapeshifter-dispatcher y stunnel - o proxies SOCKS que están destinados a sólo un puerto de reenvío - como obfs4proxy .

Si no reenvía un solo puerto (túnel), el SOCKS5 debe ser un proxy de nivel de aplicación es decir, debería ser capaz de reenviar puertos arbitrarios desde diferentes aplicaciones como lo hace el reenvío de puertos dinámicos SSH.

tun2socks es otro método de SOCKSificación que recoge el tráfico TCP/UDP en un tun (igual que una VPN, sin NAT) y lo reenvía a través de un proxy SOCKS. Recientemente añadió soporte de asociados UDP. Anteriormente se usaba UDP Gateway El método también funcionó bastante bien, pero requiere la ejecución de un demonio separado ( udpgw ) junto con el servidor proxy. tun2socks es un solución no-Root porque las aplicaciones, como SocksDroid y muchos otros cortafuegos, olfateadores, etc. - que usan este método se basan en las instalaciones de VPN de Android.

... y engañar a las aplicaciones de Google para que piensen que no están conectadas a través de una VPN (las aplicaciones de Google implementan medidas de seguridad adicionales cuando se conectan a través de VPNService ...

Con los dos métodos anteriores (VPN a través de túnel y Tun-to-SOCKS) no es necesario usar el Android VPNService API (si eso le causa problemas). En un dispositivo rooteado puedes obtener una estática openvpn o tun2socks binario y lo pasamos por el CLI. Eso es mucho menos complicado que establecer un proxy a través de iptables . En el caso anterior, sin embargo, necesitas un servidor VPN obviamente.

SOCKS TODO EL DISPOSITIVO:

Como no quieres ir con una solución basada en VPN/routing, aquí está lo simple iptables - el método basado en la tecnología.

Primero, consigue redsocks binario para la arquitectura de su dispositivo (o intente este para aarch64 o este para armeabi-v7a ). Crear un archivo de configuración:

// redsocks.conf

// general configuration
base {
    redirector = iptables;
}

// for TCP
redsocks {
    local_ip = "127.0.0.1"; local_port = "12345";
    ip = "192.168.1.1"; port = "1088"; type = socks5;
}

// for UDP, assuming your SOCKS5 proxy supports UDP associate
redudp {
    local_ip = "127.0.0.1"; local_port = "12345";
    ip = "192.168.1.1"; port = "1088";
    dest_ip = "1.1.1.1"; dest_port = "53";  /* set whatever DNS server */
}

* Ver ejemplo de redsocks.conf para detalles y más opciones.

Corre:

#!/system/bin/sh

IPTABLES="/system/bin/iptables -w5 -t nat"

# create new chain
$IPTABLES -N PROXY
$IPTABLES -I OUTPUT -j PROXY

# exclude local traffic, see: http://manpages.org/ss-redir
$IPTABLES -A PROXY -d 127.0.0.0/8 -j RETURN
$IPTABLES -A PROXY -d 192.168.0.0/16 -j RETURN

# socksify whole TCP traffic
$IPTABLES -A PROXY -p tcp -j DNAT --to 127.0.0.1:12345

# socksify only DNS UDP traffic
$IPTABLES -A PROXY -p udp --dport 53 -j DNAT --to 127.0.0.1:12345

echo "Ctrl^C to exit."
trap "$IPTABLES -D OUTPUT -j PROXY; $IPTABLES -F PROXY; $IPTABLES -X PROXY" EXIT

# run socksifier
redsocks -c /path/to/redsocks.conf

Puedes añadir la costumbre iptables guión de AFWall+. redsocks puede ser ejecutado como init con un UID no ROTATIVO, capacidades abandonadas y un contexto SELinux restringido. Véase ¿Cómo se ejecuta un ejecutable en el arranque?


RELACIONADO:

0 votos

Tu solución de redsocks + iptables funcionó pero tuve que corregir varias cosas para usar el proxy SOCKS de Dante en Anbox. Para el primer comando iptables, obtuve el error unknown option "-w5" . Añadir un espacio antes del número no solucionó el problema. Anbox utilizó Android 7 (x86) con iptables v1.4.20 y el parámetro -w no aceptó ningún valor. ¿Es necesario este parámetro? No he necesitado utilizarlo. Entonces tuve que comentar el comando iptables para UDP, de lo contrario DNS no funcionaría. En redsocks.conf, también tuve que comentar el bloque redudp debido al error file parsing error at line 13: unknown section .

0 votos

@baptx para -w véase iptables página de manual . // UDP está oficialmente soportado por redsocks : github.com/darkk/redsocks/blob/master/ . No te funciona porque tu proxy no tiene Asociado UDP característica. Así que no puedes enviar DNS o cualquier otro tráfico UDP a través del proxy. Eso es lo que he explicado en LIMITACIONES DEL PROXY SOCKS . Por favor, revise la respuesta completamente para una mejor comprensión. // Puede ser que necesite una línea vacía en .conf fin: github.com/darkk/redsocks/issues/134

0 votos

Todavía tengo el error de análisis del archivo en la línea redudp, incluso con una línea vacía al final del archivo de configuración. Parece que esta configuración no es compatible con la versión de redsocks que estoy utilizando. He descargado la versión x86 de redsocks de ProxyDroid. Con redsocks -v En el caso de la versión 0.4, veo que están utilizando una versión más antigua, en lugar de la última 0.5.

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