Avviare il proxy
ssh -N -D 1080 user@server
-D 1080 apre il proxy e -N significa nessun comando remoto. Aggiungi -f per eseguirlo in background. Controlla che ascolti solo sulla tua macchina:
$ ss -ltn | grep 1080
LISTEN 0 128 127.0.0.1:1080 0.0.0.0:*
LISTEN 0 128 [::1]:1080 [::]:*
Su un Mac usa invece lsof -nP -iTCP:1080 -sTCP:LISTEN.
-D è il tipo dinamico di port forwarding SSH, accanto ai tunnel locali e remoti.
Provarlo con curl
curl --socks5-hostname localhost:1080 https://example.com/
Altre forme che fanno la stessa cosa:
curl -x socks5h://localhost:1080 https://example.com/
ALL_PROXY=socks5h://localhost:1080 curl https://example.com/
Per vedere da quale indirizzo esce il traffico, chiedi a un servizio che mostra il tuo IP, con e senza proxy. Con il proxy deve comparire l'indirizzo del server:
curl https://ifconfig.me
curl --socks5-hostname localhost:1080 https://ifconfig.me
DNS: la differenza tra socks5 e socks5h
| Opzione di curl | Chi risolve i nomi |
|---|---|
--socks5, socks5:// | La tua macchina, con il tuo DNS locale |
--socks5-hostname, socks5h:// | Il server SSH |
Lo abbiamo provato con un nome che esisteva solo sul server. --socks5-hostname e socks5h:// hanno raggiunto il sito, mentre --socks5 è fallito perché il nome doveva essere risolto in locale.
Le conseguenze sono due. La rete locale e il tuo provider DNS possono vedere i nomi che cerchi, a meno che non li risolva il server: è la cosiddetta fuga DNS (DNS leak). E i nomi che esistono solo nella rete del server funzionano soltanto con la forma hostname.
Impostazioni del browser
Questi passaggi seguono la documentazione di ciascun produttore.
Firefox
Apri Impostazioni, poi Impostazioni di rete, e scegli Configurazione manuale del proxy. Imposta Host SOCKS su localhost, Porta su 1080 e scegli SOCKS v5. Attiva Proxy DNS quando si usa SOCKS v5, altrimenti i nomi vengono risolti in locale.
Chrome e Chromium
Avvia il browser con un'opzione:
chrome --proxy-server="socks5://localhost:1080"
Su Mac, chiudi prima Chrome e poi riaprilo con l'opzione dal Terminale:
open -a "Google Chrome" --args --proxy-server="socks5://localhost:1080"
La documentazione di Chromium dice che alcuni componenti possono ancora fare richieste DNS dirette, e aggiunge questa opzione per impedirlo:
--host-resolver-rules="MAP * ~NOTFOUND , EXCLUDE localhost"
Safari e tutto il Mac
Safari usa il proxy di sistema. In Impostazioni di Sistema apri Rete, scegli la tua rete, poi Dettagli e Proxy, attiva Proxy SOCKS e inserisci localhost e la porta 1080. Lo stesso dal Terminale, e per spegnerlo quando hai finito:
networksetup -setsocksfirewallproxy Wi-Fi localhost 1080
networksetup -setsocksfirewallproxystate Wi-Fi off
Sostituisci Wi-Fi con il nome del tuo servizio di rete, come lo mostra networksetup -listallnetworkservices.
Non esporre la porta
Il proxy non ha password. Chiunque lo raggiunga può usare il tuo server come uscita. Queste forme ascoltano su tutti gli indirizzi, come abbiamo verificato con ss:
ssh -N -D 0.0.0.0:1081 user@server
ssh -N -g -D 1080 user@server
Resta sul comportamento predefinito, oppure scrivilo per esteso per essere esplicito:
ssh -N -D 127.0.0.1:1080 user@server
Cosa non fa
- Trasporta solo i programmi che gli indichi. Non è una VPN a livello di sistema.
- Trasporta TCP. Il supporto SOCKS di OpenSSH non ha un relay UDP.
- Il traffico è cifrato solo tra te e il server. Dal server al sito web dipende da ciò che usa il sito.
- Il sito web vede l'indirizzo del server e il proprietario del server può vedere le connessioni.
Se non funziona
Con AllowTcpForwarding no sul server, la porta si apre dalla tua parte e il login riesce, ma ogni richiesta fallisce. Nel nostro test curl ha riportato connection to proxy closed. Controlla il server con sudo sshd -T | grep -i allowtcpforwarding. Una porta già in uso dà bind [127.0.0.1]:1080: Address already in use. Vedi la guida a quell'errore.
Domande
Un proxy SOCKS con SSH è come una VPN?
No. Passano dal proxy solo i programmi configurati per usarlo, e trasporta solo TCP. Una VPN porta tutto il traffico della macchina.
Che differenza c'è tra socks5 e socks5h?
Con socks5h, o --socks5-hostname in curl, i nomi li risolve il server SSH. Con socks5 li risolve la tua macchina: i nomi interni non funzionano e le richieste DNS si vedono sulla rete locale.
Posso usare una porta diversa da 1080?
Sì. Va bene qualsiasi porta locale libera, per esempio ssh -N -D 1081 user@server. Poi indica la stessa porta ai programmi.
Fonti
- ssh(1), manuale OpenBSD
- Pagina man di curl
- Configuring a SOCKS proxy server in Chrome
- Connection settings in Firefox