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.
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é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
.
Tous ces tricks sont pompés du blog de sebian.