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: