Projet: Pouvoir connecter un périphérique interne à un réseau local et le rendre disponible sur internet via un serveur y étant accessible.
1.Installer les packages:
1 |
sudo apt install openssh-client sshpass |
2.Mettre en place le tunel:
1 |
sshpass -p 'votre_mot_de_passe_ssh_du_serveur_distant' ssh -C -c aes128-ctr -o StrictHostKeyChecking=no -o ConnectTimeout=10 -N -R 8073:localhost:8073 le_compte_du_serveur_distant@monserveurdistant.fr -p 2222 |
sshpass: Utilitaire permettant de faire passer un mot de passe à la commande ssh dans un script en mettant simplement un mot de passe en clair. Moins « secure » mais plus simple. Vous pourriez utilise rune clé ssh à la place.
-p ‘votre_mot_de_passe_ssh_du_serveur_distant’: Le mot de passe du compte sur le serveur distant. Il me semble plus judicieux ici de ne pas utiliser le compte et mot de passe root.ssh -C -c aes128-ctr -o StrictHostKeyChecking=no -o ConnectTimeout=10 -N -R 8073:localhost:8073 le_compte_du_serveur_distant@monserveurdistant.fr -p 2222
-C permet de compresser les données mais sans en perdre. Ceci permet de gagner quelques Mo sur une connexion 4G à data limité.
-c aes128-ctr permet de mette un cryptage moins lourds. Ceci permet également de gagner en data.
-o StrictHostKeyChecking=no : permet de s’affranchir de la vérification de la hostkey du serveur distant. juste au cas où quelque chose aurait changé côté serveur distant.
-o ConnectTimeout=10 : permet d’allonger le timeout de la connexion
-N: N’exécute aucune commande distante. Utilisé pour les transferts de ports (seulement dans la version 2 du protocole).
-R port : host : hostport
Spécifie que le port donné de la machine distante (serveur) sera transféré vers l’hôte et le port donné depuis la machine locale. Ceci fonctionne grâce à l’allocation d’une socket qui écoute sur le port port de la machine distante, et qui, dès qu’une connexion est établie sur ce port, la transfère à travers le canal sécurisé, et se connecte à host sur le port hostport depuis la machine locale. On ne peut transférer des ports privilégiés que si on se connecte en tant que root sur la machine distante. Il est possible de spécifier des adresses IPv6 à l’aide d’une autre syntaxe : N° port / N° host hostport
le_compte_du_serveur_distant@monserveurdistant.fr: compte créé spécialement sur le serveur distant afin de ne pas utiliser le root.
-p 2222: Port à connecter sur la machine distante.
3.Un script simple en cas de coupure:
1 2 3 4 5 6 7 |
#!/bin/bash while true; do sshpass -p 'votre_mot_de_passe_ssh_du_serveur_distant' ssh -C -c aes128-ctr -o StrictHostKeyChecking=no -o ConnectTimeout=10 -N -R 8073:localhost:8073 le_compte_du_serveur_distant@monserveurdistant.fr -p 2222 sleep 10 echo reconnect to monserveurdistant.fr for prot 8073 done |
4.L’installer au démarrage:
Vous pouvez voir ci-dessous un exemple du rc.local d’un raspberry pi où j’ai ajouté le chemin du script « /root/SshTunel_8073.sh ».
Petite astuce, afin d’économiser quelques mA j’ai éteint les sortie vidéo: « /usr/bin/tvservice -o ».
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. # Print the IP address _IP=$(hostname -I) || true if [ "$_IP" ]; then printf "My IP address is %s\n" "$_IP" fi /root/SshTunel_8073.sh & /usr/bin/tvservice -o exit 0 |