Woher weiß ein transparenter SOCKS-Proxy, welche Ziel-IP verwendet werden soll?

18

Es gibt zwei mir bekannte SOCKS-Proxys, die transparentes Proxying für jede ausgehende TCP-Verbindung unterstützen: Tor und Redsocks . Im Gegensatz zu HTTP-Proxys können diese SOCKS-Proxys jede ausgehende TCP-Verbindung einschließlich verschlüsselter Protokolle und Protokolle ohne Metadaten oder Header transparent als Proxy bereitstellen.

Beide Proxys erfordern die Verwendung von NAT, um ausgehenden TCP-Verkehr zum lokalen Port des Proxys umzuleiten. Wenn ich zum Beispiel Tor TransPort 9040auf meinem lokalen Computer ausführen möchte, müsste ich eine iptables-Regel wie die folgende hinzufügen:

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

Meines Wissens würde dies die ursprüngliche Ziel-IP und den ursprünglichen Ziel-Port durch 127.0.0.1und ersetzen. Wenn 9040dies also ein verschlüsselter Stream (wie SSH) oder ein Stream ohne Header (wie whois ) ist, woher kennt der Proxy die ursprüngliche Ziel-IP und den ursprünglichen Ziel-Port?

hololeap
quelle

Antworten:

28

So macht es das:

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 überschreibt die ursprüngliche Zieladresse, merkt sich jedoch die alte. Der Anwendungscode kann ihn dann abrufen, indem er nach einer speziellen Socket-Option fragt SO_ORIGINAL_DST.

Celada
quelle
1
Geniale Antwort! Das bedeutet also, dass Sie die Proxy-Software auf demselben Computer ausführen müssen, auf dem auch NAT ausgeführt wird, oder?
Hololeap
4
Absolut, @hololeap. Wenn der Proxyserver auf einem anderen System als der Paketumleitung ausgeführt werden soll, benötigen Sie Protokolle wie WCCP von Cisco .
Celada