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é là. 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