Ci sono due proxy SOCKS che conosco che supportano il proxy trasparente per qualsiasi connessione TCP in uscita:Tor e redsocks. A differenza dei proxy HTTP, questi proxy SOCKS possono inviare proxy in modo trasparente a qualsiasi connessione TCP in uscita, inclusi protocolli crittografati e protocolli senza metadati o intestazioni.
Entrambi questi proxy richiedono l'uso di NAT per reindirizzare qualsiasi traffico TCP in uscita alla porta locale del proxy. Ad esempio, se eseguo Tor con TransPort 9040
sul mio computer locale, dovrei aggiungere una regola iptables come questa:
iptables -t nat -A OUTPUT -p tcp -j REDIRECT --to-port 9040
A mia conoscenza, questo sostituirebbe l'IP di destinazione e la porta originali con 127.0.0.1
e 9040
, quindi dato che si tratta di un flusso crittografato (come SSH) o senza intestazioni (come whois), come fa il proxy a conoscere l'IP e la porta di destinazione originali?
Risposta accettata:
Ecco come si fa:
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 sovrascrive l'indirizzo di destinazione originale ma ricorda quello vecchio. Il codice dell'applicazione può quindi recuperarlo chiedendo un'opzione socket speciale, SO_ORIGINAL_DST
.