Mir sind zwei SOCKS-Proxys bekannt, die transparentes Proxying für jede ausgehende TCP-Verbindung unterstützen:Tor und Redsocks. Im Gegensatz zu HTTP-Proxys können diese SOCKS-Proxys beliebige transparent weitergeben ausgehende TCP-Verbindung, einschließlich verschlüsselter Protokolle und Protokolle ohne Metadaten oder Header.
Beide Proxys erfordern die Verwendung von NAT, um ausgehenden TCP-Datenverkehr an den lokalen Port des Proxys umzuleiten. Zum Beispiel, wenn ich Tor mit TransPort 9040
betreibe Auf meinem lokalen Rechner müsste ich eine iptables-Regel wie diese 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 Port durch 127.0.0.1
ersetzen und 9040
, da dies also ein verschlüsselter Stream (wie SSH) oder einer ohne Header (wie Whois) ist, woher kennt der Proxy die ursprüngliche Ziel-IP und den Port?
Akzeptierte Antwort:
So funktioniert es:
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 aber die alte. Der Anwendungscode kann es dann abrufen, indem er nach einer speziellen Socket-Option SO_ORIGINAL_DST
fragt .