¿Cómo sabe un proxy SOCKS transparente qué IP de destino usar?

18

Hay dos proxies SOCKS que conozco que admiten proxy transparente para cualquier conexión TCP saliente: Tor y redsocks . A diferencia de los servidores proxy HTTP, estos servidores proxy SOCKS pueden proxy de forma transparente cualquier conexión TCP saliente, incluidos los protocolos cifrados y los protocolos sin metadatos ni encabezados.

Ambos proxies requieren el uso de NAT para redirigir cualquier tráfico TCP saliente al puerto local del proxy. Por ejemplo, si estoy ejecutando Tor con TransPort 9040en mi máquina local, necesitaría agregar una regla de iptables como esta:

iptables -t nat -A OUTPUT -p tcp -j REDIRECT --to-port 9040

Que yo sepa, esto reemplazaría la IP y el puerto de destino originales con 127.0.0.1y 9040, por lo tanto, dado que se trata de una secuencia cifrada (como SSH) o una sin encabezados (como whois ), ¿cómo conoce el proxy la IP y el puerto de destino original?

hololeap
fuente

Respuestas:

28

Aquí es cómo lo hace:

static int getdestaddr_iptables(int fd, const struct sockaddr_in *client, const struct sockaddr_in *bindaddr, struct sockaddr_in *destaddr)
{
        socklen_t socklen = sizeof(*destaddr);
        int error;

        error = getsockopt(fd, SOL_IP, SO_ORIGINAL_DST, destaddr, &socklen);
        if (error) {
                log_errno(LOG_WARNING, "getsockopt");
                return -1;
        }
        return 0;
}

iptables sobreescribe la dirección de destino original pero recuerda la anterior. El código de aplicación puede captar que al pedir una opción especial zócalo, SO_ORIGINAL_DST.

Celada
fuente
1
Respuesta impresionante! Esto significa que debe ejecutar el software proxy en la misma computadora que maneja el NAT, ¿verdad?
hololeap
44
Absolutamente, @hololeap. Si el servidor proxy debe ejecutarse en un sistema diferente como redirector de paquetes, entonces necesita protocolos como el WCCP de Cisco .
Celada