Dans mon précédent billet, j’avais configuré un réseau sécurisé sur 2 machines virtuelles à l’aide de Nebula.
Cette fois, je tente de faire communiquer un client et un serveur MySQL à travers le tunnel Nebula.
La particularité est que je veux que le serveur et le client tournent dans des containers. En plus, je vais utiliser Podman, au lieu de Docker.
Je redémarre les machines virtuelles :
1vagrant up
Pour ne pas redémarrer Nebula à la main à chaque fois, je vais configurer systemd. Je génère un fichier de configuration pour nebula :
1cat <<EOF > nebula.service
2echo
3[Unit]
4Description=Nebula service
5[Service]
6Type=simple
7ExecStart=/opt/nebula/nebula -config /etc/nebula/config.yml
8Restart=on-failure
9[Install]
10WantedBy=multi-user.target
11EOF
Puis je le pousse sur boxA dans /tmp. J’aurai aimé le poussé directement à sa place, c’est-à-dire /etc/systemd/system mais cela nécessite des droits plus importants :
1vagrant upload nebula.service /tmp/ boxA
Une fois le ficher dans le /tmp, j’exécute une commande en élévation de privilège (sudo) sur boxA pour le placer au bon endroit :
1vagrant ssh boxA -c "sudo mv /tmp/nebula.service /etc/systemd/system/"
Enfin, j’active le service pour qu’il démarre au boot.
1vagrant ssh boxA -c "sudo systemctl enable nebula"
Du coup, même punition pour la boxB. Je recopie le fichier :
1vagrant upload nebula.service /tmp/ boxB
Puis je le place où il faut :
1vagrant ssh boxB -c "sudo mv /tmp/nebula.service /etc/systemd/system/"
Et enfin, j’active le service :
1vagrant ssh boxB -c "sudo systemctl enable nebula"
Autour de l’installation de Podman maintenant, d’abord sur boxA :
1vagrant ssh boxA -c "sudo apt install -y podman && sudo reboot"
Et ensuite sur boxB :
1vagrant ssh boxB -c "sudo apt install -y podman && sudo reboot"
Je dois redémarrer les machines après l’installation de podman car ce dernier a besoin d’une session utilisateur pour pouvoir s’exécuter en rootless, d’où le reboot en dernière commande.
Et comme Nebula a été configuré en systemd, le réseau sécurisé fonctionnera au redémarrage.
J’attends que les 2 machines soient bien relancées pour continuer. En exécutant vagrant status, je peux voir l’état des machines :
1> vagrant status
2
3Current machine states:
4
5boxA running (virtualbox)
6boxB running (virtualbox)
Je vais maintenant installer l’image de MySQL et lancer son serveur sur boxA :
1vagrant ssh boxA -c "podman run -p 192.168.168.100:3306:3306 --name=db --env MYSQL_ALLOW_EMPTY_PASSWORD='true' -dt docker.io/library/mysql"
Je décrypte cette commande :
podman run : j’utilise Podman sans sudo (c’est son énorme avantage sur Docker) pour démarrer un container avec MySQL dedans.
-p 192.168.168.100:3306:3306 : je publie sur l’IP Nebula (192.168.168.100) et le port 3306 (celui de MySQL) : c’est très important de spécifier que le serveur MySQL puisse écouter sur cette IP sinon impossible de le joindre depuis une autre machine.
–name=db : j’indique aussi un nom à ce container (db) pour le manipuler plus facilement par la suite.
–env MYSQL_ALLOW_EMPTY_PASSWORD=‘true’ : j’indique que je veux un mot de passe vide pour MySQL : je peux me le permettre car c’est juste un test. Evidemment, en production, je ne fais pas ça.
-dt docker.io/library/mysql": et enfin je spécifie l’image de MySQL à installer.
Je vérifie que le serveur est bien lancé grâce à la commande podman ps :
1> vagrant ssh boxA -c "podman ps"
2
3CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4d6c2625aafb4 docker.io/library/mysql mysqld 30 seconds ago Up 30 seconds ago 192.168.168.100:3306->3306/tcp db
Ça fonctionne !
Il reste à tester que je peux m’y connecter depuis boxB. J’utilise une commande podman similaire au serveur MySQL plys haut, mais cette fois, j’exécute le client MySQL en précisant l’emplacement du serveur, à travers le tunnel Nebula.
Si tout fonctionne, je devrais avoir le prompt de MySQL :
1> vagrant ssh boxB -c "podman run -ti --rm docker.io/library/mysql mysql -h192.168.168.100 -uroot"
2Welcome to the MySQL monitor. Commands end with ; or \g.
3Your MySQL connection id is 9
4Server version: 8.0.29 MySQL Community Server - GPL
5
6Copyright (c) 2000, 2022, Oracle and/or its affiliates.
7
8Oracle is a registered trademark of Oracle Corporation and/or its
9affiliates. Other names may be trademarks of their respective
10owners.
11
12Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
13
14mysql> show databases;
15+--------------------+
16| Database |
17+--------------------+
18| information_schema |
19| mysql |
20| performance_schema |
21| sys |
22+--------------------+
234 rows in set (0.01 sec)
24
25mysql>
Hourra!