Destinos originales en el reenvío transparente de TCP a SOCKS
Explica por qué el reenvío transparente de TCP a SOCKS necesita un traductor que recupere el destino original antes de negociar con el proxy.
Un cortafuegos puede cambiar dónde termina una conexión TCP. Pero no puede, solo con ese cambio, enseñar a la aplicación de origen a hablar SOCKS.
Un servidor SOCKS corriente espera una negociación que describa el destino solicitado. Una aplicación que no conoce el proxy envía en cambio sus propios bytes de protocolo de inmediato. Redirija esos bytes directamente a un escucha SOCKS y las dos partes discreparán sobre el primer mensaje.
El componente que falta es un traductor
Un componente transparente de TCP a proxy se sitúa entre esas interfaces. Descubre el destino que la aplicación solicitó originalmente, establece la sesión SOCKS o HTTP CONNECT adecuada y luego retransmite los datos de la aplicación por el flujo resultante.
En su ruta de Linux iptables, el código de redsocks recupera el destino preservado mediante SO_ORIGINAL_DST. Otros sistemas operativos y métodos de redirección usan mecanismos distintos. Esto es una propiedad del redireccionador y de la configuración de red, no una función de un cliente SOCKS corriente.
La información del destino original también explica por qué mover una regla de redirección del host del proxy a una puerta de enlace no relacionada no siempre es equivalente. El proceso receptor necesita los metadatos que exige su modo de interceptación. Una dirección reescrita en otro lugar puede que ya no proporcione esa información en la forma esperada.
Mantenga explícito el alcance del traductor. Una conexión TCP redirigida que funciona no demuestra soporte para UDP arbitrario, ICMP ni para cada ruta de resolución. El protocolo del proxy superior y la implementación del traductor siguen definiendo las operaciones admitidas.
Cuando una configuración falla justo después de la conexión, revise el límite del protocolo antes de ampliar las reglas de acceso. Un escucha SOCKS perfectamente accesible puede rechazar bytes que nunca fueron una solicitud SOCKS.