Post

Yunohost ouestyan.xyz Lenovo - ThinkCentre M700 Tiny - Virtualisation QEMU/KVM + Virt manager (graphique) sur PC1 Archlinux

Yunohost ouestyan.xyz Lenovo - ThinkCentre M700 Tiny - Virtualisation QEMU/KVM + Virt manager (graphique) sur PC1 Archlinux

Qemu KVM

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

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

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

Vérifier

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

OpenSSH

**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

dns
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

letsencrypt

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

SSL
Générer Diffie-Hellman

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

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

Yarn

Mise à jour npm

1
npm install -g npm@9.2.0

Les versions

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'

Détails de la connexion qemu-kvm-lenovo
qemu-kvm-lenovo
qemu-kvm-lenovo

Les machines virtuelles
qemu-kvm-lenovo

Cet article est sous licence CC BY 4.0 par l'auteur.