Démarrer le proxy
ssh -N -D 1080 user@server
-D 1080 ouvre le proxy, et -N signifie aucune commande distante. Ajoutez -f pour le lancer en arrière-plan. Vérifiez qu'il n'écoute que sur votre propre machine :
$ ss -ltn | grep 1080
LISTEN 0 128 127.0.0.1:1080 0.0.0.0:*
LISTEN 0 128 [::1]:1080 [::]:*
Sur un Mac, utilisez plutôt lsof -nP -iTCP:1080 -sTCP:LISTEN.
-D est la forme dynamique de la redirection de port SSH, à côté des tunnels locaux et distants.
Tester avec curl
curl --socks5-hostname localhost:1080 https://example.com/
D'autres formes équivalentes :
curl -x socks5h://localhost:1080 https://example.com/
ALL_PROXY=socks5h://localhost:1080 curl https://example.com/
Pour voir l'adresse d'où part votre trafic, interrogez un service qui affiche votre IP, avec et sans le proxy. Avec le proxy, ce doit être l'adresse du serveur :
curl https://ifconfig.me
curl --socks5-hostname localhost:1080 https://ifconfig.me
DNS : la différence entre socks5 et socks5h
| Option de curl | Qui résout les noms |
|---|---|
--socks5, socks5:// | Votre machine, avec votre DNS local |
--socks5-hostname, socks5h:// | Le serveur SSH |
Nous l'avons testé avec un nom qui n'existait que sur le serveur. --socks5-hostname et socks5h:// ont atteint le site, alors que --socks5 a échoué parce que le nom devait être résolu localement.
Il y a deux conséquences. Le réseau local et votre fournisseur DNS voient les noms que vous interrogez, sauf si le serveur les résout : c'est ce qu'on appelle une fuite DNS. Et les noms qui n'existent que sur le réseau du serveur ne fonctionnent qu'avec la forme hostname.
Réglages des navigateurs
Ces étapes suivent la documentation de chaque éditeur.
Firefox
Ouvrez Paramètres, puis Paramètres réseau, et choisissez Configuration manuelle du proxy. Définissez Hôte SOCKS sur localhost, Port sur 1080, et choisissez SOCKS v5. Activez Utiliser un DNS distant lorsque SOCKS v5 est actif (Proxy DNS when using SOCKS v5), sinon les noms sont résolus localement.
Chrome et Chromium
Démarrez le navigateur avec une option :
chrome --proxy-server="socks5://localhost:1080"
Sur Mac, quittez d'abord Chrome, puis relancez-le avec l'option depuis le Terminal :
open -a "Google Chrome" --args --proxy-server="socks5://localhost:1080"
La documentation de Chromium indique que certains composants peuvent encore faire des requêtes DNS directes, et ajoute cette option pour l'empêcher :
--host-resolver-rules="MAP * ~NOTFOUND , EXCLUDE localhost"
Safari et tout le Mac
Safari utilise le proxy du système. Dans Réglages Système, ouvrez Réseau, choisissez votre réseau, puis Détails et Proxys, activez Proxy SOCKS et saisissez localhost et le port 1080. La même chose depuis le Terminal, puis pour le couper une fois terminé :
networksetup -setsocksfirewallproxy Wi-Fi localhost 1080
networksetup -setsocksfirewallproxystate Wi-Fi off
Remplacez Wi-Fi par le nom de votre service réseau, tel que l'affiche networksetup -listallnetworkservices.
N'exposez pas le port
Le proxy n'a pas de mot de passe. Quiconque peut l'atteindre peut utiliser votre serveur comme sortie. Ces formes écoutent sur toutes les adresses, comme nous l'avons confirmé avec ss :
ssh -N -D 0.0.0.0:1081 user@server
ssh -N -g -D 1080 user@server
Gardez le comportement par défaut, ou écrivez-le explicitement :
ssh -N -D 127.0.0.1:1080 user@server
Ce qu'il ne fait pas
- Il ne transporte que les programmes que vous dirigez vers lui. Ce n'est pas un VPN pour tout le système.
- Il transporte du TCP. Le SOCKS d'OpenSSH n'a pas de relais UDP.
- Le trafic n'est chiffré qu'entre vous et le serveur. Du serveur au site web, c'est ce que le site utilise.
- Le site web voit l'adresse du serveur, et le propriétaire du serveur peut voir les connexions.
Si cela ne marche pas
Avec AllowTcpForwarding no sur le serveur, le port s'ouvre de votre côté et la connexion réussit, mais chaque requête échoue. curl a signalé connection to proxy closed dans notre test. Vérifiez le serveur avec sudo sshd -T | grep -i allowtcpforwarding. Un port déjà utilisé donne bind [127.0.0.1]:1080: Address already in use. Voir le guide de cette erreur.
Questions
Un proxy SOCKS SSH, est-ce un VPN ?
Non. Seuls les programmes configurés pour l'utiliser passent par le proxy, et il ne transporte que du TCP. Un VPN fait passer tout le trafic de la machine.
Quelle différence entre socks5 et socks5h ?
Avec socks5h, ou --socks5-hostname dans curl, c'est le serveur SSH qui résout les noms. Avec socks5, c'est votre machine : les noms internes échouent et les requêtes DNS sont visibles sur votre réseau local.
Puis-je utiliser un autre port que 1080 ?
Oui. N'importe quel port local libre convient, par exemple ssh -N -D 1081 user@server. Indiquez ensuite le même port à vos programmes.
Sources
- ssh(1), manuel OpenBSD
- Page de manuel de curl
- Configuring a SOCKS proxy server in Chrome
- Paramètres de connexion dans Firefox