Как прозрачный SOCKS-прокси узнает, какой IP-адрес назначения использовать?

18

Я знаю о двух прокси SOCKS, поддерживающих прозрачное прокси для любого исходящего TCP-соединения: Tor и redsocks . В отличие от прокси-серверов HTTP, эти прокси-серверы SOCKS могут прозрачно проксировать любое исходящее TCP-соединение, включая зашифрованные протоколы и протоколы без метаданных или заголовков.

Оба этих прокси-сервера требуют использования NAT для перенаправления любого исходящего TCP-трафика на локальный порт прокси-сервера. Например, если я запускаю Tor TransPort 9040на своей локальной машине, мне нужно добавить правило iptables, например:

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

Насколько мне известно, это заменит исходный IP-адрес назначения и порт на 127.0.0.1и 9040, учитывая, что это зашифрованный поток (например, SSH) или поток без заголовков (например, whois ), как прокси-сервер знает исходный IP-адрес и порт назначения?

hololeap
источник

Ответы:

28

Вот как это делается:

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 перезаписывает исходный адрес назначения, но запоминает старый. Затем код приложения может получить его, запросив специальный параметр сокета SO_ORIGINAL_DST.

Celada
источник
1
Отличный ответ! Таким образом, это означает, что вы должны запускать прокси-сервер на том же компьютере, который обрабатывает NAT, верно?
Отпуск
4
Абсолютно, @hololeap. Если прокси-сервер должен работать в другой системе в качестве перенаправителя пакетов, вам нужны такие протоколы, как WCCP Cisco .
Селада