Comment un proxy SOCKS transparent sait-il quelle adresse IP de destination utiliser?

18

Il existe deux proxy SOCKS que je connais 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 toute connexion TCP sortante, y compris les protocoles crypté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 9040sur ma machine locale, je devrais 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'IP et le port de destination d'origine par 127.0.0.1et 9040, étant donné qu'il s'agit d'un flux crypté (comme SSH) ou sans en-têtes (comme whois ), comment le proxy connaît-il l'IP et le port de destination d'origine?

hololeap
la source

Réponses:

28

Voici comment procéder:

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 écrase l'adresse de destination d'origine mais se souvient de l'ancienne. Le code d'application peut alors chercher en demandant une option de prise spéciale, SO_ORIGINAL_DST.

Celada
la source
1
Réponse géniale! Cela signifie donc que vous devez exécuter le logiciel proxy sur le même ordinateur qui gère le NAT, non?
hololeap
4
Absolument, @hololeap. Si le serveur proxy doit fonctionner sur un système différent en tant que redirecteur de paquets, vous avez besoin de protocoles tels que le WCCP de Cisco .
Celada