Contournement de proxy…

Oui, je sais, c’est pas bien de contourner les systèmes de surveillance sécurité mis en place par une DSI pour faire plaisir au patron… Mais, dès fois, c’est très bloquant, donc on doit contourner.

La technique est assez basique et marche assez souvent: on ne peut pas vraiment proxyfier le HTTPS, en général, on se contente de le faire passer dans un tunnel, sans aucune analyse. Du coup, c’est assez facile de se monter un proxy SOCKS local via un tunnel SSH, à condition que le serveur SSH distant (hors du réseau où le proxy nous bloque) écoute sur le port tcp/443 (celui utilisé habituellement par les serveurs HTTPS pour ceux qui ne suivent pas).

NB: Si le serveur SSH est Dropbear, il faut vérifier qu’il tourne bien avec l’option “-j” qui autorise le forwarding de ports locaux. Un OpenSSH dans sa configuration standard l’autorise.

Création du proxy socks et du tunnel:

C’est tout simple, il suffit d’utiliser un client SSH et de lui dire:

ssh -D 127.0.0.1:8888 -p 443 -l monUserDistant mon.serveur.distant

Le serveur proxy tourne du coup sur le port 8888 (choix arbitraire, il faut juste que nombre soit supérieur à 1024) et est bindé sur 127.0.0.1.

On peut étoffer un peu la commande (pour les détails voir ssh(1)):

ssh -C -q -T -x -N -f -n -D 127.0.0.1:8888 -p 443 -l monUserDistant mon.serveur.distant=

Utilisation du proxy dans un navigateur:

Personnellement, je configure mon navigateur en lui disant d’utiliser un fichier local, nommé proxy.pac (en général je le stocke dans ~/.config/). Le mien a été plus ou moins complétement pompé . Le voici:

function FindProxyForURL(url, host)
{
    // maison -> pas besoin
    if( isInNet(myIpAddress(), '192.168.1.0'. '255.255.255.0') )
    {
        return 'DIRECT';
    }
    // pas de proxy pour les hôtes locaux:
    if( isPlainHostName(host) )
    {
        return 'DIRECT';
    }
    // idem pour les machines sur le domaine local
    if( dnsDomainIs(host, ".local") ||
        dnsDomainIs(host, ".home") )
    {
        return 'DIRECT';
    }
    if( isResovable(host) )
    {
        var hostIP = dnsResolv(host);
        // pas de proxy pour les IP non routable sur Internet (RFC 3330)
        if ( isInNet(hostIP, '0.0.0.0', '255.0.0.0') ||
             isInNet(hostIP, '10.0.0.0', '255.0.0.0') ||
             isInNet(hostIP, '127.0.0.0', '255.0.0.0') ||
             isInNet(hostIP, '169.254.0.0', '255.255.0.0') || // APIPA/zeroconf
             isInNet(hostIP, '172.16.0.0', '255.240.0.0') || // 172.16.0.0->172.31.255.255
             isInNet(hostIP, '192.0.2.0', '255.255.255.0') ||
             isInNet(hostIP, '192.88.99.0', '255.255.255.0') ||
             isInNet(hostIP, '192.168.0.0', '255.255.0.0') ||
             isInNet(hostIP, '198.18.0.0', '255.254.0.0') || // 192.18.0.0->192.19.255.255
             isInNet(hostIP, '224.0.0.0', '240.0.0.0') || // multicast
             isInNet(hostIP, '240.0.0.0', '240.0.0.0') ) // multicast
        {
            return 'DIRECT';
        }
        if( false ) // adresse locale
        {
            return 'DIRECT';
        }
    }
    return 'SOCKS 127.0.0.1:8888';
}

Dans firefox, il y a même une option qui dit de faire passer les requêtes DNS dans le proxy SOCKS, ça rajoute une petite couche de tranquilité 🙂

 Utilisation du proxy pour faire passer ses connexions SSH:

Et oui, un proxy SOCKS permet aussi ça. Il faut au préalable disposer de netcat (ou nc).

Ça se passe comme ça:

ssh -o ProxyCommand='nc -x 127.0.0.1:8888 %h %p' un.autre.serveur.distant

One thought on “Contournement de proxy…

  1. Bonjour. Article intéressant, j’utilise régulièrement cette méthode pour outrepasser des filtrages d’URL qui font du zèle…

    À noter que cela requiert que les communications SSH soient autorisées dans le réseau en question. Si ce n’est pas le cas, il est possible d’encapsuler les connexions SSH dans du SSL avec stunnel, pour faire ressembler la connection à une connection HTTPS classique si l’ont fait tourner stunnel sur le port 443. Voir ‘sslh’ sinon pour multiplexer plusieurs services sur le même port.

Comments are closed.