W jaki sposób przezroczysty serwer proxy SOCKS wie, którego docelowego adresu IP użyć?


18

Istnieją dwa proxy SOCKS, które znam o tym, że obsługują przezroczyste proxy dla dowolnego wychodzącego połączenia TCP: Tor i redsocks . W przeciwieństwie do serwerów proxy HTTP, te serwery proxy SOCKS mogą transparentnie proxy każdego wychodzącego połączenia TCP, w tym protokołów szyfrowanych i protokołów bez metadanych lub nagłówków.

Oba te proxy wymagają użycia NAT do przekierowania wszelkiego wychodzącego ruchu TCP na lokalny port proxy. Na przykład, jeśli korzystam z Tora TransPort 9040na moim komputerze lokalnym, musiałbym dodać regułę iptables w następujący sposób:

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

Według mojej wiedzy zastąpiłoby to pierwotny docelowy adres IP i port, 127.0.0.1a 9040zatem, biorąc pod uwagę, że jest to szyfrowany strumień (jak SSH) lub taki bez nagłówków (jak whois ), w jaki sposób serwer proxy zna pierwotny docelowy adres IP i port?

Odpowiedzi:


28

Oto jak to robi:

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 zastępuje oryginalny adres docelowy, ale pamięta stary. Kod aplikacji można następnie pobrać go, prosząc o specjalnej opcji gniazda, SO_ORIGINAL_DST.


1
Świetna odpowiedź! Oznacza to, że musisz uruchomić oprogramowanie proxy na tym samym komputerze, który obsługuje NAT, prawda?
hololeap

4
Oczywiście, @hololeap. Jeśli serwer proxy ma działać w innym systemie niż przekierowanie pakietów, potrzebne są takie protokoły jak WCCP firmy Cisco .
Celada,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.