Accéder en SSH aux machines distantes d'un LAN
C’est malheureux, mais l’IPv4 a encore de beaux jours devant lui. Si vous avez la chance d’avoir une connexion IPv6 à la maison, vous trouverez peu d’hôtels et de points d’accès Wi-Fi publics vous offrant une adresse IPv6. Alors que faire pour accéder facilement aux machines de votre LAN depuis l’extérieur ?
Le problème est abordé ici avec la topologie réseau illustrée ci-dessous.
,--------------,
,-| machine1.lan |
| `--------------'
,------------, ,------------------, | ,--------------,
| INTERNET |---| home.exemple.org |-|-| machine2.lan |
`------------' `------------------' | `--------------'
| ,--------------,
'-| machine3.lan |
`--------------'
Notez que :
- home.exemple.org est l’entrée DNS de la gateway recevant les connexions IPv4 entrantes (cette gateway reçoit les connexions entrantes du port SSH)
- machineX.lan sont les entrées DNS locales correspondant à des adresses IPv4 privées (rien n’empêche cependant d’utiliser des addresses IPv6 locales)
Je vous propose ici 2 solutions. Si vous avez une autre solution, n’hésitez pas à la partager dans les commentaires.
1ère solution : Configurer un proxy avec son client SSH
Le client SSH permet de configurer une commande «proxy» (option ProxyCommand). Ceci permet de créer un tunnel SSH dans lequel sera transmis le flux SSH du serveur final à joindre (machineX.lan).
Chaque client peut donc être configuré avec les 2 lignes suivantes dans le fichier ~/.ssh/config du client SSH :
Host machine1.lan machine2.lan machine3.lan
ProxyCommand ssh home.exemple.org -W %h:%p
Avantages
- Simple à mettre en place
Inconvénients
- Nécessite un compte UNIX sur la gateway home.exemple.org
- Nécessite de taper 2 fois le mot de passe si vous n’utilisez pas d’authentification par clef
- L’adresse IP de connexion visible dans le journal de machineX.lan sera celle de la gateway (home.exemple.org)
2ème solution : Configurer le NAT du pare-feu (routeur, iptables ou nftables)
Cette deuxième technique demande un peu plus de connaissance puisqu’il faut jouer avec les règles de pare-feu. L’objectif est de créer une règle DNAT («Destination NAT») modifiant la destination des paquets entrants sur un certains ports (à choisir librement mais supérieurs à 1024 idéalement).
Pour cela, 3 possibilités :
- si le traffic entrant traverse un routeur commercial (ou la «box» fournie par un opérateur), il est sans doute possible de configurer une redirection de port dans son interface Web
- si la gateway utilise iptables pour d’autres tâches, il est possible de configurer un DNAT avec iptables (de nombreux tutoriaux sont disponibles sur Internet)
- si la gateway utilise nftables, je vous propose ci-dessous une configuration nftables définissant un DNAT sur une liste de ports à rediriger :
table ip nat {
map ssh_ports {
type inet_service : ipv4_addr
elements = { \
8251 : 192.168.1.11, \
8252 : 192.168.1.12, \
8253 : 192.168.1.13 \
}
}
chain prerouting {
type nat hook prerouting priority 0;
iif eth-wan dnat to tcp dport map @ssh_ports:ssh
}
}
Cette configuration permet de rediriger les connexions entrantes sur les ports 8251, 8252 et 8253 respectivement vers les adresses 192.168.1.11, 192.168.1.12 et 192.168.1.13 (correspondantes aux machineX.lan). Explications de ce code :
- On définit une structure de données ssh_ports contenant une correspondance entre ports et adresses de destination
- On définit qu’avant de router chaque paquet entrant (phase de pre-routage / prerouting) sur le port ssh, on change son port de destination si celui-ci se trouve dans ssh_ports
Ainsi, pour se connecter à machine2.lan, il faudra utiliser la commande suivante :
ssh -p 8251 home.exemple.org
Il est également possible de définir la configuration suivante dans son ~/.ssh/config :
Host machine1.lan
Hostname home.exemple.org
Port 8251
Host machine2.lan
Hostname home.exemple.org
Port 8252
Host machine3.lan
Hostname home.exemple.org
Port 8253
Pour ainsi n’avoir que la commande suivante à taper :
ssh machine1.lan
Avantages
- Ne nécessite pas de compte sur la gateway home.exemple.org
- Offre sans doute un meilleur débit pour les transferts de fichier en SFTP car pas d’encapsulation
Inconvénients
- Rend le serveur SSH des machines du LAN directement accessible depuis Internet (attention à la sécurité)
Ressources
- Manuel de ssh : http://man7.org/linux/man-pages/man1/ssh.1.html
- Manuel de ssh_config : http://man7.org/linux/man-pages/man5/ssh_config.5.html
- Page Wikipédia sur le NAT : https://fr.wikipedia.org/wiki/Network_address_translation
- Manuel de iptables : http://ipset.netfilter.org/iptables-extensions.man.html
- Wiki de nftables : https://wiki.nftables.org
⚠️ 👨🔧 - Nouveaux commentaires temporairement désactivés en raison du SPAM.
Commentaires (2)
Arkanosis
Par curiosité, qu’utilises-tu comme gateway ? Ça fait des années que j’ai un Nighthawk à flasher pour faire des trucs sexy avec comme ça, mais c’est pas user-friendly…
Albin Kauffmann
J’ai pendant longtemps utilisé OpenWrt. Je le recommande vivement. L’interface web (LuCI) est très pratique, y compris pour des règles avancées de pare-feu. Autre info intéressante, il est possible de faire du Wake-on-LAN, pratique pour démarrer une machine du LAN :-) Bref, regarde si ton matériel est supporté : https://openwrt.org/toh/start !
Récemment, j’ai passé ma gateway dans un conteneur LXC avec du Debian. C’est moins “user-friendly” mais cela m’a permis de jouer avec nftables et j’ambitionne de jouer avec l’IPv6 d’Orange.