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 :
vagrant 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 :
cat <<EOF > nebula.service
echo
[Unit]
Description=Nebula service
[Service]
Type=simple
ExecStart=/opt/nebula/nebula -config /etc/nebula/config.yml
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
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 :
vagrant 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 :
vagrant ssh boxA -c "sudo mv /tmp/nebula.service /etc/systemd/system/"
Enfin, j’active le service pour qu’il démarre au boot.
vagrant ssh boxA -c "sudo systemctl enable nebula"
Du coup, même punition pour la boxB. Je recopie le fichier :
vagrant upload nebula.service /tmp/ boxB
Puis je le place où il faut :
vagrant ssh boxB -c "sudo mv /tmp/nebula.service /etc/systemd/system/"
Et enfin, j’active le service :
vagrant ssh boxB -c "sudo systemctl enable nebula"
Autour de l’installation de Podman maintenant, d’abord sur boxA :
vagrant ssh boxA -c "sudo apt install -y podman && sudo reboot"
Et ensuite sur boxB :
vagrant 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 :
> vagrant status
Current machine states:
boxA running (virtualbox)
boxB running (virtualbox)
Je vais maintenant installer l’image de MySQL et lancer son serveur sur boxA :
vagrant 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 :
> vagrant ssh boxA -c "podman ps"
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d6c2625aafb4 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 :
> vagrant ssh boxB -c "podman run -ti --rm docker.io/library/mysql mysql -h192.168.168.100 -uroot"
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.29 MySQL Community Server - GPL
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)
mysql>
Hourra!