Tips SSH - tunnels et rebonds

Posted on August 9, 2014

Tunnels et tunnels inversés

Tunnel simple

Premier cas : on est à l’extérieur et on souhaite accéder à une machine (sur un port particulier) dans le réseau local de chez nous en passant par une machine à laquelle on peut accéder via ssh.

simple tunnel ssh

# portlocal : port sur notre ordinateur portable (à l'extérieur)
# machine : ordinateur dans le réseau local chez nous
# portmachine : port de ce même ordinateur
# remote-ssh : notre domaine
ssh -L portlocal:machine:portmachine remote-ssh
ssh -L 5000:192.168.0.1:80 chezmoi # exemple

Description rapide: on veut accéder à machine depuis un hôte distant (remote-ssh) qui servira de rebond. On s’y connecte et portlocal sera utilisé pour atteindre de façon transparente portmachine sur la machine distante. L’exemple donné est qu’on cherche à accéder à notre box depuis l’extérieur, en ayant un accès ssh à une machine de notre réseau local.

Ainsi, sur notre exemple, depuis notre machine à l’extérieur de notre réseau local on fait localhost:5000 dans notre navigateur on accède en réalité au port 80 de notre box chez nous.

Tunnel inversé

Second cas : on est à l’extérieur et on souhaite qu’une machine dans notre réseau local puisse accéder à un port de notre machine à l’extérieur.

tunnel ssh inversé

# machine : ordinateur extérieur accédé depuis le réseau local chez nous
# portmachine : port de ce même ordinateur
# remote-ssh : notre domaine
# portdistant : port sur notre ordinateur du réseau local chez nous
ssh -TR portdistant:machine:portmachine remote-ssh
ssh -TR 1111:localhost:80 chezmoi # exemple

Le but de cette manœuvre est qu’une machine distante puisse accéder à un port en local en traversant le NAT. Il y a un port qui s’ouvre sur la machine distante, et tout ce qui passe dessus est redirigé vers un port en local.

Ici, la machine « chez moi » pourra accéder en local depuis son port 1111 à ma machine au port 80.

Les options :

  • -T pour ne pas ouvrir de shell
  • -R pour faire un tunnel inversé

Rebonds ssh

On est sur sa machine fixe, on veut accéder à une machine distante A, mais on n’a qu’une connexion à B dans son réseau local. On va donc utiliser la machine B pour accéder à A, mais on n’a pas de clé ssh pour accéder à A depuis B ! Oui, la vie est cruelle. Il faut donc utiliser B comme un simple rebond pour accéder à A.

Le rebond va simplement être utilisé pour ouvrir une socket réseau sur le port utilisé par SSH sur la machine à laquelle on cherche à accéder depuis notre machine rebond. On va écrire et lire dans cette socket comme si on accédait directement à la machine distante, de façon transparente de cette manière.

Configuration .ssh/config sur ma machine locale :

Host B
  Hostname B.example.com
  User philippe
  Port 2222
  IdentityFile /home/%u/.ssh/id_dsa_b

Host A
  Hostname A.example.com
  User philippe
  ProxyCommand ssh B "nc -q 0 %h %p"

tunnel ssh inversé

ssh A

Voici ce qui se passe :

Je suis sur mon ordinateur (utilisateur : philippe), dans mon .ssh/config il y a les deux host A et B. Si je fais ssh B je vais sur B.example.com.

Si je fais ssh A je passe par ProxyCommand qui se connecte à B puis lance netcat (nc) qui lui se connecte à %h qui est A. On se retrouve sur A tout en étant passé par B.

C’est d’autant plus intéressant quand on souhaite accéder à des machines dans un sous-réseau distant en passant par une seule machine (avec le dns correctement configuré). Dans ce cas on peut utiliser des wildcards (étoiles) pour indiquer toutes les machines dans un domaine :

Host *.example.com
  ProxyCommand ssh Rebond "nc -q 0 %h %p"

Et là on fait un simple ssh blah.example.com et on y accède en passant par Rebond.

Références

Tous ces tricks sont pompés du blog de sebian.

Tags: ssh