SSH+

Î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.

Local port forwarding

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

SOCKS5 ssh proxy

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.

Remote port forwarding

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.

Persistent reverse ssh tunneling cu autossh

Î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

Escape Character ~

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:

  • ~? listeaza opțiunile speciale documentate
  • ~. închide conexiunea inclusiv multiplexările dacă există
  • ~B trimite BREAK la sistemul de la distanță
  • ~C deschide o linie de comandă
  • ~R cere rekey
  • ~V/v schimbă verbositatea (LogLevel)
  • ~^Z suspendă ssh
  • ~~^Z suspendă conexiunea anterioară (in cazul unui chain SSH)
  • ~# listează conexiunile forwardate
  • ~& mută SSH-ul în background ssh
  • ~~ escape-uie caracterul ~

Reverse SSH pe conexiune existentă

Î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

Remote to local mysql backup

ssh user@server "/usr/bin/mysqldump -u user -p password database" | dd of=/tmp/dump.sql

Redirect STDOUT local către un fișir pe server

tar -cz director | ssh cosmin@rohost.com "cat > director.tar.gz"

SSH Chain

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

Alte resurse

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:

Conținutul acestui site reflectă interesele și preferințele autorilor.