Як прозорий проксі-сервер 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-адресу та порт призначення?

Відповіді:


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.


1
Дивовижна відповідь! Отже, це означає, що ви повинні запускати проксі-програмне забезпечення на тому самому комп’ютері, який працює з NAT, правда?
гололепа

4
Абсолютно, @hololeap. Якщо проксі-сервер повинен працювати в іншій системі, як перенаправлення пакетів, тоді вам потрібні такі протоколи, як WCCP Cisco .
Целада
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.