« FAQ:Tunneling ssh » : différence entre les versions

De WikiFr_dbSQWare
Aller à la navigation Aller à la recherche
Aucun résumé des modifications
Aucun résumé des modifications
Ligne 81 : Ligne 81 :
A partir de là, toutes les connexions ssh/rsync de srvdbsqware04 vers rb_07_08 iront toucher srvdbsqware08 en passant par srvdbsqware07.<br>
A partir de là, toutes les connexions ssh/rsync de srvdbsqware04 vers rb_07_08 iront toucher srvdbsqware08 en passant par srvdbsqware07.<br>
Attention, le tunnel doit rester ouvert pour cela, pensez à les recréer quand vous redémarrez une ou l'autre des 3 machines !
Attention, le tunnel doit rester ouvert pour cela, pensez à les recréer quand vous redémarrez une ou l'autre des 3 machines !
===Tunnel ssh pour toucher un MySQL qui n'écoute qu'en localhost===
Attention :
# localhost != 127.0.0.1 pour MySQL/MariaDB.
# localhost => socket, pas TCP.
# un tunnel SSH expose toujours le port en local via 127.0.0.1 (pas via la socket).
# donc si tu veux utiliser un tunnel : tu as besoin du user @127.0.0.1 !
Si tu ne fais pas ça, ton tunnel fonctionne, mais ton accès est refusé => classique.
<syntaxhighlight lang="sql" line>
CREATE USER 'local_user'@'127.0.0.1' IDENTIFIED BY 'local_passwd';
GRANT ALL PRIVILEGES ON *.* TO 'local_user'@'127.0.0.1';
FLUSH PRIVILEGES;
</syntaxhighlight>
<syntaxhighlight lang="sh" line>
## Ouverture du tunnel -L pour le port local, -N pour ne pas executer de commande (pas de shell), -f pour l'envoyer en tache de fond
## Ouverture du tunnel port 33007 sur srvdbsqware04 vers srvdbsqware07 qui forward vers localhost port 3306
ssh -f -N -L 33008:localhost:3306 dbsqware@srvdbsqware07
</syntaxhighlight>
<syntaxhighlight lang="sh" line>
# Test connexion
mysql -u local_user -h localhost -P 33008 -plocal_passwd <<EOFSQL
show variables like 'hostname';
EOFSQL
</syntaxhighlight>
<pre>
Variable_name  Value
hostname        srvdbsqware07
</pre>

Version du 30 novembre 2025 à 17:10

Explications

Lors du paramétrage d'une nouvelle instance, il faut un accès ssh et/ou SQL.
Parfois l'accès direct n'est pas possible et il nous faudra passer par un serveur de "rebond".
On passera donc par du tunneling ssh ...
Nous allons voir plusieurs cas possibles :

  1. Accès ssh depuis un premier serveur vers un troisième, en passant par un second de manière transparente
  2. Accès SQL "distant" à une instance MySQL qui n'écoute que sur localhost de sa machine
  3. Accès SQL "distant" à une instance MsSql en passant par une machine de rebond

Tests cases

Rebond ssh srvdbsqware04 => srvdbsqware07 => srvdbsqware08

## Ouverture du tunnel -L pour le port local, -N pour ne pas executer de commande (pas de shell), -f pour l'envoyer en tache de fond
## Ouverture du tunnel port 22008 sur srvdbsqware04 vers srvdbsqware07 qui forward vers srvdbsqware08 port 22

# dbsqware@srvdbsqware04
ssh -f -N -L 22008:srvdbsqware08:22 dbsqware@srvdbsqware07

Test "Local" en forçant le port 22008 pour voir si on arrive bien sur le 08

## dbsqware@srvdbsqware04
ssh -p 22008 mysql@localhost <<EOFSSH
id
uname -a
EOFSSH
uid=1004(mysql) gid=985(mysql) groups=985(mysql),1000(dba)
Linux srvdbsqware08 5.14.0-427.20.1.el9_4.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Jun 7 14:51:39 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

Vous remarquerez que l'on arrive bien sur le serveur avec le user mysql alors que l'on passe par le serveur srvdbsqware0è avec le user dbsqware.

On va déclarer un alias qui pointe sur localhost de manière transparente :

# sudo vi /etc/hosts
127.0.0.1   localhost rb_07_08

Test de connexion en passant par l'alias "rb_07_08" :

## dbsqware@srvdbsqware04
ssh -p 22008 mysql@rb_07_08 <<EOFSSH
id
uname -a
EOFSSH
uid=1004(mysql) gid=985(mysql) groups=985(mysql),1000(dba)
Linux srvdbsqware08 5.14.0-427.20.1.el9_4.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Jun 7 14:51:39 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

Enfin, on va paramétrer la config ssh pour passer par le port 22008 quand on veut attaquer rb_07_08 :

vi ~/.ssh/config
# Rebond ssh 07 => 08
Host rb_07_08
  port 22008

Test de connexion en passant par l'alias "rb_07_08" sans forcer le port :

## dbsqware@srvdbsqware04
ssh mysql@rb_07_08 <<EOFSSH
id
uname -a
EOFSSH
uid=1004(mysql) gid=985(mysql) groups=985(mysql),1000(dba)
Linux srvdbsqware08 5.14.0-427.20.1.el9_4.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Jun 7 14:51:39 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

A partir de là, toutes les connexions ssh/rsync de srvdbsqware04 vers rb_07_08 iront toucher srvdbsqware08 en passant par srvdbsqware07.
Attention, le tunnel doit rester ouvert pour cela, pensez à les recréer quand vous redémarrez une ou l'autre des 3 machines !

Tunnel ssh pour toucher un MySQL qui n'écoute qu'en localhost

Attention :

  1. localhost != 127.0.0.1 pour MySQL/MariaDB.
  2. localhost => socket, pas TCP.
  3. un tunnel SSH expose toujours le port en local via 127.0.0.1 (pas via la socket).
  4. donc si tu veux utiliser un tunnel : tu as besoin du user @127.0.0.1 !

Si tu ne fais pas ça, ton tunnel fonctionne, mais ton accès est refusé => classique.

CREATE USER 'local_user'@'127.0.0.1' IDENTIFIED BY 'local_passwd';
GRANT ALL PRIVILEGES ON *.* TO 'local_user'@'127.0.0.1';
FLUSH PRIVILEGES;
## Ouverture du tunnel -L pour le port local, -N pour ne pas executer de commande (pas de shell), -f pour l'envoyer en tache de fond
## Ouverture du tunnel port 33007 sur srvdbsqware04 vers srvdbsqware07 qui forward vers localhost port 3306

ssh -f -N -L 33008:localhost:3306 dbsqware@srvdbsqware07
# Test connexion
mysql -u local_user -h localhost -P 33008 -plocal_passwd <<EOFSQL
show variables like 'hostname';
EOFSQL
Variable_name   Value
hostname        srvdbsqware07