Como um proxy SOCKS transparente sabe qual IP de destino usar?

18

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

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

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

Que eu saiba, isso substituiria o IP e a porta de destino originais por 127.0.0.1e 9040, portanto, como esse é um fluxo criptografado (como SSH) ou sem cabeçalho (como whois ), como o proxy conhece o IP e a porta de destino originais?

Hololeap
fonte

Respostas:

28

Aqui está como ele faz isso:

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 buscá-lo solicitando uma opção de soquete especial SO_ORIGINAL_DST,.

Celada
fonte
1
Resposta incrível! Então isso significa que você precisa estar executando o software proxy no mesmo computador que está lidando com o NAT, certo?
hololeap
4
Absolutamente, @hololeap. Se o servidor proxy for executado em um sistema diferente como o redirecionador de pacotes, você precisará de protocolos como o WCCP da Cisco .
Celada