Reverse tunneling pour The Brain : Différence entre versions
(Page créée avec « # Reverse tunneling Pour rendre accessible par Internet un ordinateur qui se trouve au sein d'un réseau local, derrière un ou plusieur(s) routeur(s) sur le(s)quel(s) on... ») |
(→Configuration de la connexion entre le rpi et le serveur) |
||
(3 révisions intermédiaires par le même utilisateur non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
− | + | = Reverse tunneling = | |
+ | |||
Pour rendre accessible par Internet un ordinateur qui se trouve au sein d'un réseau local, derrière un ou plusieur(s) routeur(s) sur le(s)quel(s) on ne peut intervenir, il existe deux solutions: | Pour rendre accessible par Internet un ordinateur qui se trouve au sein d'un réseau local, derrière un ou plusieur(s) routeur(s) sur le(s)quel(s) on ne peut intervenir, il existe deux solutions: | ||
* soit passer par un serveur VPN | * soit passer par un serveur VPN | ||
Ligne 10 : | Ligne 11 : | ||
− | + | = Procedure reverse tunneling par SSH = | |
− | + | == Configuration de la connexion entre le rpi et le serveur == | |
− | + | Dans la procédure ci-dessous, on va considérer que le nom d'utilisateurice du rpi est "username" et que le compte utilisateurice sur le serveur qui servira pour la connexion aura le même nom. Il faut donc remplacer dans toutes les commandes "username" par le nom d'utilisateurice du rpi. | |
− | + | Le nom du serveur qui servira de relai au tunnel ssh a comme adresse "serveraddress.com". Il est également à remplacer par l'adresse réelle du serveur. | |
+ | |||
+ | Le port choisi sur le serveur dans cet exemple est quant à lui fixé à 10102 (pour l'accès ssh). Il peut être différent. Par convention, les ports en dessous de 1000 sont réservés à des services (des programmes) "connus". On peut choisir n'importe quel port entre 1000 et 65535 (max de 16 bits) du moment qu'il n'est pas déjà utilisé. | ||
+ | |||
+ | === Générer un couple clé publique / privée sur le rpi === | ||
+ | |||
+ | <syntaxhighlight lang="bash"> | ||
#sur le rpi | #sur le rpi | ||
ssh-keygen -t ed25519 -C "le nom du rpi" | ssh-keygen -t ed25519 -C "le nom du rpi" | ||
− | + | </syntaxhighlight> | |
− | + | === Afficher et copier la clé publique générée === | |
− | + | <syntaxhighlight lang="bash"> | |
#sur le rpi | #sur le rpi | ||
cat /home/username/.ssh/id_ed25519.pub | cat /home/username/.ssh/id_ed25519.pub | ||
#puis copier le résultat de la commande | #puis copier le résultat de la commande | ||
− | + | </syntaxhighlight> | |
− | + | === Créer un compte utilisateurice sur le serveur === | |
− | + | <syntaxhighlight lang="bash"> | |
#sur le serveur: | #sur le serveur: | ||
sudo useradd username -m | sudo useradd username -m | ||
− | + | </syntaxhighlight> | |
+ | === Ajouter la clé publique sur le serveur === | ||
− | + | <syntaxhighlight lang="bash"> | |
− | |||
− | |||
#sur le serveur: | #sur le serveur: | ||
mkdir /home/username/.ssh | mkdir /home/username/.ssh | ||
nano /home/username/.ssh/authorized_keys | nano /home/username/.ssh/authorized_keys | ||
#et coller le contenu de la clé publique du rpi dans ce nouveau fichier | #et coller le contenu de la clé publique du rpi dans ce nouveau fichier | ||
− | + | </syntaxhighlight> | |
− | + | === Tester la connexion entre le rpi et le serveur === | |
− | + | <syntaxhighlight lang="bash"> | |
#sur le rpi: | #sur le rpi: | ||
ssh username@serveraddress.com | ssh username@serveraddress.com | ||
− | + | </syntaxhighlight> | |
− | + | === Tester la connexion entre le serveur et le rpi === | |
− | + | <syntaxhighlight lang="bash"> | |
#sur le rpi: | #sur le rpi: | ||
ssh -Nv -R 10102:localhost:22 username@serveraddress.com | ssh -Nv -R 10102:localhost:22 username@serveraddress.com | ||
− | + | </syntaxhighlight> | |
Et tout en laissant ouvert la session sur le RPI, dans un autre terminal: | Et tout en laissant ouvert la session sur le RPI, dans un autre terminal: | ||
− | + | <syntaxhighlight lang="bash"> | |
#sur le serveur: | #sur le serveur: | ||
ssh -p 10102 username@localhost | ssh -p 10102 username@localhost | ||
− | + | </syntaxhighlight> | |
− | + | === Tester la connection vers le rpi à travers le serveur === | |
− | + | <syntaxhighlight lang="bash"> | |
#sur un ordinateur connecté à Internet | #sur un ordinateur connecté à Internet | ||
ssh -p 10102 username@serveraddress.com | ssh -p 10102 username@serveraddress.com | ||
− | + | </syntaxhighlight> | |
− | + | == Automatiser la connexion avec auto-ssh == | |
− | + | === Installer auto-ssh sur le rpi === | |
− | + | <syntaxhighlight lang="bash"> | |
#sur le rpi: | #sur le rpi: | ||
sudo apt install auto-ssh | sudo apt install auto-ssh | ||
− | + | </syntaxhighlight> | |
− | + | === Créer un fichier de configuration pour auto-ssh === | |
− | + | <syntaxhighlight lang="bash"> | |
#sur le rpi: | #sur le rpi: | ||
sudo nano /etc/default/autossh | sudo nano /etc/default/autossh | ||
− | + | </syntaxhighlight> | |
Et coller: | Et coller: | ||
− | + | <syntaxhighlight lang="bash"> | |
AUTOSSH_POLL=60 | AUTOSSH_POLL=60 | ||
AUTOSSH_FIRST_POLL=30 | AUTOSSH_FIRST_POLL=30 | ||
Ligne 97 : | Ligne 103 : | ||
AUTOSSH_PORT=22000 | AUTOSSH_PORT=22000 | ||
SSH_OPTIONS="-N -R 10102:localhost:22 username@serveraddress.com" | SSH_OPTIONS="-N -R 10102:localhost:22 username@serveraddress.com" | ||
− | + | </syntaxhighlight> | |
Ici, le port 10102 du serveur redirige vers le port 22 du rpi. Si l'on veut appliquer le tunnel sur d'autres ports (pour rendre accessible d'autres ports du rpi, il faut compléter la dernière ligne en ajoutant, pour chaque port: -R portdistant:localhost:portlocal). Par exemple, pour rendre accessible le port 9001 du rpi via le port 10103 du serveur, la ligne deviendrait: | Ici, le port 10102 du serveur redirige vers le port 22 du rpi. Si l'on veut appliquer le tunnel sur d'autres ports (pour rendre accessible d'autres ports du rpi, il faut compléter la dernière ligne en ajoutant, pour chaque port: -R portdistant:localhost:portlocal). Par exemple, pour rendre accessible le port 9001 du rpi via le port 10103 du serveur, la ligne deviendrait: | ||
− | + | <syntaxhighlight lang="bash"> | |
SSH_OPTIONS="-N -R 10102:localhost:22 -R 10103:localhost:9001 username@serveraddress.com" | SSH_OPTIONS="-N -R 10102:localhost:22 -R 10103:localhost:9001 username@serveraddress.com" | ||
− | + | </syntaxhighlight> | |
− | + | === Créer un fichier qui automatisera le lancement d'auto-ssh (avec systemd) === | |
− | + | <syntaxhighlight lang="bash"> | |
− | |||
sudo nano /lib/systemd/system/autossh.service | sudo nano /lib/systemd/system/autossh.service | ||
− | + | </syntaxhighlight> | |
Et coller: | Et coller: | ||
− | + | ||
+ | <syntaxhighlight lang="bash"> | ||
[Unit] | [Unit] | ||
Description=autossh | Description=autossh | ||
Ligne 128 : | Ligne 134 : | ||
[Install] | [Install] | ||
WantedBy=multi-user.target | WantedBy=multi-user.target | ||
− | + | </syntaxhighlight> | |
− | + | === Créer un raccourci vers le fichier pour que systemd le prenne en compte === | |
− | + | <syntaxhighlight lang="bash"> | |
sudo ln -s /lib/systemd/system/autossh.service /etc/systemd/system/autossh.service | sudo ln -s /lib/systemd/system/autossh.service /etc/systemd/system/autossh.service | ||
− | + | </syntaxhighlight> | |
− | + | === Lancer le service === | |
− | + | <syntaxhighlight lang="bash"> | |
sudo systemctl daemon-reload | sudo systemctl daemon-reload | ||
sudo systemctl start autossh | sudo systemctl start autossh | ||
− | + | </syntaxhighlight> | |
− | |||
− | |||
− | + | === Activer le service pour qu'il se lance au démarrage: === | |
+ | <syntaxhighlight lang="bash"> | ||
sudo systemctl enable autossh | sudo systemctl enable autossh | ||
− | + | </syntaxhighlight> | |
− | + | = References = | |
https://goteleport.com/blog/ssh-tunneling-explained/ | https://goteleport.com/blog/ssh-tunneling-explained/ | ||
+ | |||
https://www.jeffgeerling.com/blog/2022/ssh-and-http-raspberry-pi-behind-cg-nat | https://www.jeffgeerling.com/blog/2022/ssh-and-http-raspberry-pi-behind-cg-nat |
Version actuelle datée du 9 décembre 2022 à 11:35
Sommaire
- 1 Reverse tunneling
- 2 Procedure reverse tunneling par SSH
- 2.1 Configuration de la connexion entre le rpi et le serveur
- 2.1.1 Générer un couple clé publique / privée sur le rpi
- 2.1.2 Afficher et copier la clé publique générée
- 2.1.3 Créer un compte utilisateurice sur le serveur
- 2.1.4 Ajouter la clé publique sur le serveur
- 2.1.5 Tester la connexion entre le rpi et le serveur
- 2.1.6 Tester la connexion entre le serveur et le rpi
- 2.1.7 Tester la connection vers le rpi à travers le serveur
- 2.2 Automatiser la connexion avec auto-ssh
- 2.2.1 Installer auto-ssh sur le rpi
- 2.2.2 Créer un fichier de configuration pour auto-ssh
- 2.2.3 Créer un fichier qui automatisera le lancement d'auto-ssh (avec systemd)
- 2.2.4 Créer un raccourci vers le fichier pour que systemd le prenne en compte
- 2.2.5 Lancer le service
- 2.2.6 Activer le service pour qu'il se lance au démarrage:
- 2.1 Configuration de la connexion entre le rpi et le serveur
- 3 References
Reverse tunneling
Pour rendre accessible par Internet un ordinateur qui se trouve au sein d'un réseau local, derrière un ou plusieur(s) routeur(s) sur le(s)quel(s) on ne peut intervenir, il existe deux solutions:
- soit passer par un serveur VPN
- soit passer par un serveur SSH
Il faut donc, quelle que soit la solution choisie, disposer d'une machine connectée à Internet et accessible par une adresse IP fixe et/ou un nom de domaine (serveur dédié ou VPS).
La solution choisie dépend de l'usage : les deux permettent de se connecter à l'ordinateur local *via* l'ordinateur connecté. S'il est nécessaire de rendre public (accessible donc pour des visiteureuses) un élément provenant de l'ordinateur local (par exemple un site web servi par un serveur web Apache), on optera pour un tunnel SSH qui permettra de rediriger la requête reçue par l'ordinateur connecté vers l'ordinateur local. S'il est plutôt question d'un réseau privé dont les services (partage de documents, serveur web, etc.) ne doivent pas être mis à disposition d'un plus large public, on optera pour le VPN. L'usage d'un VPN est toujours lié au fait d'établir des communications *privées* entre plusieurs ordinateurs qui ne sont pas connectés au sein du même réseau local mais qui peuvent se connecter entre eux via Internet.
Procedure reverse tunneling par SSH
Configuration de la connexion entre le rpi et le serveur
Dans la procédure ci-dessous, on va considérer que le nom d'utilisateurice du rpi est "username" et que le compte utilisateurice sur le serveur qui servira pour la connexion aura le même nom. Il faut donc remplacer dans toutes les commandes "username" par le nom d'utilisateurice du rpi.
Le nom du serveur qui servira de relai au tunnel ssh a comme adresse "serveraddress.com". Il est également à remplacer par l'adresse réelle du serveur.
Le port choisi sur le serveur dans cet exemple est quant à lui fixé à 10102 (pour l'accès ssh). Il peut être différent. Par convention, les ports en dessous de 1000 sont réservés à des services (des programmes) "connus". On peut choisir n'importe quel port entre 1000 et 65535 (max de 16 bits) du moment qu'il n'est pas déjà utilisé.
Générer un couple clé publique / privée sur le rpi
#sur le rpi
ssh-keygen -t ed25519 -C "le nom du rpi"
Afficher et copier la clé publique générée
#sur le rpi
cat /home/username/.ssh/id_ed25519.pub
#puis copier le résultat de la commande
Créer un compte utilisateurice sur le serveur
#sur le serveur:
sudo useradd username -m
Ajouter la clé publique sur le serveur
#sur le serveur:
mkdir /home/username/.ssh
nano /home/username/.ssh/authorized_keys
#et coller le contenu de la clé publique du rpi dans ce nouveau fichier
Tester la connexion entre le rpi et le serveur
#sur le rpi:
ssh username@serveraddress.com
Tester la connexion entre le serveur et le rpi
#sur le rpi:
ssh -Nv -R 10102:localhost:22 username@serveraddress.com
Et tout en laissant ouvert la session sur le RPI, dans un autre terminal:
#sur le serveur:
ssh -p 10102 username@localhost
Tester la connection vers le rpi à travers le serveur
#sur un ordinateur connecté à Internet
ssh -p 10102 username@serveraddress.com
Automatiser la connexion avec auto-ssh
Installer auto-ssh sur le rpi
#sur le rpi:
sudo apt install auto-ssh
Créer un fichier de configuration pour auto-ssh
#sur le rpi:
sudo nano /etc/default/autossh
Et coller:
AUTOSSH_POLL=60
AUTOSSH_FIRST_POLL=30
AUTOSSH_GATETIME=0
AUTOSSH_PORT=22000
SSH_OPTIONS="-N -R 10102:localhost:22 username@serveraddress.com"
Ici, le port 10102 du serveur redirige vers le port 22 du rpi. Si l'on veut appliquer le tunnel sur d'autres ports (pour rendre accessible d'autres ports du rpi, il faut compléter la dernière ligne en ajoutant, pour chaque port: -R portdistant:localhost:portlocal). Par exemple, pour rendre accessible le port 9001 du rpi via le port 10103 du serveur, la ligne deviendrait:
SSH_OPTIONS="-N -R 10102:localhost:22 -R 10103:localhost:9001 username@serveraddress.com"
Créer un fichier qui automatisera le lancement d'auto-ssh (avec systemd)
sudo nano /lib/systemd/system/autossh.service
Et coller:
[Unit]
Description=autossh
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=username
EnvironmentFile=/etc/default/autossh
ExecStart=/usr/bin/autossh $SSH_OPTIONS
Restart=always
RestartSec=60
[Install]
WantedBy=multi-user.target
Créer un raccourci vers le fichier pour que systemd le prenne en compte
sudo ln -s /lib/systemd/system/autossh.service /etc/systemd/system/autossh.service
Lancer le service
sudo systemctl daemon-reload
sudo systemctl start autossh
Activer le service pour qu'il se lance au démarrage:
sudo systemctl enable autossh
References
https://goteleport.com/blog/ssh-tunneling-explained/
https://www.jeffgeerling.com/blog/2022/ssh-and-http-raspberry-pi-behind-cg-nat