FAQ:Tunneling ssh
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 :
- Accès ssh depuis un premier serveur vers un troisième, en passant par un second de manière transparente
- Accès SQL "distant" à une instance MySQL qui n'écoute que sur localhost de sa machine
- 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 :
- 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.
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 33007:localhost:3306 dbsqware@srvdbsqware07
# Test connexion
mysql -u local_user -h localhost -P 33007 -plocal_passwd <<EOFSQL
show variables like 'hostname';
EOFSQL
Variable_name Value hostname srvdbsqware07
Tunnel ssh pour toucher un MsSql qui n'est accessible que depuis une machine de rebond
Configuration initiale du freetds.conf :
[SRVDBMSQ07_MSQ_2022] host = srvdbmsq07 port = 1433
Test de connexion :
tis SRVDBMSQ07_MSQ_2022 <<EOFSQL
select @@servername
go
EOFSQL
Sourcing .profile for SRVDBMSQ07_MSQ_2022 ... Case of encrypted file (tools/sqwmsq_SetEnv.ksh) ... Connection to instance SRVDBMSQ07_MSQ_2022 : login DEV-ENV\svc-mssql ... locale is "en_US.UTF-8" locale charset is "UTF-8" using default charset "UTF-8" 1> 2> srvdbmsq07 (1 row affected) 1>
On voit que l'on passe par un fichier chiffré et par une authentification type Windows ...
## 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 14336 sur srvdbsqware04 vers srvdbsqware06 qui forward vers srvdbmsq07 port 1433
ssh -f -N -L 14336:srvdbmsq07:1433 dbsqware@srvdbsqware06
Nouvelle configuration du freetds.conf pour passer par le tunnel :
[SRVDBMSQ07_MSQ_2022] host = localhost port = 14336
Test de connexion :
tis SRVDBMSQ07_MSQ_2022 <<EOFSQL
select @@servername
go
EOFSQL
Sourcing .profile for SRVDBMSQ07_MSQ_2022 ... Case of encrypted file (tools/sqwmsq_SetEnv.ksh) ... Connection to instance SRVDBMSQ07_MSQ_2022 : login DEV-ENV\svc-mssql ... locale is "en_US.UTF-8" locale charset is "UTF-8" using default charset "UTF-8" 1> 2> srvdbmsq07 (1 row affected) 1>