Introduzione
SSH Avanzato: Tunnel, Port Forwarding e Sicurezza. SSH (Secure Shell) è molto più di un semplice strumento per accedere a server remoti. Nelle mani di uno sviluppatore esperto, diventa una piattaforma completa per il tunneling sicuro del traffico, il port forwarding, la gestione di reti complesse e la protezione delle comunicazioni. Questa guida esplora le funzionalità avanzate di SSH, con esempi pratici e configurazioni pronte per la produzione.
Che tu voglia accedere a un database interno senza esporlo su Internet, creare un proxy SOCKS dinamico o blindare un server SSH contro attacchi brute force, qui troverai tutto ciò che ti serve.
Prerequisiti
Prima di procedere, assicurati di avere:
- OpenSSH client e server installati (versione 7.x o superiore consigliata)
- Accesso root o sudo al server di destinazione
- Conoscenza base della gestione dei file di configurazione Linux
- Una coppia di chiavi SSH già generata (
ssh-keygen -t ed25519) - Familiarità con il concetto di porte TCP/IP
Generare e Gestire le Chiavi SSH
Il primo passo verso una configurazione SSH sicura è abbandonare le password e adottare l’autenticazione a chiave pubblica. Usa Ed25519, l’algoritmo più sicuro e performante disponibile:
# Genera una chiave Ed25519 con commento identificativo ssh-keygen -t ed25519 -C "user@hostname-$(date +%Y%m%d)" -f ~/.ssh/id_ed25519_prod # Copia la chiave pubblica sul server remoto ssh-copy-id -i ~/.ssh/id_ed25519_prod.pub user@192.168.1.100 # Verifica che l'autenticazione funzioni ssh -i ~/.ssh/id_ed25519_prod user@192.168.1.100
Configura il file ~/.ssh/config per gestire più host in modo ordinato:
Host prod-server
HostName 192.168.1.100
User deploy
IdentityFile ~/.ssh/id_ed25519_prod
ServerAliveInterval 60
ServerAliveCountMax 3
Compression yes
Host bastion
HostName bastion.example.com
User jumpuser
IdentityFile ~/.ssh/id_ed25519_bastion
ForwardAgent no
Local Port Forwarding
Il local port forwarding consente di redirigere una porta locale verso un host remoto attraverso un tunnel SSH cifrato. È ideale per accedere a servizi interni come database, pannelli di controllo o API non esposte pubblicamente.
Sintassi e Esempio Pratico
# Sintassi: ssh -L [local_addr:]local_port:remote_host:remote_port user@ssh_server # Accesso a MySQL remoto sulla porta locale 3307 ssh -L 3307:localhost:3306 user@192.168.1.100 -N -f # Ora puoi connetterti a MySQL tramite: mysql -h 127.0.0.1 -P 3307 -u dbuser -p # Accesso a un pannello admin su un server interno ssh -L 8080:internal-app.local:80 user@bastion.example.com -N -f
Il flag -N indica a SSH di non eseguire comandi remoti, mentre -f manda il processo in background. Questo è il pattern standard per tunnel persistenti.
Remote Port Forwarding
Il remote port forwarding fa l’opposto: espone una porta locale su un server remoto. È utile per condividere temporaneamente un servizio locale (ad esempio durante lo sviluppo) senza configurare regole firewall.
# Sintassi: ssh -R [remote_addr:]remote_port:local_host:local_port user@ssh_server # Espone il server locale sulla porta 3000 come porta 9000 del server remoto ssh -R 9000:localhost:3000 user@192.168.1.100 -N -f # Permetti connessioni da qualsiasi IP (richiede GatewayPorts yes nel server) ssh -R 0.0.0.0:9000:localhost:3000 user@192.168.1.100 -N -f
Attenzione: per abilitare il remote forwarding verso indirizzi non-loopback, devi configurare GatewayPorts yes in /etc/ssh/sshd_config sul server remoto.
Dynamic Port Forwarding e Proxy SOCKS
Il dynamic port forwarding trasforma SSH in un proxy SOCKS5 completo. Tutto il traffico instradato attraverso il proxy verrà cifrato e uscirà dal server SSH remoto, nascondendo la tua posizione e cifrando le comunicazioni.
# Crea un proxy SOCKS5 sulla porta locale 1080 ssh -D 1080 user@192.168.1.100 -N -f # Usa il proxy con curl curl --proxy socks5h://127.0.0.1:1080 https://api.internal.example.com # Usa il proxy con wget wget -e "https_proxy=socks5h://127.0.0.1:1080" https://target.example.com # Configura Firefox o Chrome per usare il proxy SOCKS5 # Host: 127.0.0.1, Porta: 1080, Tipo: SOCKS5
Questo approccio è ampiamente usato per accedere a risorse interne aziendali o per navigare sicuramente da reti non fidate come il Wi-Fi pubblico.
Jump Host e ProxyJump
In architetture multi-livello, spesso è necessario passare attraverso un bastion host per raggiungere server interni. SSH offre la direttiva ProxyJump per semplificare questo processo:
# Connessione attraverso un bastion host (metodo moderno)
ssh -J jumpuser@bastion.example.com:22 deploy@internal-server.local
# Configurazione nel file ~/.ssh/config
Host internal-db
HostName 10.0.0.50
User dbadmin
ProxyJump bastion
IdentityFile ~/.ssh/id_ed25519_prod
Host bastion
HostName bastion.example.com
User jumpuser
IdentityFile ~/.ssh/id_ed25519_bastion
ForwardAgent no
# Ora basta:
ssh internal-db
Il metodo ProxyJump è più sicuro dell’obsoleto ProxyCommand con -A (agent forwarding), poiché non espone l’agent SSH sui server intermedi.
Hardening del Server SSH
Una configurazione SSH di default lascia aperte numerose vulnerabilità. Ecco un file /etc/ssh/sshd_config hardened e commentato:
# === AUTENTICAZIONE === PasswordAuthentication no ChallengeResponseAuthentication no UsePAM yes PermitRootLogin no PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys # === PROTOCOLLO E CIFRATURA === Protocol 2 HostKey /etc/ssh/ssh_host_ed25519_key HostKey /etc/ssh/ssh_host_rsa_key # Algoritmi sicuri (OpenSSH 8.x+) KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group16-sha512 Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com # === RESTRIZIONI DI ACCESSO === AllowUsers deploy admin AllowGroups sshusers LoginGraceTime 30 MaxAuthTries 3 MaxSessions 5 MaxStartups 10:30:60 # === FUNZIONALITÀ === X11Forwarding no AllowTcpForwarding yes AllowAgentForwarding no PermitTunnel no AllowStreamLocalForwarding no # === TIMEOUT E KEEPALIVE === ClientAliveInterval 300 ClientAliveCountMax 2 TCPKeepAlive no # === BANNER === Banner /etc/ssh/banner.txt PrintLastLog yes
Dopo aver modificato il file, verifica la sintassi e riavvia il servizio:
sudo sshd -t && sudo systemctl restart sshd
Autenticazione a Due Fattori con SSH
Per massimizzare la sicurezza, puoi combinare chiave pubblica e OTP (One-Time Password) con Google Authenticator o libpam-oath:
# Installa il modulo PAM sudo apt install libpam-google-authenticator # Configura per l'utente corrente google-authenticator -t -d -f -r 3 -R 30 -w 3 # Aggiungi a /etc/pam.d/sshd auth required pam_google_authenticator.so # In sshd_config: ChallengeResponseAuthentication yes AuthenticationMethods publickey,keyboard-interactive
Tunnel Persistenti con AutoSSH
AutoSSH è lo strumento ideale per mantenere tunnel SSH sempre attivi, con riconnessione automatica in caso di interruzione:
# Installa autossh sudo apt install autossh # Tunnel persistente verso database remoto autossh -M 20000 -f -N -L 3307:localhost:3306 -i ~/.ssh/id_ed25519_prod user@192.168.1.100 # Crea un servizio systemd per il tunnel # /etc/systemd/system/ssh-tunnel-db.service [Unit] Description=SSH Tunnel to Production DB After=network.target [Service] User=tunnel ExecStart=/usr/bin/autossh -M 20001 -N -L 3307:localhost:3306 -i /home/tunnel/.ssh/id_ed25519_prod user@192.168.1.100 Restart=always RestartSec=5 [Install] WantedBy=multi-user.target
sudo systemctl enable ssh-tunnel-db sudo systemctl start ssh-tunnel-db
Troubleshooting
Problemi Comuni e Soluzioni
- Porta già in uso: Se ricevi bind: Address already in use, un tunnel precedente è ancora attivo. Usa
lsof -i :3307per trovarlo ekill -9 PIDper terminarlo. - Permessi chiave SSH: OpenSSH rifiuta chiavi con permessi troppo permissivi. Esegui
chmod 600 ~/.ssh/id_ed25519echmod 700 ~/.ssh/. - Connessione rifiutata dopo hardening: Verifica che il tuo utente sia in
AllowUserse che la porta SSH sia aperta nel firewall:sudo ufw allow 22/tcp. - Tunnel si disconnette: Aumenta i valori di
ServerAliveIntervalnel client e considera l’uso di autossh per tunnel critici. - GatewayPorts non funziona: Assicurati che
GatewayPorts yessia presente insshd_confige che il servizio sia stato riavviato.
Debug Avanzato
# Modalità verbose per diagnosticare problemi di connessione ssh -vvv user@192.168.1.100 # Testa la configurazione sshd senza riavviare sudo sshd -T | grep -E 'allowusers|passwordauth|pubkeyauth' # Monitora i log SSH in tempo reale sudo journalctl -fu sshd # Verifica le connessioni SSH attive ss -tnp | grep :22
Conclusione
SSH è uno strumento straordinariamente potente che va ben oltre la semplice connessione remota. Con il port forwarding, i tunnel dinamici, il ProxyJump e una configurazione server hardened, puoi costruire infrastrutture di rete sicure e flessibili senza dipendere da VPN commerciali o soluzioni complesse.
La chiave è adottare un approccio a strati: autenticazione forte con chiavi Ed25519, eliminazione delle password, restrizione degli utenti autorizzati e cifrature moderne. Combinando queste pratiche con autossh per la resilienza e systemd per la persistenza, avrai un’infrastruttura SSH di livello enterprise pronta per la produzione.
SSH Avanzato: Tunnel, Port Forwarding e Sicurezza
enjoy 😉

