Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Ssh sur une machine invisible de l'exterieur

8 réponses
Avatar
Remi Moyen
Salut,

J'ai chez moi un petit réseau, avec une machine connectée à internet, et
d'autres connectées à cette première machine.

Depuis l'exterieur de mon réseau, si je veux me connecter (par ssh) à
l'une de mes machines (autre que la plateforme), je dois faire :
ssh plateforme.chez.moi
[blurp de login]
ssh machine_cachee

Et si je veux copier des fichiers de machine_cachee vers ma machine
exterieure, c'est encore pire, puisque je dois faire :
ssh plateforme.chez.moi
ssh machine_cachee
scp fichiers machine.exterieure.ailleurs:...
Bref, 3 commandes là où une seule devrait suffire (par exemple, si je suis
chez moi, je n'ai que la troisième commande à taper).

(je viens de me rendre compte que je peux simplifier avec que le premier
ssh, puis un scp machine_cachee:... machine.exterieure.ailleurs:... Mais
ça change rien sur le principe.)

Ce que j'aimerais faire, c'est configurer mon serveur ssh sur plateforme
pour que je puisse, de l'exterieur, taper ssh machine_cachee.chez.moi (ou
machine_cachee.plateforme.chez.moi, je m'en ficher), et que la plateforme
s'occuppe toute seule de rediriger ça là où il faut.

Je croyais que c'était à peu de choses près ce qu'on appelle du tunneling
ou du port-forwarding, mais la lecture de quelques docs me montre que ce
n'est pas le cas. Du coup, je ne trouve pas grand chose sur google
(probablement parce que je n'ai pas le bon mot-clé...).

Merci !
--
Rémi Moyen
"Malgré les apparences, le temps est très varié à Nancy :
pluie, nuages, neige, brouillard, grêle, ..."

8 réponses

Avatar
Michel Tatoute
Le Wed, 15 Oct 2003 12:05:51 +0200, Remi Moyen a écrit :

Salut,

J'ai chez moi un petit réseau, avec une machine connectée à internet, et
d'autres connectées à cette première machine.



une solution:

tu configure le firewall pour rediriger les connexions tcp sur un port autre
que le port 22 (ssh), par exemple 2222, vers la machine interne.

ensuite :

ssh -p 2222

Michel.

Avatar
Michel Tatoute
Le Wed, 15 Oct 2003 12:05:51 +0200, Remi Moyen a écrit :

Salut,

J'ai chez moi un petit réseau, avec une machine connectée à internet, et
d'autres connectées à cette première machine.



une solution:

tu configure le firewall pour rediriger les connexions tcp sur un port autre
que le port 22 (ssh), par exemple 2222, vers la machine interne.
Tu configure la machine interne pour ecouter ssh sur le port 2222 (en plus
du port 22 si tu veux). voir /etc/ssh/sshd_config .

ensuite :

ssh -p 2222

Michel.

Avatar
Remi Moyen
On Wed, 15 Oct 2003, Michel Tatoute wrote:

J'ai chez moi un petit réseau, avec une machine connectée à internet, et
d'autres connectées à cette première machine.



une solution:

tu configure le firewall pour rediriger les connexions tcp sur un port autre
que le port 22 (ssh), par exemple 2222, vers la machine interne.
Tu configure la machine interne pour ecouter ssh sur le port 2222 (en plus
du port 22 si tu veux). voir /etc/ssh/sshd_config .

ensuite :

ssh -p 2222


Pas bête. Oui, merci.

Mais j'avais entendu parler d'une config qui permettrait de faire
directement un ssh machine.firewall.domaine (ou machine.domaine),
j'aimerais bien savoir si c'est faisable.

Je garde ta solution, pour sinon.
--
Rémi Moyen
"Malgré les apparences, le temps est très varié à Nancy :
pluie, nuages, neige, brouillard, grêle, ..."


Avatar
Michel Tatoute
Le Wed, 15 Oct 2003 17:06:31 +0200, Remi Moyen a écrit :

Mais j'avais entendu parler d'une config qui permettrait de faire
directement un ssh machine.firewall.domaine (ou machine.domaine),
j'aimerais bien savoir si c'est faisable.

Je garde ta solution, pour sinon.


Oui mais non.

Si tu est connecté par un FAI qui te délivre une seule adresse IP, ce
n'est probablement pas possible. En effet quand tu vas demander

ssh machine.firewall.domaine

ssh va demander au DNS d'internet de résoudre "machine.firewall.domaine"
(ou autre), puis il va utiliser l'adresse IP numérique obtenue pour se
connecter.

Or soit l'adresse obtenue est celle de ton firewall, et donc tu n'aura pas
le moyen d'identifier l'appellant,

Soit l'adresse obtenue est différente de celle du firewall, et elle ne
sera pas routée chez toi (selon l'hypothèse 1 seule IP).

Bon, ca c'est au niveau IP (donc en ignorant les details propres à ssh).

Tu peux essayer de te placer au niveau protocole ssh.

Je ne sais pas si ssh transmet le "nom machine.nom de domaine" dans le
hand-shake initial en clair. Si oui tu peux arriver à ton but à
condition:

1) de réussir placer une entrée DNS pour
"machine_cachee.firewall.domaine" 2) d'intercepter le début de la
connexion ssh, 3) de lire le nom de machine,
4) de creer un chemin adéquat avec iptable.

je ne sais pas faire 2,3,4, mais cela est théoriquement possible.

Sinon, cela devient plus dur et moins securisé, car une fois le
handshaking passé, le reste est crypté (bien sûr). Il faudrait donc que
le firewall soit recepteur de la connexion, puis là retransmette à
"machine cachée". Je ne sais pas si c'est possible (pour scp en plus)
mais en tout cas cela va déclencher un problème de "man in the middle":
une personne mal intentionnée pourra substituer à "machine cachée" une
"machine espion" qui fera le relai pour "machine cachée" tout en
écoutant ta conversation. Tu n'y verra rien.

Un VPN peut ésoudre ton probleme en transformant ta "machine d'acces"
(celle ou tu tapes "ssh") en une machine de ton réseau local, au même
titre que "machine cachée". Mais n'oublie pas de proteger "machine
d'acces" de sa connexion internet propre par un firewall car elle est dans
ton réseu privé.

Enfin tu peux emboiter ssh dans ssh.

machine_d_acces$ ssh -N -L 22:nom_machine_cachee_vu_reseau_local:22
firewall.domaine
's password:
machine_d_acces$ ssh 127.0.0.1
machine_cachee$ exit
machine_d_acces$ scp fichier.txt :./
's password:
fichier.txt 100% 2136 193.3KB/s 00:00
machine_d_acces$

voila.
Michel.

Avatar
Michel Tatoute
Le Wed, 15 Oct 2003 17:06:31 +0200, Remi Moyen a écrit :

Mais j'avais entendu parler d'une config qui permettrait de faire
directement un ssh machine.firewall.domaine (ou machine.domaine),
j'aimerais bien savoir si c'est faisable.

Je garde ta solution, pour sinon.


Oui mais non.

Si tu est connecté par un FAI qui te délivre une seule adresse IP, ce
n'est probablement pas possible. En effet quand tu vas demander

ssh machine.firewall.domaine

ssh va demander au DNS d'internet de résoudre "machine.firewall.domaine"
(ou autre), puis il va utiliser l'adresse IP numérique obtenue pour se
connecter.

Or soit l'adresse obtenue est celle de ton firewall, et donc tu n'aura pas
le moyen d'identifier l'appellé,

Soit l'adresse obtenue est différente de celle du firewall, et elle ne
sera pas routée chez toi (selon l'hypothèse 1 seule IP).

Bon, ca c'est au niveau IP (donc en ignorant les details propres à ssh).

Tu peux essayer de te placer au niveau protocole ssh.

Je ne sais pas si ssh transmet le "nom machine.nom de domaine" dans le
hand-shake initial en clair. Si oui tu peux arriver à ton but à
condition:

1) de réussir placer une entrée DNS pour
"machine_cachee.firewall.domaine" 2) d'intercepter le début de la
connexion ssh, 3) de lire le nom de machine,
4) de creer un chemin adéquat avec iptable.

je ne sais pas faire 2,3,4, mais cela est théoriquement possible.

Sinon, cela devient plus dur et moins securisé, car une fois le
handshaking passé, le reste est crypté (bien sûr). Il faudrait donc que
le firewall soit recepteur de la connexion, puis là retransmette à
"machine cachée". Je ne sais pas si c'est possible (pour scp en plus)
mais en tout cas cela va déclencher un problème de "man in the middle":
une personne mal intentionnée pourra substituer à "machine cachée" une
"machine espion" qui fera le relai pour "machine cachée" tout en
écoutant ta conversation. Tu n'y verra rien.

Un VPN peut ésoudre ton probleme en transformant ta "machine d'acces"
(celle ou tu tapes "ssh") en une machine de ton réseau local, au même
titre que "machine cachée". Mais n'oublie pas de proteger "machine
d'acces" de sa connexion internet propre par un firewall car elle est dans
ton réseu privé.

Enfin tu peux emboiter ssh dans ssh.

machine_d_acces$ ssh -N -L 22:nom_machine_cachee_vu_reseau_local:22
firewall.domaine
's password:
machine_d_acces$ ssh 127.0.0.1
machine_cachee$ exit
machine_d_acces$ scp fichier.txt :./
's password:
fichier.txt 100% 2136 193.3KB/s 00:00
machine_d_acces$

voila.
Michel.

Avatar
Julien Salgado
Remi Moyen a écrit :
Mais j'avais entendu parler d'une config qui permettrait de faire
directement un ssh machine.firewall.domaine (ou machine.domaine),
j'aimerais bien savoir si c'est faisable.


C'est de la translation, c'est à ta passerelle de le faire en utilisant
netfilter/iptables. Pour fixer les idées :
- Une passerelle dont le lien externe est en ppp0.
- Un réseau interne 10.0.0.0/8 avec des machines (pc1 avec l'IP
10.0.0.1,...)
- Un domaine mondomaine.moi pour le DNS en externe, le firewall à comme
nom fw.mondomaine.moi.
- Le firewall a un serveur ssh qui écoute sur le port 22.
- La machine pc1 a un serveur ssh qui écoute sur le port 22.

Le but du jeu est que de l'extérieur on puisse accéder à la machine pc1
et firewall en ssh. La seule adresse IP disponible de l'extérieur est
celle du firewall, il faut donc jouer sur les ports, on fait par
exemple :
port 22 du firewall ---> ssh pour le firewall
port 2201 du firewall ---> ssh pour pc1

Il faut donc faire en sorte que le flux vers le port 2201 soit renvoyé
vers pc1. [1]
iptables -t nat -A PREROUTING -i ppp0
-p tcp -m tcp --dport 2201 --DNAT 10.0.0.1:22

là le flux est envoyer vers la bonne machine, par contre il n'est pas
encore a priori autorisé à passer, il faut une règle dans la chaine
FORWARD dans la table filter. [2]
iptables -A FORWARD -i ppp0 -o eth0 -p tcp -m tcp --syn
-s $IP_GENTIL -d 10.0.0.1 --dport 10.0.0.1 -j ACCEPT
avec les règles en pour les sessions établies qui vont bien.

Maintenant on peut aller sur le firewall par :
ssh fw.mondomaine.moi
et sur le pc1 :
ssh -p 2201 fw.mondomaine.moi

C'est bien mais on peut faire mieux, pour cela il suffit de lire la page
manuel de ssh pour voir qu'il y a un fichier de configuration pour ssh
($HOME/.ssh/config par défaut) et on peut utiliser une configuration du
genre :
Host pc1
HostName fw.mondomaine.moi
Port 2201

Ainsi pour accéder au pc1, il suffit de faire :
ssh pc1


[1] Il faudrait aussi vérfier que l'IP de destination est bien celle du
firewall, mais c'est un peu long à écrire si on est en IP dynamique.
[2] Il faudrait aussi vérifier que le paquet est bien passé par la
couche de DNAT (par exemple avec le match conntrack)

--
Julien

Avatar
Remi Moyen
On Thu, 16 Oct 2003, Julien Salgado wrote:

Mais j'avais entendu parler d'une config qui permettrait de faire
directement un ssh machine.firewall.domaine (ou machine.domaine),
j'aimerais bien savoir si c'est faisable.


C'est de la translation, c'est à ta passerelle de le faire en utilisant
netfilter/iptables. Pour fixer les idées :


Oui !! C'est exactement ça que je veux faire ! Merci beaucoup pour tes
explications, qui m'ont l'air très claires. Je teste ça dès que possible,
et je reviens te poser des questions si ça marche pas.

Juste comme ça, et parce que je connais que dalle à iptables (et que, en
gros flemmard, je n'ai pas envie de me plonger dedans), une ou deux
précisions :

là le flux est envoyer vers la bonne machine, par contre il n'est pas
encore a priori autorisé à passer, il faut une règle dans la chaine
FORWARD dans la table filter. [2]
[2] Il faudrait aussi vérifier que le paquet est bien passé par la
couche de DNAT (par exemple avec le match conntrack)


Uh, là, je ne comprends pas du tout ce que tu veux dire. C'est quoi, un
match conntrack ? et la couche DNAT ? Ou, pour faire plus simple, c'est
grave si je fais pas ce test ?

iptables -A FORWARD -i ppp0 -o eth0 -p tcp -m tcp --syn
-s $IP_GENTIL -d 10.0.0.1 --dport 10.0.0.1 -j ACCEPT


$IP_GENTIL est, je suppose, l'IP de la machine exterieure depuis laquelle
je taperais mon ssh pc1 ? Je suppose qu'il y a possibilité de mettre un
joker ici, style 255.255.255.255 (vu qu'il y aura que le ssh qui passera
-- enfin, que les trucs destinés au port 22, sur lequel y'a que sshd qui
écoute --, ça me dérange pas que le monde entier puisse accéder à pc1, je
fais confiance au ssh) ?

avec les règles en pour les sessions établies qui vont bien.


?? Y manque un mot dans ta phrase. Tu voulais dire "les règles en plus" ?
Et tu sous-entend quoi ? Qu'il faut une ligne iptable pour les sessions
ssh déjà en cours ??

Encore merci pour tes explications.
--
Rémi Moyen
"Malgré les apparences, le temps est très varié à Nancy :
pluie, nuages, neige, brouillard, grêle, ..."


Avatar
Julien Salgado
Julien Salgado a écrit :
iptables -t nat -A PREROUTING -i ppp0
-p tcp -m tcp --dport 2201 --DNAT 10.0.0.1:22


Une faute frappe
iptables -t nat -A PREROUTING -i ppp0
-p tcp -m tcp --dport 2201 -j DNAT --to-destination 10.0.0.1:22

là le flux est envoyer vers la bonne machine, par contre il n'est pas
encore a priori autorisé à passer, il faut une règle dans la chaine
FORWARD dans la table filter. [2]
iptables -A FORWARD -i ppp0 -o eth0 -p tcp -m tcp --syn
-s $IP_GENTIL -d 10.0.0.1 --dport 10.0.0.1 -j ACCEPT


Et une deuxième...
iptables -A FORWARD -i ppp0 -o eth0 -p tcp -m tcp --syn
-s $IP_GENTIL -d 10.0.0.1 --dport 22 -j ACCEPT


--
Julien