Nivel: Avansat
Data ultimei modificări: 2014.09.01
În afară de funcția clasică a SSH-ului de a ne oferi o consolă pe un
server la distanță, putem folosi tunelul SSH creat pentru diverse
alte scopuri. Pentru claritate vom considera că ne conectăm de pe
un laptop iar calculatorul la care ne conectăm este un server.
Dacă vrem să accesăm un serviciu ascuns în spatele unui firewall putem
folosi conexiunea SSH pentru acces. Un exemplu ar fi accesul la MySQL
când portul 3306 e blocat.
ssh -fNnT -L 6606:127.0.0.1:3306 cosmin@mysql.rohost.com
# -f trece ssh-ul in background
# -N nu execută comandă remote
# -n împiedică citirea din stdin
# -T nu alocă tty
# -L local port forwarding
Comanda de mai sus conectează portul 6606 de pe calculatorul ce rulează
comanda cu portul 3306 de la IP-ul 127.0.0.1, așa cum sunt ele văzute
din perspectiva serverului destinație, în acest caz mysql.rohost.com.
Astfel, orice conectare de pe propriul calcular la portul 6606 ne va da
acces la MySQL-ul de pe serverul respectiv.
Dacă folosim des comanda de mai sus merită introdusă în configul de
SSH (**~/.ssh/config**):
Host db
HostName mysql.rohost.com
LocalForward 6606 127.0.0.1:3306
User cosmin
În urma acestei setări vom putea în continuare folosi forma prescurtată
de mai jos. Dacă nu dorim păstrarea tunelului o perioadă mai lungă putem
omite parametrul -f și astfel vom avea tunelul activ până când oprim
comanda cu CTRL+C.
# deschide tunel folosind alias-ul 'db' din config-ul SSH
ssh -fN db
Dacă dorim să ieșim pe Internet printr-un alt IP, nu prin cel folosit
în mod uzual, putem crea un SOCKS proxy cu ajutorul comenzii de mai jos.
După rularea comenzii putem configura browserul pentru a folosi ca
proxy 127.0.0.1:9999
Uneori este de ajutor folosirea unui add-on pentru browser, de exemplu
FoxyProxy pentru Firefox.
Un astfel de add-on ne permite folosirea proxy-ului pentru anumite
site-uri iar pentru celelalte putem folosi conexiunea obișnuită.
ssh -fN -D 127.0.0.1:9999 cosmin@rohost.com
În urma folosirii proxy-ului pentru accesarea Internetului, traficul
între noi și serverul folosit va fi criptat. De asemenea, toate
acțiunile noastre va apărea ca având originea serverului pe care am
făcut tunelul SSH.
Dacă dorim să facem accesibil un port local dar suntem în spatele unui
firewall ne putem folosi de accesul SSH la orice server public accesibil.
ssh -fN -R 80:127.0.0.1:8080 cosmin@rohost.com
# -R remote port forwarding
Comanda este similară cu comanda de local port forwarding însă cu
-R în loc de -L.
Serverul trebuie să aibă în /etc/ssh/sshd_config opțiunea GatewayPorts yes.
În acest scenariu, in plus față de cel anterior, conexiunea SSH va fi
refăcută automat de către autossh, chiar dacă IP-ul calculatorului dv.
s-a modificat.
# creare tunel persisten
autossh -f -- -o 'ControlPath none' -R 9999:127.0.0.1:22 cosmin@rohost.com -fN
# de pe server putem mai apoi accesa calculatorul de după firewall
ssh 127.0.0.1 -p 9999
Exista cazuri în care părăsirea sesiunii SSH este incomodă astfel
SSH-ul ne ofera posibilitatea de a efectua anumite acțiuni speciale.
Dacă tipărim caracterul ~ la început de linie vom avea acces
la aceste acțiuni speciale astfel:
În situațiile în care suntem deja logați pe un server și dorim să
copiem fișiere fără a părăsi sesiunea curentă sau fără a deschide
o sesiune nouă.
# tastăm Enter pentru a obține o line nouă
# ~C pentru commandline fără a opri sesiunea SSH
# Crează tunelul necesar pentru copiere
ssh> -R 4000:localhost:22
# copierea propriu zisă prin tunelul creat mai sus
scp -P 4000 file.tar.gz localhost:/calea/pe/laptop
ssh user@server "/usr/bin/mysqldump -u user -p password database" | dd of=/tmp/dump.sql
tar -cz director | ssh cosmin@rohost.com "cat > director.tar.gz"
Dacă avem mai multe servere în spatele unui firewall pe care putem
ajunge de pe un server gateway în mod normal intrăm de pe laptop
pe gateway (aici rohost.com) iar apoi de pe gateway pe server
(servere de forma s**.rohost.com).
Alternativ putem intra cu o singură comandă pe server.
ssh -t proxy@rohost.com ssh root@s33.rohost.com
Pentru a simplifica comanda putem folosi config-ul de ssh.
Toate comenzile de ssh ce au forma din exemplu vor trece
automat prin gateway înainte de a ajunge la serverul final.
# add to .ssh/config
Host gateway
User proxy
HostName rohost.com
Host s**.rohost.com
ProxyCommand ssh -q gateway nc -w 1 %h 22
SSH-ul are o funcționalitate foarte extinsă.
Pentru că acestea nu pot fi prezentate pe larg aici voi adăuga link-uri pentru cei interesați: