Yunohost ouestyan.xyz Lenovo - ThinkCentre M700 Tiny - Virtualisation QEMU/KVM + Virt manager (graphique) sur PC1 Archlinux
Prérequis
- Poste linux avec tous les utilitaires graphiques QEMU/KVM
- Serveur Lenovo Yunohost ouestyan.xyz sur lequel les vm vont être lancées
-
A MODIFIER SUIVANT VOTRE CONFIGURATION
- Adresses IP publiques et domaines
- IP Publique Box IPV4 : 78.235.245.102
- IP Publique Box IPV6 : 2a01:e34:eebf:5663::
- Serveur hôte : ouestyan.xyz
- Virtual Machine : rnmkcy.eu
- Adresses IP publiques et domaines
KVM - Lenovo ThinkCentre M700 Tiny
KVM supporté par le CPU ?
Exécutez la commande egrep suivante pour vérifier que Intel VMX ou AMD SVM est supporté sur votre CPU
1
egrep --color 'vmx|svm' /proc/cpuinfo
vmx (Intel) ou svm (Amd) doit apparaître d’une autre couleur dans le résultat
Installer QEMU/KVM sur serveur Lenovo
- Serveur Lenovo Yunohost ouestyan.xyz - Installer QEMU KVM
- Installer QEMU/KVM via SSH sur un serveur Debian sans affichage
Si vous exécutez KVM sur un serveur de console uniquement, vous avez toujours la possibilité d’utiliser le virt-manager graphique. Il vous suffit de spécifier la méthode de communication (ssh, tls, tcp, etc.).
Comment utiliser virt-manager à partir d’un bureau client Archlinux vers un serveur debian exécutant KVM et libvirtd, la connexion étant tunnellisée sur ssh et authentifiée avec PKI.
L’affichage VNC distant de ces machines virtuelles est envoyé via ce même tunnel ssh.
En utilisant la solution de tunneling ssh décrite dans cet article, le service libvirtd côté serveur n’a pas besoin d’activer l’écoute sur TCP dans « /etc/libvirt/libvirtd.conf ».
Création machine virtuelle debianbulls
Donner les droits admin au dossier /virtuel
1
sudo chown admin:admin -R /virtuel
Résumé des commandes pour l’installation d’ume image debian bullseye cloud
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# Télécharger l’image nocloud qcow2
mkdir -p /virtuel/KVM/ && cd /virtuel/KVM/
wget https://cloud.debian.org/images/cloud/bullseye/latest/debian-11-nocloud-amd64.qcow2
# Création machine virtuelle Debian 11 (bullseyes)
export VM_NAME="debianbulls"
qemu-img convert \
-f qcow2 \
-O qcow2 \
/virtuel/KVM/debian-11-nocloud-amd64.qcow2 \
/virtuel/KVM/$VM_NAME.qcow2
# Redimensionnons à la taille souhaitée pour le disque racine.
# 20 GB de disque
export VM_ROOT_DISK_SIZE=20G
# Resize Debian 11 VM disk
qemu-img resize \
/virtuel/KVM/$VM_NAME.qcow2 \
$VM_ROOT_DISK_SIZE
#
sudo virt-install \
--memory 2048 \
--vcpus 1 \
--name $VM_NAME \
--disk /virtuel/KVM/$VM_NAME.qcow2,device=disk,bus=virtio,format=qcow2 \
--os-type Linux \
--os-variant debian10 \
--network bridge=br0,model=virtio \
--virt-type kvm \
--graphics none \
--import
A la fin de l’installation, on arrive sur le login (en mode console) : “root” sans mot de passe
Par défaut openssh ne fonctionne pas ([FAILED] Failed to start OpenBSD Secure Shell server.
)
Il faut regénérer les clés
1
dpkg-reconfigure openssh-server
Réseau
On utilise le même “NextHop” que la machine hôte lenovo
L’adresse IPV4 sera fixée à 192.168.0.136
L’adresse IPV6 sera fixée à 2a01:e34:eebf:5663::2
1
nano /etc/network/interfaces.d/staticv4v6
1
2
3
4
5
6
7
8
9
10
11
12
13
# The primary network interface
allow-hotplug enp1s0
#iface enp1s0 inet dhcp
iface enp1s0 inet static
address 192.168.0.136
netmask 255.255.255.0
gateway 192.168.0.254
# This is an autoconfigured IPv6 interface
#iface enp1s0 inet6 auto
iface enp1s0 inet6 static
address 2a01:e34:eebf:5663::2
netmask 64
post-up ip -6 route add default via fe80::8e97:eaff:fe39:66d6 dev enp1s0
Pour éviter l’erreur ICMPv6: RA: ndisc_router_discovery failed to add default route
Activer le port forwarding ipv6 net.ipv6.conf.all.forwarding=1
et désactiver l’annonce des routes (accept_ra) en ajoutant net.ipv6.conf.all.accept_ra=0
dans le fichier /etc/sysctl.conf
Mise à jour
1
apt update && apt upgrade
Redémarrer la machine virtuelle
1
systemctl reboot
Vérifier le réseau
1
ip a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:bb:92:b5 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.136/24 brd 192.168.0.255 scope global enp1s0
valid_lft forever preferred_lft forever
inet6 2a01:e34:eebf:5663::2/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:febb:92b5/64 scope link
valid_lft forever preferred_lft forever
Créer un utilisateur
1
adduser yannbulls
Vérifiez l’identité de l’utilisateur et le groupe. L’utilisateur n’est pas dans le groupe privilégié sudo.
1
id yannbulls
uid=1000(yannbulls) gid=1000(yannbulls) groups=1000(yannbulls)
Ajoutez l’utilisateur créé au groupe sudo pour les privilèges.
1
2
usermod -aG sudo yannbulls
id yannbulls
uid=1000(yannbulls) gid=1000(yannbulls) groups=1000(yannbulls),27(sudo)
Définissez le nom d’hôte de votre machine virtuelle
1
hostnamectl set-hostname rnmkcy.eu
Définir un mot de passe root
Donner les droits à yannbulls
1
echo "yannbulls ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
Installer les utilitaires curl jq figlet tmux, etc…
1
sudo apt install curl jq figlet tmux tree neofetch net-tools dnsutils # outils supplémentaires
Une bannière de connexion /etc/motd
1
2
3
4
5
6
7
8
9
10
11
12
__ __ __ __ _ _ _ _ _ _
\ \ / /| \/ | __| | ___ | |__ (_) __ _ _ _ | |__ _ _ | || | ___
\ V / | |\/| | / _` |/ -_)| '_ \| |/ _` || ' \ | '_ \| || || || |(_-<
\_/ |_| |_| \__,_|\___||_.__/|_|\__,_||_||_||_.__/ \_,_||_||_|/__/
_ ___ ___ _ __ ___ __ _ ____ __
/ |/ _ \|_ ) / | / / ( _ ) / \ / ||__ / / /
| |\_, / / / _ | |/ _ \/ _ \ _| () |_ | | |_ \/ _ \
|_| /_/ /___|(_)|_|\___/\___/(_)\__/(_)|_||___/\___/
___ __ _ _ ____ _ _ _ _ __ _ ___ __ __ ____ _ _ ___
|_ ) __ _ / \ / |(_) ___ |__ /| | |(_) ___ ___ | |__ / _|(_)| __| / / / / |__ /(_)(_)|_ )
/ / / _` || () || | _ / -_) |_ \|_ _|_ / -_)/ -_)| '_ \| _| _ |__ \/ _ \/ _ \ |_ \ _ _ / /
/___|\__,_| \__/ |_|(_)\___||___/ |_|(_)\___|\___||_.__/|_| (_)|___/\___/\___/|___/(_)(_)/___|
Synthèse
Le réseau bridge démarre automatiquement au boot de la machine ThinkCentre M700 Tiny
La machine virtuelle debianbulls est en démarrage auto ,puis lancée
Connexion SSH (avec clés) entre la machine ThinkCentre M700 Tiny et la vm debianbulls
**Lenovo ThinkCentre M700 Tiny**
Générer une paire de clé curve25519-sha256 (ECDH avec Curve25519 et SHA2) nommé vm-debianbulls pour une liaison SSH avec le serveur KVM.
1
ssh-keygen -t ed25519 -o -a 100 -f ~/.ssh/vm-debianbulls
Envoyer la clé publique sur la VM
1
ssh-copy-id -i ~/.ssh/vm-debianbulls.pub yannbulls@192.168.0.136
**VM debianbulls**
On se connecte
1
ssh yannbulls@192.168.0.136
Modifier la configuration serveur SSH
1
sudo nano /etc/ssh/sshd_config
Modifier les champs suivants
1
2
Port = 55136
PasswordAuthentication no
Relancer openSSH
1
sudo systemctl restart sshd
**Lenovo ThinkCentre M700 Tiny**
Accès depuis Lenovo ThinkCentre M700 Tiny (192.168.0.135) avec la clé privée
1
ssh -p 55136 -i ~/.ssh/vm-debianbulls yannbulls@192.168.0.136
Zone DNS OVH - domaine rnmkcy.eu
Zone DNS accessible UNIQUEMENT en IPV6
$TTL 3600
@ IN SOA dns110.ovh.net. tech.ovh.net. (2022010102 86400 3600 3600000 300)
IN NS dns110.ovh.net.
IN NS ns110.ovh.net.
IN AAAA 2a01:e34:eebf:5663::2
IN CAA 128 issue "letsencrypt.org"
* IN AAAA 2a01:e34:eebf:5663::2
Certificats Let’s Encrypt
Installation gestionnaire des certificats Let’s Encrypt
1
2
3
4
5
cd ~
sudo apt install socat git
git clone https://github.com/acmesh-official/acme.sh.git
cd acme.sh
./acme.sh --install
Se déconnecter puis se reconnecter utilisateur
Les clés OVH API
1
2
export OVH_AK="xxxxxxxxxxxxxxxxxx"
export OVH_AS="yyyyyyyyyyyyyyyyyyyyyyyyyyyy"
Génération des certificats
1
acme.sh --dns dns_ovh --server letsencrypt --issue --keylength ec-384 -d 'rnmkcy.eu' -d '*.rnmkcy.eu'
Résultat de l’installation
1
2
3
4
[Tue Jan 10 09:04:53 UTC 2023] Your cert is in: /home/yannbulls/.acme.sh/rnmkcy.eu_ecc/rnmkcy.eu.cer
[Tue Jan 10 09:04:53 UTC 2023] Your cert key is in: /home/yannbulls/.acme.sh/rnmkcy.eu_ecc/rnmkcy.eu.key
[Tue Jan 10 09:04:53 UTC 2023] The intermediate CA cert is in: /home/yannbulls/.acme.sh/rnmkcy.eu_ecc/ca.cer
[Tue Jan 10 09:04:53 UTC 2023] And the full chain certs is there: /home/yannbulls/.acme.sh/rnmkcy.eu_ecc/fullchain.cer
Installation des certificats
1
2
3
sudo mkdir -p /etc/ssl/private/
sudo chown $USER -R /etc/ssl/private/
acme.sh --ecc --install-cert -d 'rnmkcy.eu' -d '*.rnmkcy.eu' --key-file /etc/ssl/private/rnmkcy.eu-key.pem --fullchain-file /etc/ssl/private/rnmkcy.eu-fullchain.pem --reloadcmd 'sudo systemctl reload nginx.service'
Résultat
1
2
[Tue Jan 10 09:06:02 UTC 2023] Installing key to: /etc/ssl/private/rnmkcy.eu-key.pem
[Tue Jan 10 09:06:02 UTC 2023] Installing full chain to: /etc/ssl/private/rnmkcy.eu-fullchain.pem
Supprimer ` –reloadcmd ‘sudo systemctl reload nginx.service’` à la ligne précédente si Nginx n’est pas installé
Renouvellement automatique des certificats
La machine virtuelle debianbulls est hébergée par yunohost lenovo qui n’est pas en service 24h/24h.
On ne va pas utiliser le gestionnaire de tâches cron mais un service systemd utilisateur
systemd utilisateur
En cours …
cron
Editer le crontab, supprimer la ligne existante et ajouter ce qui suit
1
crontab -e
1
10 0 * * * "/home/yannbulls/.acme.sh"/acme.sh --cron --home "/home/yannbulls/.acme.sh" --renew-hook "/home/yannbulls/.acme.sh/acme.sh --ecc --install-cert -d 'rnmkcy.eu' -d '*.rnmkcy.eu' --key-file /etc/ssl/private/rnmkcy.eu-key.pem --fullchain-file /etc/ssl/private/rnmkcy.eu-fullchain.pem --reloadcmd 'sudo systemctl reload nginx.service'" > /dev/null
Nginx compilation
Utilisateur avec droits sudo
Télécharger le bash
1
2
3
wget https://static.xoyaz.xyz/files/compilation-nginx-tls1.3.sh
chmod +x compilation-nginx-tls1.3.sh # rendre le bash exécutable
./compilation-nginx-tls1.3.sh # exécution
A la fin de la compilation
1
2
3
Versions Nginx OpenSSL
nginx version: nginx/1.22.1
OpenSSL 1.1.1n 15 Mar 2022
Page accueil/ https
SSL Configuration Generator
nginx 1.22.1, modern config, OpenSSL 1.1.1n
On supprime le fichier par défaut
1
rm /etc/nginx/conf.d/default.conf
Création du dossier et fichier de configuration nginx
1
2
mkdir -p /etc/nginx/conf.d/rnmkcy.eu.d
nano /etc/nginx/conf.d/rnmkcy.eu.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# generated 2023-01-10, Mozilla Guideline v5.6, nginx 1.22.1, OpenSSL 1.1.1n, modern configuration
# https://ssl-config.mozilla.org/#server=nginx&version=1.22.1&config=modern&openssl=1.1.1n&guideline=5.6
server {
listen 80;
listen [::]:80;
server_name rnmkcy.eu;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name rnmkcy.eu;
root /var/www/default-www/ ;
location / {
index index.htm index/;
}
ssl_certificate /etc/ssl/private/rnmkcy.eu-fullchain.pem;
ssl_certificate_key /etc/ssl/private/rnmkcy.eu-key.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
ssl_session_tickets off;
# modern configuration
ssl_protocols TLSv1.3;
ssl_prefer_server_ciphers off;
# HSTS (ngx_http_headers_module is required) (63072000 seconds)
add_header Strict-Transport-Security "max-age=63072000" always;
# OCSP stapling
ssl_stapling on;
ssl_stapling_verify on;
# verify chain of trust of OCSP response using Root CA and Intermediate certs
ssl_trusted_certificate /etc/ssl/private/rnmkcy.eu-fullchain.pem;
# replace with the IP address of your resolver
resolver 1.1.1.1;
include /etc/nginx/conf.d/rnmkcy.eu.d/*.conf;
}
Vérification et rechargement nginx
1
2
nginx -t
systemctl reload nginx
Lien https://rnmkcy.eu
Diffie-Hellmann FACULTATIF
1
sudo openssl dhparam -out /etc/ssl/private/dh2048.pem -outform PEM -2 2048
Modifier le fichier de configuration /etc/nginx/conf.d/rnmkcy.eu.conf
Ajouter la ligne :
ssl_dhparam /etc/ssl/private/dh2048.pem;
Parefeu UFW
UFW, ou pare - feu simple , est une interface pour gérer les règles de pare-feu dans Arch Linux, Debian ou Ubuntu. UFW est utilisé via la ligne de commande (bien qu’il dispose d’interfaces graphiques disponibles), et vise à rendre la configuration du pare-feu facile.
Installation Debian / Ubuntu
1
sudo apt install ufw
Par défaut, les jeux de règles d’UFW sont vides, de sorte qu’il n’applique aucune règle de pare-feu, même lorsque le démon est en cours d’exécution.
Les règles
1
2
sudo ufw allow 55136/tcp # port SSH
sudo ufw allow https # port 443
Activer le parefeu
1
sudo ufw enable
1
2
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
Status
1
sudo ufw status verbose
1
2
3
4
5
6
7
8
9
10
11
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip
To Action From
-- ------ ----
55136/tcp ALLOW IN Anywhere
443 ALLOW IN Anywhere
55136/tcp (v6) ALLOW IN Anywhere (v6)
443 (v6) ALLOW IN Anywhere (v6)
Partage de dossiers/fichiers entre le l’hôte et la vm
QEMU/KVM + virtio-fs - Partager un répertoire hôte avec une machine virtuelle
Nvm Node Yarn
Archlinux Debian , installation des paquets node npm nvm yarn
Nvm
1
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash
Node LTS
1
2
nvm ls-remote --lts # liste des versions LTS
nvm install --lts # Installe la dernière version node LTS
Mise à jour npm
1
npm install -g npm@9.2.0
PC1 Archlinux
Connexion ssh entre “PC1 Archlinux” et vm “debianbulls” via bastion Lenovo ThinkCentre
Effectuer plusieurs sauts SSH avec la configuration SSH et un hôte de saut-Lien HS
Poste PC1 Archlinux –> Bastion Lenovo ThinkCentre 192.168.0.135 –> VM debianbulls 192.168.0.136
Poste client PC1 Archlinux
Il faut copier la clé privée d’accès au VM de la machine Lenovo ThinkCentre (~/.ssh/vm-debianbulls) dans le dossier ~/.ssh/ du poste PC1 Archlinux avec un autre nom ( vm-proxy-lenovo)
1
cat >> ~/.ssh/vm-proxy-lenovo
Copier/coller le contenu du fichier du fichier de clé privée (fichier ~/.ssh/vm-debianbulls de la machine ouestyan.xyz ) dans ce terminal, et presser [Ctrl]+[D] pour valider.
La connexion du poste client PC1 Archlinux vers la ** VM debianbulls** se fera via le proxy bastion Lenovo ThinkCentre ouestyan.xyz
1
2
3
4
5
---------------- ------------------ -------------------
| Poste client | | Proxy SSH | | Destinataire |
| PC1 Archlinux|<-------->| ouestyan.xyz |<--------->| vm debianbulls |
| | | | | 192.168.0.136 |
---------------- ------------------ -------------------
Syntaxe
1
ssh -o ProxyCommand="ssh -W %h:%p userprox@proxy.tld" userdest@destinataire.tld
La commande complète avec les clés
1
ssh -o ProxyCommand=ssh -W %h:%p -p 55135 -i /home/yann/.ssh/yunobulls admin@ouestyan.xyz -p 55136 -i /home/yann/.ssh/vm-proxy-lenovo yannbulls@192.168.0.136
Virtual Manager - Gestion graphique des vm
On peut utiliser la version graphique virt-manager de PC1 Archlinux pour se connecter via SSH sur la machine Lenovo et visualiser les machines virtuelles.
Gestionnaire de machines virtuelles → Fichier → Ajouter une connexion
1
virt-manager -c 'qemu+ssh://admin@192.168.0.135:55135/system?keyfile=/home/yann/.ssh/yunobulls'