1. Cos'è SSH e a cosa serve
Il protocollo SSH (Secure Shell) è lo standard de facto per la gestione remota e sicura di sistemi operativi Unix-like e server Linux. Progettato come sostituto crittograficamente sicuro di protocolli obsoleti e vulnerabili come telnet, rlogin e FTP in chiaro, SSH garantisce riservatezza, integrità dei dati e autenticazione forte attraverso una connessione client-server completamente cifrata.
Opera tipicamente sulla porta TCP 22 e fornisce quattro funzionalità essenziali:
- Accesso remoto interattivo: Controllo della shell remota con crittografia end-to-end.
- Esecuzione remota di comandi: Automazione di task, script e pipeline di deployment senza avviare una sessione interattiva.
- Trasferimento sicuro di file: Protocolli SFTP e SCP integrati.
- Tunneling e Port Forwarding: Creazione di canali sicuri per inoltrare porte locali, remote e creare proxy dinamici SOCKS5 (simulando un tunnel VPN).
2. Connessione Base e Gestione Utenti
La sintassi fondamentale del client SSH da riga di comando è:
ssh [opzioni] username@indirizzo_server
Esempi Pratici di Connessione:
# Connessione classica su porta standard 22 ssh [email protected] # Connessione su porta personalizzata (es. 2222) ssh -p 2222 [email protected] # Esecuzione di un comando remoto singolo senza aprire la shell ssh [email protected] "uptime && free -h" # Modalità verbose per diagnosticare problemi di connessione ssh -v [email protected]
Alla prima connessione verso un nuovo host, il client SSH mostra il fingerprint della chiave del server e chiede conferma per salvarla nel file ~/.ssh/known_hosts. Digita yes per confermare e procedere con l'inserimento della password.
3. Autenticazione con Chiave Pubblica (Ed25519)
L'autenticazione tramite password è vulnerabile ad attacchi brute-force. L'approccio raccomandato consiste nell'utilizzare una coppia di chiavi crittografiche (una chiave privata che rimane sul tuo PC locale e una chiave pubblica installata sul server).
Passo 1: Generare la Coppia di Chiavi
Sul tuo computer locale, esegui il generatore di chiavi specificando la tua email o etichetta:
ssh-keygen -t ed25519 -C "[email protected]"
Il sistema ti chiederà dove salvare il file (premi Invio per confermare la cartella predefinita ~/.ssh/id_ed25519) e ti inviterà a inserire una passphrase sicura per proteggere la chiave privata.
Passo 2: Copiare la Chiave Pubblica sul Server Remoto
Utilizza l'utility integrata ssh-copy-id che aggiungerà in automatico la chiave pubblica al file ~/.ssh/authorized_keys sul server:
# Su porta standard ssh-copy-id -i ~/.ssh/id_ed25519.pub [email protected] # Se il server ascolta su una porta personalizzata ssh-copy-id -p 2222 -i ~/.ssh/id_ed25519.pub [email protected]
Passo 3: Configurare i Permessi di Sicurezza dei File SSH
OpenSSH rifiuta di funzionare se i permessi sui file di configurazione sono troppo permissivi. Assicurati che i permessi siano corretti:
# Sul computer client chmod 700 ~/.ssh chmod 600 ~/.ssh/id_ed25519 chmod 644 ~/.ssh/id_ed25519.pub # Sul server remoto chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
Passo 4: Utilizzare l'Agente SSH (SSH-Agent)
Per non dover digitare la passphrase della chiave ad ogni accesso, avvia l'agente SSH e carica la chiave:
eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_ed25519
4. File di Configurazione Client (~/.ssh/config)
Invece di digitare ogni volta indirizzi IP lunghi, nomi utente, porte e percorsi di chiavi, puoi definire degli alias all'interno del file ~/.ssh/config:
# Server Principale di Produzione
Host production-server
HostName 198.51.100.24
User username
Port 2222
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 60
ServerAliveCountMax 3
# Homelab Locale
Host homelab
HostName 192.168.1.50
User root
IdentityFile ~/.ssh/id_ed25519
Da questo momento puoi connetterti digitando semplicemente:
ssh production-server
5. Port Forwarding e Tunneling SSH
Il tunneling SSH permette di incapsulare qualsiasi connessione TCP all'interno del canale crittografato. Esistono tre modalità principali:
| Modalità | Flag | Direzione | Caso d'Uso Tipico |
|---|---|---|---|
| Local Forwarding | -L [porta_locale]:[host_dest]:[porta_dest] |
Locale → Remoto | Accedere a database o servizi web interni al server (es. MySQL 3306, Cockpit 9090) senza esporli su Internet. |
| Remote Forwarding | -R [porta_remota]:[host_dest]:[porta_dest] |
Remoto → Locale | Esporre un web server in sviluppo locale sul server pubblico. |
| Dynamic Forwarding | -D [porta_locale] |
Locale → SOCKS5 Proxy | Creare un proxy SOCKS5 dinamico per instradare tutto il traffico web del browser (funzione VPN). |
Esempio di Local Port Forwarding:
Inoltra la porta 8080 del tuo computer alla porta interna 80 del server remoto:
ssh -L 8080:localhost:80 -N [email protected]
Aprendo http://localhost:8080 nel browser locale, visualizzerai il servizio web attivo sul server remoto.
6. Creazione SOCKS5 Proxy con SSH & Connessione con SwitchyOmega (Tunnel VPN)
Uno degli utilizzi più potenti e versatili di SSH è il Dynamic Port Forwarding (flag -D). Con un unico comando, SSH trasforma il server remoto in un server proxy SOCKS5 attivo localmente.
Tutto il traffico inviato a questo socket viene cifrato, inviato al server SSH e da lì inoltrato verso Internet. Collegando il browser (ad esempio con l'estensione Proxy SwitchyOmega), la tua navigazione web acquisisce l'indirizzo IP pubblico del server remoto e bypassa restrizioni di rete, firewall locali o reti Wi-Fi pubbliche non protette, esattamente come una VPN ma senza installare alcun demone aggiuntivo sul server!
Passo 1: Avviare il Tunnel SOCKS5 da Terminale
Esegui il comando SSH specificando la porta locale desiderata (solitamente la 1080 o 10808):
# Avvio del proxy SOCKS5 con compressione dati (-C) e senza shell remota (-N) ssh -D 1080 -C -N [email protected] # Oppure in background / modalità demone (-f) e silenziosa (-q): ssh -D 1080 -f -N -C -q [email protected]
Spiegazione dei parametri:
-D 1080: Apre un socket di ascolto locale SOCKS5 sulla porta1080(127.0.0.1:1080).-C: Abilita la compressione zlib dei flussi per velocizzare la navigazione web.-N: Indica a SSH di non eseguire comandi remoti e non aprire la shell (ottimizzato solo per inoltro traffico).-f: Manda il processo SSH in background subito dopo aver autenticato la sessione.
Configurazione Permanente in ~/.ssh/config:
Puoi aggiungere un blocco dedicato nel tuo file di configurazione per avviarlo in qualsiasi momento con un solo comando:
Host vpn-tunnel
HostName server.domain.com
User username
Port 22
DynamicForward 1080
ServerAliveInterval 30
ServerAliveCountMax 3
IdentityFile ~/.ssh/id_ed25519
Per attivare il tunnel basterà digitare:
ssh -N vpn-tunnel
Passo 2: Configurare l'Estensione SwitchyOmega nel Browser
Proxy SwitchyOmega è una delle estensioni più potenti e affidabili per gestire proxy su browser Chromium (Google Chrome, Brave, Edge) e Mozilla Firefox.
- Installa l'estensione Proxy SwitchyOmega dal Web Store del tuo browser.
- Clicca sull'icona dell'estensione e seleziona "Options" (Opzioni).
- Nel menu laterale a sinistra, clicca sul pulsante "+ New profile".
- Assegna un nome al profilo (es.
SSH-VPN-Tunnel) e seleziona come tipologia "Proxy Profile", quindi premi "Create". - Nella schermata di configurazione del profilo:
- Scheme / Protocol: Seleziona
SOCKS5dal menu a tendina. - Server: Inserisci
127.0.0.1(oppurelocalhost). - Port: Inserisci
1080(o la porta impostata con il flag-D).
- Scheme / Protocol: Seleziona
- Clicca sul pulsante verde "Apply changes" a sinistra per salvare la configurazione.
Passo 3: Attivare il Profilo e Verificare il Tunnel
- Clicca sull'icona circolare di SwitchyOmega nella barra degli strumenti del browser.
- Seleziona il profilo
SSH-VPN-Tunnelappena creato (l'icona assumerà il colore identificativo del profilo). - Visita un sito di verifica IP come https://ifconfig.me o https://ipinfo.io: l'indirizzo IP pubblico mostrato sarà quello del tuo server remoto!
- Per terminare la sessione VPN, seleziona
[Direct]dall'estensione SwitchyOmega e chiudi il processo SSH (killall ssho premendoCtrl + Cnel terminale).
Passo 4: Regole Avanzate con "Auto Switch" (Routing Intelligente)
Con SwitchyOmega puoi creare un profilo di tipo "Auto Switch": il browser navigherà normalmente con la tua connessione locale per tutti i siti generici, ma instraderà automaticamente attraverso il tunnel SSH solo specifici domini (es. pannelli interni aziendali *.internal.lan, *.domain.com o indirizzi IP della tua subnet privata).
7. Trasferimento File Sicuro (SCP, SFTP & Rsync)
SSH include strumenti ad alte prestazioni per sincronizzare e copiare file in modo cifrato:
Utilizzo di SCP (Secure Copy):
# Copia di un singolo file dal PC locale al server scp backup.tar.gz [email protected]:/var/backups/ # Copia ricorsiva di un'intera cartella dal server al PC locale scp -r [email protected]:/var/www/html/ ./sito_locale_backup/
Utilizzo di Rsync over SSH (Consigliato per grandi volumi di dati):
# Sincronizzazione incrementale con barra di avanzamento e compressione rsync -avzh --progress -e "ssh -p 22" ./progetti/ [email protected]:/home/username/progetti/
8. Jump Host & Bastion Server (ProxyJump)
In architetture aziendali o homelab complesse, i server interni non hanno un IP pubblico diretto e sono accessibili solo tramite un server gateway (denominato Bastion Host o Jump Host).
Puoi collegarti direttamente al server privato con il parametro -J:
ssh -J [email protected]:22 [email protected]
Oppure configurarlo permanentemente nel tuo ~/.ssh/config:
Host bastion
HostName bastion.domain.com
User bastion_user
Host internal-node-1
HostName 10.0.0.45
User internal_user
ProxyJump bastion
Digitando ssh internal-node-1, SSH stabilirà la connessione attraverso il bastion in modo completamente trasparente.
9. Hardening del Server SSH (/etc/ssh/sshd_config)
Per proteggere il tuo server Linux da scansioni automatizzate e tentativi di intrusione, modifica il file di configurazione del demone /etc/ssh/sshd_config:
# 1. Disabilita il login con password (forza l'uso di chiavi Ed25519) PasswordAuthentication no ChallengeResponseAuthentication no # 2. Impedisci l'accesso diretto all'utente root con password PermitRootLogin prohibit-password # 3. Modifica la porta predefinita per abbattere il rumore dei bot Port 2222 # 4. Limita gli utenti autorizzati ad accedere AllowUsers username admin # 5. Riduci i tentativi massimi di autenticazione e il timeout MaxAuthTries 3 LoginGraceTime 30 # 6. Disabilita inoltri X11 e permessi vuoti non necessari X11Forwarding no PermitEmptyPasswords no
sudo sshd -t per evitare di rimanere bloccati fuori dal server in caso di errori tipografici!Applica le modifiche ricaricando il servizio:
sudo sshd -t sudo systemctl reload ssh # Su Debian / Ubuntu # oppure: sudo systemctl reload sshd # Su RHEL / CentOS / Arch
10. Risoluzione dei Problemi Comuni (FAQ)
1. Errore: Host key verification failed / WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
Questo errore si verifica quando il server remoto è stato reinstallato o la sua chiave di host è cambiata. Per aggiornare la chiave registrata:
ssh-keygen -R 192.168.1.10
2. Errore: Permission denied (publickey)
Verifica che la tua chiave pubblica sia inserita in ~/.ssh/authorized_keys sul server e controlla i permessi con:
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
3. Errore: bind: Address already in use durante l'apertura del Socket SOCKS5
Significa che un processo precedente sta ancora occupando la porta 1080. Per individuarlo e terminarlo:
# Trova il processo attivo sulla porta 1080 lsof -i :1080 # Oppure termina rapidamente il processo occupante fuser -k 1080/tcp
11. Riepilogo & Conclusione
SSH non è soltanto un emulatore di terminale remoto, ma un coltellino svizzero di rete in grado di cifrare trasferimenti file, superare firewall complessi con i Jump Host e proteggere l'intera navigazione web trasformandosi in un tunnel VPN con proxy SOCKS5 e SwitchyOmega.
Adottando chiavi moderne Ed25519, configurando profili in ~/.ssh/config e applicando le regole di hardening su sshd_config, otterrai un'infrastruttura di gestione sicura, ultra-performante e a prova di intrusioni.