Como um proxy SOCKS transparente sabe qual IP de destino deve ser usado?

14

Existem dois proxies SOCKS que eu conheço que suportam proxy transparente para qualquer conexão TCP de saída: Tor e redsocks . Ao contrário dos proxies HTTP, esses proxies SOCKS podem fazer proxy de forma transparente qualquer conexão TCP de saída, incluindo protocolos e protocolos criptografados sem metadados ou cabeçalhos.

Ambos os proxies requerem o uso de NAT para redirecionar qualquer tráfego TCP de saída para a porta local do proxy. Por exemplo, se eu estou executando o Tor com TransPort 9040 na minha máquina local, eu precisaria adicionar uma regra do iptables como esta:

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

No meu conhecimento, isso substituiria o IP e a porta de destino original por 127.0.0.1 e 9040 , portanto, considerando-se um fluxo criptografado (como SSH) ou sem cabeçalhos (como whois ), como o proxy conhece o IP e a porta de destino original?

    
por hololeap 07.11.2014 / 19:04

1 resposta

21

Aqui é assim:

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;
}

O iptables substitui o endereço de destino original, mas lembra o antigo. O código do aplicativo pode então buscá-lo solicitando uma opção de soquete especial, SO_ORIGINAL_DST .

    
por 07.11.2014 / 20:20