Come usare SSH come proxy SOCKS

Esegui ssh -N -D 1080 user@server. Ora la tua macchina ha un proxy SOCKS sulla porta 1080 e il traffico inviato lì esce dal server. Provalo con curl --socks5-hostname localhost:1080 https://example.com/. Usa la forma hostname così i nomi li risolve il server e non la tua rete locale. Passano dal proxy solo i programmi configurati per usarlo.

Aggiornata il . OpenSSH 10.0 e curl su Debian 13 in container usa e getta, e OpenSSH 10.3 con curl e lsof su macOS, raggiungendo un server web che solo il server SSH poteva risolvere e raggiungere, in HTTP semplice.

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 curlChi 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

Altro in Tunnel e jump host

Tutte le guide