Ets a la feina, en un tren o en una cafeteria, i de cop necessites un fitxer que tens a l’ordinador de casa. O vols reiniciar un servei que s’ha penjat. Obres el terminal, escrius ssh i… res. El router de casa no et deixa passar.
T’ha passat? Doncs avui ho arreglarem amb una de les eines més elegants del món Linux: el túnel SSH invers.
Què és un túnel SSH invers i per què el necessites?
Un túnel SSH normal funciona com sempre: tu et connectes a un servidor. Un túnel invers gira la jugada. És la màquina amagada la que es connecta a un servidor extern i hi deixa un «fil» obert, perquè tu puguis tornar per aquell mateix fil.
El problema: la teva màquina viu darrere d’un NAT
La majoria de connexions domèstiques no et donen una IP pública fixa. Moltes operadores fan servir CG-NAT, que vol dir que comparteixes IP amb altres clients.
És com viure en un bloc de pisos sense número a la bústia: el carter no sap on deixar-te les cartes. Pots obrir ports al router? De vegades sí. Però de vegades no tens accés al router, l’operadora no et deixa o simplement no vols exposar casa teva a internet.
La solució: que sigui casa qui truqui a la porta
Aquí entra la gràcia del túnel invers. Les connexions de sortida gairebé mai estan bloquejades. Per tant, si és l’Ubuntu de casa qui truca a un servidor públic i manté la línia oberta, ja tens el camí fet.
Pensa-ho com un walkie-talkie que deixes encès: no cal que ningú et trobi, perquè tu ja estàs connectat.
L’escenari: tres màquines, un objectiu
Abans de tocar res, posem nom a les peces. Ens basarem en aquest muntatge.
Ubuntu (casa): la màquina a la xarxa privada
És l’ordinador al qual vols arribar. És darrere del router, sense IP pública, i no accepta connexions des de fora. Serà ell qui obrirà el túnel.
VPS (remot): el pont amb IP pública
Un servidor barat a qualsevol proveïdor, amb una IP pública i un nom com vps.tudomini.com. Fa de punt de trobada, com una plaça on quedes amb algú perquè cap dels dos sap on viu l’altre.
El portàtil: el teu punt de partida
L’ordinador des d’on et vols connectar. Pot ser a qualsevol lloc del món: només necessita poder arribar al VPS.
El flux, resumit:
[Portàtil] ──ssh──▶ [VPS :2222] ◀══túnel══ [Ubuntu casa :22]
Preparatius abans de començar
Cinc minuts de preparació t’estalvien una hora de maldecaps. Val la pena, no?
Comprova que tens SSH a punt
A l’Ubuntu de casa necessites el servidor SSH, perquè hi entraràs:
sudo apt update
sudo apt install openssh-server
sudo systemctl enable --now ssh
Al VPS normalment ja ve instal·lat. Al portàtil només et cal el client, que Linux, macOS i Windows 10/11 ja porten de sèrie.
Configura l’autenticació amb claus
Un túnel que ha d’arrencar sol no pot dependre que algú escrigui una contrasenya. Per això crearem una clau específica per al túnel a l’Ubuntu:
ssh-keygen -t ed25519 -f ~/.ssh/id_tunel -C "tunel-casa"
Deixa la contrasenya de la clau en blanc, que el servei ha de poder fer-la servir sense intervenció. Després copia-la al VPS:
ssh-copy-id -i ~/.ssh/id_tunel.pub usuari@vps.tudomini.com
Un bon consell: crea al VPS un usuari dedicat només al túnel (per exemple, tunel). Si mai es compromet la clau, el dany queda acotat.
Pas a pas: crear el túnel invers
Ara ve la part divertida.
Obrir el túnel des de l’Ubuntu
Des de l’Ubuntu de casa, executa:
ssh -N -R 2222:localhost:22 -i ~/.ssh/id_tunel usuari@vps.tudomini.com
Sembla que no passa res, oi? Perfecte: vol dir que funciona. El terminal es queda «penjat» perquè manté el túnel obert.
Què vol dir cada paràmetre?
-R 2222:localhost:22: el cor de tot. Diu al VPS que escolti al seu port 2222 i que tot el que hi arribi ho enviï pel túnel cap al port 22 de l’Ubuntu.-N: no executis cap ordre remota, només mantén el túnel.-i ~/.ssh/id_tunel: la clau que farem servir.usuari@vps.tudomini.com: on truquem.
Per defecte, el port 2222 del VPS només escolta a localhost, és a dir, només és accessible des del mateix VPS. I això, com veurem, és una bona notícia.
Connectar-te des del portàtil
Amb el túnel obert, tens tres maneres d’entrar.
Opció A: en dos salts
La més intuïtiva. Primer entres al VPS:
ssh usuari@vps.tudomini.com
I des del VPS, saltes a casa:
ssh -p 2222 usuari_casa@localhost
Funciona, però és com entrar a casa per la finestra del veí: fa la feina i prou.
Opció B: amb ProxyJump
Una sola ordre des del portàtil:
ssh -J usuari@vps.tudomini.com -p 2222 usuari_casa@localhost
L’opció -J diu a SSH que passi pel VPS i, des d’allà, connecti a localhost:2222, que és l’entrada del túnel. Net i directe.
Opció C: un àlies a ~/.ssh/config
Si ho faràs sovint, no t’ho aprenguis de memòria. Edita ~/.ssh/config al portàtil:
Host vps
HostName vps.tudomini.com
User usuari
Host casa
HostName localhost
Port 2222
User usuari_casa
ProxyJump vps
A partir d’ara només cal escriure:
ssh casa
I ja hi ets. També funciona amb scp, rsync i l’extensió Remote-SSH de VS Code.
Fes que el túnel no caigui mai
Fins ara tenim un túnel que viu mentre el terminal estigui obert. Però què passa si el router es reinicia o la connexió parpelleja? El túnel mor i no ressuscita sol. Hem de posar-li un sistema de suport vital.
autossh: el vigilant del túnel
autossh és un petit programa que vigila la connexió SSH i la reobre si cau:
sudo apt install autossh
I l’ordre queda així:
autossh -M 0 -N \
-o "ServerAliveInterval 30" \
-o "ServerAliveCountMax 3" \
-o "ExitOnForwardFailure yes" \
-i ~/.ssh/id_tunel \
-R 2222:localhost:22 usuari@vps.tudomini.com
Cada opció té la seva feina:
-M 0: desactiva el port de monitoratge propi d’autossh i deixa la detecció a les opcions de SSH.ServerAliveIntervaliServerAliveCountMax: cada 30 segons comprova que l’altre costat respon. Si falla tres vegades, talla la connexió perquè autossh la reobri.ExitOnForwardFailure yes: si el port 2222 no es pot obrir, SSH surt en lloc de quedar-se connectat sense túnel. Així autossh torna a provar-ho.
Un servei systemd perquè arrenqui sol
L’últim pas: que el túnel s’aixequi tot sol quan l’Ubuntu arrenca. Crea /etc/systemd/system/tunel-ssh.service:
[Unit]
Description=Túnel SSH invers cap al VPS
After=network-online.target
Wants=network-online.target
[Service]
User=usuari_casa
Environment="AUTOSSH_GATETIME=0"
ExecStart=/usr/bin/autossh -M 0 -N \
-o "ServerAliveInterval 30" \
-o "ServerAliveCountMax 3" \
-o "ExitOnForwardFailure yes" \
-i /home/usuari_casa/.ssh/id_tunel \
-R 2222:localhost:22 usuari@vps.tudomini.com
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
Activa’l:
sudo systemctl daemon-reload
sudo systemctl enable --now tunel-ssh
sudo systemctl status tunel-ssh
Ara el túnel és com el llum de l’escala: hi és sempre, i ni te’n recordes que existeix.
⚠️ Abans d’arrencar el servei, connecta’t almenys un cop manualment al VPS amb aquest usuari. Així acceptes l’empremta del servidor i el servei no es queda encallat preguntant-te-la.
Seguretat: no deixis la porta oberta de bat a bat
Un túnel és, literalment, un passadís cap a casa teva. Val la pena posar-hi pany, no creus?
GatewayPorts: obrir-lo al món o no?
Al fitxer /etc/ssh/sshd_config del VPS hi ha l’opció GatewayPorts. Si l’actives, el port 2222 pot escoltar a totes les interfícies i qualsevol persona d’internet hi podria arribar directament.
És còmode? Sí. És recomanable? Gairebé mai. Amb ProxyJump ja tens accés directe des del portàtil sense exposar el port. Deixa GatewayPorts no, que és el valor per defecte, i dormiràs més tranquil.
Limita què pot fer la clau del túnel
Al VPS, a ~/.ssh/authorized_keys de l’usuari del túnel, pots restringir la clau perquè només serveixi per obrir aquest túnel:
restrict,port-forwarding,permitlisten="localhost:2222" ssh-ed25519 AAAA... tunel-casa
Què hi guanyes?
restrictdesactiva shell interactiu, reenviament d’agent, X11 i la resta.port-forwardingtorna a permetre només els reenviaments.permitlistenlimita l’escolta alocalhost:2222.
Si algú roba aquesta clau, no podrà ni obrir un terminal al VPS. Necessites OpenSSH 7.8 o posterior, que qualsevol distribució actual ja porta.
I de propina:
- Desactiva l’accés amb contrasenya al VPS i a l’Ubuntu (
PasswordAuthentication no). - Instal·la
fail2banal VPS per frenar els bots que proven contrasenyes. - Mantén el sistema actualitzat. Avorrit, però vital.
Problemes habituals i com resoldre’ls
«remote port forwarding failed for listen port 2222»
El port ja està ocupat, sovint per una sessió anterior que no s’ha tancat bé. Espera un minut o afegeix al sshd_config del VPS:
ClientAliveInterval 30
ClientAliveCountMax 3
Així el VPS també detecta i tanca les connexions mortes.
«Connection refused» en connectar a localhost:2222
El túnel no està actiu. Mira-ho a l’Ubuntu amb systemctl status tunel-ssh i amb journalctl -u tunel-ssh -f.
El servei arrenca però no connecta
Revisa que la ruta de la clau sigui absoluta i que l’usuari del servei en tingui permisos. Recorda també el tema de l’empremta que hem vist abans.
Vull més d’un servei
Pots encadenar diversos -R. Per exemple, -R 2222:localhost:22 -R 8080:localhost:80 porta també la web local al port 8080 del VPS.
Conclusió
El túnel SSH invers és d’aquells trucs que, un cop entens, et canvien la manera de treballar. No necessites IP fixa, no has de barallar-te amb el router i no exposes res innecessàriament.
Amb un VPS econòmic, una ordre ssh -R, un vigilant com autossh i un servei systemd, tens una línia directa i permanent cap a casa. Si a més hi afegeixes claus restringides i ProxyJump, el resultat és tan còmode com segur.
Així que la pròxima vegada que siguis lluny i necessitis aquell fitxer, només caldrà escriure ssh casa. Senzill, oi?
Preguntes freqüents
Necessito un VPS potent per fer de pont?
No. El VPS només reenvia trànsit, així que el més petit del catàleg ja en té prou. El que importa és que tingui IP pública i una connexió estable.
Puc fer servir un port diferent del 2222?
I tant. Qualsevol port lliure per sobre del 1024 funciona sense permisos de root al VPS. Només cal que facis servir el mateix número a l’ordre -R i a la configuració del portàtil.
El trànsit que passa pel túnel va xifrat?
Sí, de punta a punta. El tram Ubuntu–VPS va dins la connexió SSH del túnel, i la teva sessió des del portàtil és una connexió SSH pròpia que viatja per dins. El VPS no pot llegir el que fas a casa.
Puc connectar diversos ordinadors de casa al mateix VPS?
Sí. Assigna a cadascun un port diferent (2222, 2223, 2224…) i crea un àlies per a cada un al teu ~/.ssh/config.
Quina diferència hi ha amb una VPN com WireGuard o Tailscale?
Una VPN connecta xarxes senceres i et dona accés a tots els serveis de la màquina. El túnel invers és més quirúrgic: obre només els ports que tu decideixes. Per a accés SSH puntual, el túnel és més senzill. Si vols accés complet i permanent a tota la xarxa, una VPN pot encaixar millor.