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 😉


This is one of the most comprehensive SSH guides Ive ever come across covering everything fromm Ed25519 key generation to ProxyJump multi-hop configuration and system based persistent tunnels is impressive. Topic like these are core discussions in our program at Telkom University Surabaya, particularly in our network security and server administration courses. The example sshd config fortified with a modern cipher suite is something I’ll definitely reference for our labs YEAYY