Je connais deux proxys SOCKS qui prennent en charge le proxy transparent pour toute connexion TCP sortante :Tor et redsocks. Contrairement aux proxys HTTP, ces proxys SOCKS peuvent proxy de manière transparente tout connexion TCP sortante, y compris les protocoles chiffrés et les protocoles sans métadonnées ni en-têtes.
Ces deux proxys nécessitent l'utilisation de NAT pour rediriger tout trafic TCP sortant vers le port local du proxy. Par exemple, si j'utilise Tor avec TransPort 9040
sur ma machine locale, j'aurais besoin d'ajouter une règle iptables comme celle-ci :
iptables -t nat -A OUTPUT -p tcp -j REDIRECT --to-port 9040
À ma connaissance, cela remplacerait l'adresse IP et le port de destination d'origine par 127.0.0.1
et 9040
, donc étant donné qu'il s'agit d'un flux crypté (comme SSH) ou sans en-tête (comme whois), comment le proxy connaît-il l'adresse IP et le port de destination d'origine ?
Réponse acceptée :
Voici comment il procède :
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 remplace l'adresse de destination d'origine mais mémorise l'ancienne. Le code de l'application peut alors le récupérer en demandant une option de socket spéciale, SO_ORIGINAL_DST
.